1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-07-02 16:38:41 +00:00

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.
This commit is contained in:
ShadowNinja 2015-11-29 00:17:51 -05:00
parent ea2964f5a1
commit 696148e298
3 changed files with 121 additions and 13 deletions

View file

@ -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
};