Make the new event sink thread-safe (hopefully) and make small usability fixes

This commit is contained in:
Bart van Strien
2011-12-20 19:51:50 +01:00
parent d3bd9b1156
commit 9fb63dc4b8
2 changed files with 14 additions and 3 deletions
+12 -3
View File
@@ -20,6 +20,9 @@
#include "Event.h" #include "Event.h"
using love::thread::Mutex;
using love::thread::Lock;
namespace love namespace love
{ {
namespace event namespace event
@@ -48,7 +51,7 @@ namespace event
int Message::toLua(lua_State *L) int Message::toLua(lua_State *L)
{ {
lua_pushstring(L, name.c_str()); luax_pushstring(L, name);
for (int i = 0; i < nargs; i++) for (int i = 0; i < nargs; i++)
args[i]->toLua(L); args[i]->toLua(L);
return nargs+1; return nargs+1;
@@ -56,7 +59,7 @@ namespace event
Message *Message::fromLua(lua_State *L, int n) Message *Message::fromLua(lua_State *L, int n)
{ {
std::string name = luaL_checkstring(L, n); std::string name = luax_checkstring(L, n);
n++; n++;
Message *m = new Message(name); Message *m = new Message(name);
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
@@ -65,7 +68,11 @@ namespace event
break; break;
m->args[i] = Variant::fromLua(L, n+i); m->args[i] = Variant::fromLua(L, n+i);
if (!m->args[i]) if (!m->args[i])
break; {
delete m;
luaL_error(L, "Argument %d can't be stored safely\nExpected boolean, number, string or userdata.", n+i);
return NULL;
}
m->nargs++; m->nargs++;
} }
return m; return m;
@@ -77,12 +84,14 @@ namespace event
void Event::push(Message *msg) void Event::push(Message *msg)
{ {
Lock lock(mutex);
msg->retain(); msg->retain();
queue.push(msg); queue.push(msg);
} }
bool Event::poll(Message *&msg) bool Event::poll(Message *&msg)
{ {
Lock lock(mutex);
if (queue.empty()) if (queue.empty())
return false; return false;
msg = queue.front(); msg = queue.front();
+2
View File
@@ -27,6 +27,7 @@
#include <common/Variant.h> #include <common/Variant.h>
#include <keyboard/Keyboard.h> #include <keyboard/Keyboard.h>
#include <mouse/Mouse.h> #include <mouse/Mouse.h>
#include <thread/threads.h>
// STL // STL
#include <queue> #include <queue>
@@ -66,6 +67,7 @@ namespace event
static bool getConstant(love::keyboard::Keyboard::Key in, const char *& out); static bool getConstant(love::keyboard::Keyboard::Key in, const char *& out);
protected: protected:
thread::Mutex mutex;
std::queue<Message*> queue; std::queue<Message*> queue;
static StringMap<love::mouse::Mouse::Button, love::mouse::Mouse::BUTTON_MAX_ENUM>::Entry buttonEntries[]; static StringMap<love::mouse::Mouse::Button, love::mouse::Mouse::BUTTON_MAX_ENUM>::Entry buttonEntries[];
static StringMap<love::mouse::Mouse::Button, love::mouse::Mouse::BUTTON_MAX_ENUM> buttons; static StringMap<love::mouse::Mouse::Button, love::mouse::Mouse::BUTTON_MAX_ENUM> buttons;