aboutsummaryrefslogtreecommitdiff
path: root/src/threading/event.h
diff options
context:
space:
mode:
authorShadowNinja <shadowninja@minetest.net>2015-11-29 00:17:51 -0500
committerShadowNinja <shadowninja@minetest.net>2015-12-07 13:53:56 -0500
commit696148e29889b2923f926b27f76979454676506d (patch)
treecad2d63201dd7242794575327da22a795a083afe /src/threading/event.h
parentea2964f5a168cb52d1b9f74a08f00c7c068c6649 (diff)
downloadminetest-696148e29889b2923f926b27f76979454676506d.tar.gz
minetest-696148e29889b2923f926b27f76979454676506d.tar.bz2
minetest-696148e29889b2923f926b27f76979454676506d.zip
Fix Event implementation
On non-windows platforms this just used a semaphore, which meant that multiple calls to signal() would result in wait() returning multiple times.
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
};