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:
parent
ea2964f5a1
commit
696148e298
3 changed files with 121 additions and 13 deletions
|
@ -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
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue