diff --git a/src/modules/thread/sdl/Thread.cpp b/src/modules/thread/sdl/Thread.cpp index 219adc4dd..4a36752ab 100644 --- a/src/modules/thread/sdl/Thread.cpp +++ b/src/modules/thread/sdl/Thread.cpp @@ -251,17 +251,14 @@ namespace sdl ThreadVariant *Thread::receive(const std::string & name) { - lock(); ThreadVariant *v = comm->getValue(name); if (v) v->retain(); - unlock(); return v; } ThreadVariant *Thread::demand(const std::string & name) { - lock(); ThreadVariant *v = comm->getValue(name); while (!v) { @@ -271,22 +268,19 @@ namespace sdl v = comm->getValue(name); } v->retain(); - unlock(); return v; } void Thread::clear(const std::string & name) { - lock(); comm->clearValue(name); - unlock(); } void Thread::send(const std::string & name, ThreadVariant *v) { - lock(); - comm->setValue(name, v); - unlock(); + lock(); //this function explicitly locks + comm->setValue(name, v); //because we need + unlock(); //it to unlock here for the cond SDL_CondBroadcast(cond); } diff --git a/src/modules/thread/sdl/wrap_Thread.cpp b/src/modules/thread/sdl/wrap_Thread.cpp index dd6dcc88f..b2695daa3 100644 --- a/src/modules/thread/sdl/wrap_Thread.cpp +++ b/src/modules/thread/sdl/wrap_Thread.cpp @@ -76,6 +76,7 @@ namespace sdl { Thread *t = luax_checkthread(L, 1); std::string name = luax_checklstring(L, 2); + t->lock(); ThreadVariant *v = t->receive(name); if (!v) { @@ -83,6 +84,7 @@ namespace sdl return 1; } t->clear(name); + t->unlock(); switch(v->type) { case BOOLEAN: @@ -119,6 +121,7 @@ namespace sdl { Thread *t = luax_checkthread(L, 1); std::string name = luax_checklstring(L, 2); + t->lock(); ThreadVariant *v = t->demand(name); if (!v) { @@ -126,6 +129,7 @@ namespace sdl return 1; } t->clear(name); + t->unlock(); switch(v->type) { case BOOLEAN: @@ -248,7 +252,9 @@ namespace sdl return luaL_error(L, "Expected boolean, number, string or userdata"); } t->send(name, v); + t->lock(); v->release(); + t->unlock(); return 0; }