Event module is thread safe;

This commit is contained in:
bjorn 2018-04-01 22:43:54 -07:00
parent 40c363fff4
commit 8b3fcc94b8
3 changed files with 16 additions and 1 deletions

View File

@ -3,7 +3,7 @@
map_int_t EventTypes;
static int pollRef;
static _Thread_local int pollRef;
static int nextEvent(lua_State* L) {
Event event;

View File

@ -9,6 +9,7 @@ void lovrEventInit() {
vec_init(&state.pumps);
vec_init(&state.events);
lovrEventAddPump(glfwPollEvents);
mtx_init(&state.lock, mtx_plain);
atexit(lovrEventDestroy);
state.initialized = true;
}
@ -17,15 +18,20 @@ void lovrEventDestroy() {
if (!state.initialized) return;
vec_deinit(&state.pumps);
vec_deinit(&state.events);
mtx_destroy(&state.lock);
memset(&state, 0, sizeof(EventState));
}
void lovrEventAddPump(EventPump pump) {
mtx_lock(&state.lock);
vec_push(&state.pumps, pump);
mtx_unlock(&state.lock);
}
void lovrEventRemovePump(EventPump pump) {
mtx_lock(&state.lock);
vec_remove(&state.pumps, pump);
mtx_unlock(&state.lock);
}
void lovrEventPump() {
@ -36,18 +42,25 @@ void lovrEventPump() {
}
void lovrEventPush(Event event) {
mtx_lock(&state.lock);
vec_insert(&state.events, 0, event);
mtx_unlock(&state.lock);
}
bool lovrEventPoll(Event* event) {
mtx_lock(&state.lock);
if (state.events.length == 0) {
mtx_unlock(&state.lock);
return false;
}
*event = vec_pop(&state.events);
mtx_unlock(&state.lock);
return true;
}
void lovrEventClear() {
mtx_lock(&state.lock);
vec_clear(&state.events);
mtx_unlock(&state.lock);
}

View File

@ -1,5 +1,6 @@
#include "headset/headset.h"
#include "thread/thread.h"
#include "lib/tinycthread/tinycthread.h"
#include "lib/vec/vec.h"
#include <stdbool.h>
@ -77,6 +78,7 @@ typedef struct {
bool initialized;
vec_pump_t pumps;
vec_event_t events;
mtx_t lock;
} EventState;
void lovrEventInit();