love.thread can now share full userdata

This commit is contained in:
bart@bartbes.ath.cx
2010-02-14 17:41:11 +01:00
parent cc4d737924
commit 736f7ab1a2
19 changed files with 193 additions and 108 deletions
+16 -1
View File
@@ -79,10 +79,20 @@ namespace sdl
ThreadVariant::ThreadVariant(void *userdata)
{
type = USERDATA;
type = LUSERDATA;
data.userdata = userdata;
}
ThreadVariant::ThreadVariant(Type udatatype, void *userdata)
{
type = FUSERDATA;
this->udatatype = udatatype;
Proxy *p = (Proxy *) userdata;
flags = p->flags;
data.userdata = p->data;
((love::Object *) data.userdata)->retain();
}
ThreadVariant::~ThreadVariant()
{
switch(type)
@@ -90,6 +100,9 @@ namespace sdl
case STRING:
delete[] data.string;
break;
case FUSERDATA:
((love::Object *) data.userdata)->release();
break;
}
}
@@ -222,6 +235,8 @@ namespace sdl
ThreadVariant *v = comm->getValue(name);
while (!v)
{
if (comm->getValue("error"))
return 0;
SDL_CondWait(cond, mutex);
v = comm->getValue(name);
}
+5 -1
View File
@@ -52,7 +52,8 @@ namespace sdl
BOOLEAN,
NUMBER,
STRING,
USERDATA
LUSERDATA,
FUSERDATA
};
class ThreadVariant : public love::Object
@@ -62,6 +63,7 @@ namespace sdl
ThreadVariant(double number);
ThreadVariant(const char *string);
ThreadVariant(void *userdata);
ThreadVariant(Type udatatype, void *userdata);
~ThreadVariant();
ThreadVariantType type;
union
@@ -71,6 +73,8 @@ namespace sdl
const char *string;
void *userdata;
} data;
Type udatatype;
bits flags;
};
class ThreadData
+41 -3
View File
@@ -82,9 +82,15 @@ namespace sdl
case STRING:
lua_pushstring(L, v->data.string);
break;
case USERDATA: //FIXME: full userdata
case LUSERDATA:
lua_pushlightuserdata(L, v->data.userdata);
break;
case FUSERDATA:
const char *name;
love::types.find(v->udatatype, name);
((love::Object *) v->data.userdata)->retain();
luax_newtype(L, name, v->flags, v->data.userdata);
break;
default:
lua_pushnil(L);
break;
@@ -116,9 +122,15 @@ namespace sdl
case STRING:
lua_pushstring(L, v->data.string);
break;
case USERDATA: //FIXME: full userdata
case LUSERDATA:
lua_pushlightuserdata(L, v->data.userdata);
break;
case FUSERDATA:
const char *name;
types.find(v->udatatype, name);
((love::Object *) v->data.userdata)->retain();
luax_newtype(L, name, v->flags, v->data.userdata);
break;
default:
lua_pushnil(L);
break;
@@ -149,9 +161,15 @@ namespace sdl
case STRING:
lua_pushstring(L, v->data.string);
break;
case USERDATA: //FIXME: full userdata
case LUSERDATA:
lua_pushlightuserdata(L, v->data.userdata);
break;
case FUSERDATA:
const char *name;
types.find(v->udatatype, name);
((love::Object *) v->data.userdata)->retain();
luax_newtype(L, name, v->flags, v->data.userdata);
break;
default:
lua_pushnil(L);
break;
@@ -160,6 +178,22 @@ namespace sdl
return 1;
}
Type extractudatatype(lua_State * L, int idx)
{
Type t = INVALID_ID;
if (!lua_isuserdata(L, idx))
return t;
if (luaL_getmetafield (L, idx, "__tostring") == 0)
return t;
lua_pushvalue(L, idx);
int result = lua_pcall(L, 1, 1, 0);
if (result == 0)
types.find(lua_tostring(L, -1), t);
if (result == 0 || result == LUA_ERRRUN)
lua_pop(L, 1);
return t;
}
int w_Thread_send(lua_State *L)
{
Thread *t = luax_checkthread(L, 1);
@@ -181,6 +215,10 @@ namespace sdl
{
v = new ThreadVariant(lua_touserdata(L, 3));
}
else if (lua_isuserdata(L, 3))
{
v = new ThreadVariant(extractudatatype(L, 3), lua_touserdata(L, 3));
}
else
{
return luaL_error(L, "Expected boolean, number, string or userdata");
+1
View File
@@ -27,6 +27,7 @@
namespace love
{
extern StringMap<Type, TYPE_MAX_ENUM> types;
namespace thread
{
namespace sdl