summaryrefslogtreecommitdiff
path: root/src/threading/event.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/threading/event.h')
-rw-r--r--src/threading/event.h38
1 files changed, 25 insertions, 13 deletions
diff --git a/src/threading/event.h b/src/threading/event.h
index 0105630e5..ea087e53f 100644
--- a/src/threading/event.h
+++ b/src/threading/event.h
@@ -26,30 +26,42 @@ DEALINGS IN THE SOFTWARE.
#ifndef THREADING_EVENT_H
#define THREADING_EVENT_H
-#ifdef _WIN32
- #include <windows.h>
+#if __cplusplus >= 201103L
+ #include <condition_variable>
+ #include "threading/mutex.h"
+#elif defined(_WIN32)
+ #include <windef.h>
#else
- #include "threading/semaphore.h"
+ #include <pthread.h>
#endif
+/** A syncronization primitive that will wake up one waiting thread when signaled.
+ * Calling @c signal() multiple times before a waiting thread has had a chance
+ * to notice the signal will wake only one thread. Additionally, if no threads
+ * are waiting on the event when it is signaled, the next call to @c wait()
+ * will return (almost) immediately.
+ */
class Event {
public:
-#ifdef _WIN32
- Event() { event = CreateEvent(NULL, false, false, NULL); }
- ~Event() { CloseHandle(event); }
- void wait() { WaitForSingleObject(event, INFINITE); }
- void signal() { SetEvent(event); }
-#else
- void wait() { sem.wait(); }
- void signal() { sem.post(); }
+#if __cplusplus < 201103L
+ Event();
+ ~Event();
#endif
+ void wait();
+ void signal();
private:
-#ifdef _WIN32
+#if __cplusplus >= 201103L
+ std::condition_variable cv;
+ Mutex mutex;
+ bool notified;
+#elif defined(_WIN32)
HANDLE event;
#else
- Semaphore sem;
+ pthread_cond_t cv;
+ pthread_mutex_t mutex;
+ bool notified;
#endif
};