diff options
Diffstat (limited to 'common/alsem.h')
-rw-r--r-- | common/alsem.h | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/common/alsem.h b/common/alsem.h new file mode 100644 index 00000000..9f72d1c6 --- /dev/null +++ b/common/alsem.h @@ -0,0 +1,43 @@ +#ifndef COMMON_ALSEM_H +#define COMMON_ALSEM_H + +#if defined(__APPLE__) +#include <AvailabilityMacros.h> +#include <TargetConditionals.h> +#if (((MAC_OS_X_VERSION_MIN_REQUIRED > 1050) && !defined(__ppc__)) || TARGET_OS_IOS || TARGET_OS_TV) +#include <dispatch/dispatch.h> +#define AL_APPLE_HAVE_DISPATCH 1 +#else +#include <semaphore.h> /* Fallback option for Apple without a working libdispatch */ +#endif +#elif !defined(_WIN32) +#include <semaphore.h> +#endif + +namespace al { + +class semaphore { +#ifdef _WIN32 + using native_type = void*; +#elif defined(AL_APPLE_HAVE_DISPATCH) + using native_type = dispatch_semaphore_t; +#else + using native_type = sem_t; +#endif + native_type mSem; + +public: + semaphore(unsigned int initial=0); + semaphore(const semaphore&) = delete; + ~semaphore(); + + semaphore& operator=(const semaphore&) = delete; + + void post(); + void wait() noexcept; + bool try_wait() noexcept; +}; + +} // namespace al + +#endif /* COMMON_ALSEM_H */ |