diff options
author | Chris Robinson <[email protected]> | 2018-11-27 13:41:30 -0800 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2018-11-27 13:41:30 -0800 |
commit | f26083e9edc6491f553aae951886d89b70288528 (patch) | |
tree | 1bb2b82ec786cbe2a98a3a5066c0be7c52dff1d1 /common | |
parent | 3f745be1dc4df7ffeec89f1d90af41e139fb49db (diff) |
Make and use a semaphore class
Diffstat (limited to 'common')
-rw-r--r-- | common/threads.cpp | 50 | ||||
-rw-r--r-- | common/threads.h | 20 |
2 files changed, 51 insertions, 19 deletions
diff --git a/common/threads.cpp b/common/threads.cpp index b4f471d7..c9478871 100644 --- a/common/threads.cpp +++ b/common/threads.cpp @@ -22,25 +22,7 @@ #include "threads.h" -#include <stdlib.h> -#include <string.h> -#include <errno.h> - - -#ifndef UNUSED -#if defined(__cplusplus) -#define UNUSED(x) -#elif defined(__GNUC__) -#define UNUSED(x) UNUSED_##x __attribute__((unused)) -#elif defined(__LCLINT__) -#define UNUSED(x) /*@unused@*/ x -#else -#define UNUSED(x) x -#endif -#endif - - -#define THREAD_STACK_SIZE (2*1024*1024) /* 2MB */ +#include <system_error> #ifdef _WIN32 @@ -116,6 +98,7 @@ int alsem_trywait(alsem_t *sem) #include <sys/time.h> #include <unistd.h> +#include <errno.h> #include <pthread.h> #ifdef HAVE_PTHREAD_NP_H #include <pthread_np.h> @@ -210,3 +193,32 @@ int alsem_trywait(alsem_t *sem) #endif /* __APPLE__ */ #endif + + +namespace al { + +semaphore::semaphore(unsigned int initial) +{ + if(alsem_init(&mSem, initial) != althrd_success) + throw std::system_error(std::make_error_code(std::errc::resource_unavailable_try_again)); +} + +semaphore::~semaphore() +{ alsem_destroy(&mSem); } + +void semaphore::post() +{ + if(alsem_post(&mSem) != althrd_success) + throw std::system_error(std::make_error_code(std::errc::value_too_large)); +} + +void semaphore::wait() noexcept +{ + while(alsem_wait(&mSem) == -2) { + } +} + +int semaphore::trywait() noexcept +{ return alsem_wait(&mSem) == althrd_success; } + +} // namespace al diff --git a/common/threads.h b/common/threads.h index a357b494..03a3899c 100644 --- a/common/threads.h +++ b/common/threads.h @@ -63,6 +63,26 @@ int alsem_trywait(alsem_t *sem); #ifdef __cplusplus } // extern "C" + +namespace al { + +class semaphore { + alsem_t mSem; + +public: + semaphore(unsigned int initial=0); + semaphore(const semaphore&) = delete; + ~semaphore(); + + semaphore& operator=(const semaphore&) = delete; + + void post(); + void wait() noexcept; + int trywait() noexcept; +}; + +} // namespace al + #endif #endif /* AL_THREADS_H */ |