예제 #1
0
	int w_Thread_set(lua_State *L)
	{
		Thread *t = luax_checkthread(L, 1);
		std::string name = luax_checklstring(L, 2);
		ThreadVariant *v;
		size_t len;
		const char *str;
		switch(lua_type(L, 3))
		{
			case LUA_TBOOLEAN:
				v = new ThreadVariant(luax_toboolean(L, 3));
				break;
			case LUA_TNUMBER:
				v = new ThreadVariant(lua_tonumber(L, 3));
				break;
			case LUA_TSTRING:
				str = lua_tolstring(L, 3, &len);
				v = new ThreadVariant(str, len);
				break;
			case LUA_TLIGHTUSERDATA:
				v = new ThreadVariant(lua_touserdata(L, 3));
				break;
			case LUA_TUSERDATA:
				v = new ThreadVariant(extractudatatype(L, 3), lua_touserdata(L, 3));
				break;
			default:
				return luaL_error(L, "Expected boolean, number, string or userdata");
		}
		t->set(name, v);
		t->lock();
		v->release();
		t->unlock();
		return 0;
	}
예제 #2
0
	int w_Thread_getName(lua_State *L)
	{
		Thread *t = luax_checkthread(L, 1);
		// allow names containing \0
		luax_pushstring(L, t->getName());
		return 1;
	}
예제 #3
0
int w_Thread_getError(lua_State *L)
{
	LuaThread *t = luax_checkthread(L, 1);
	std::string err = t->getError();
	if (err.empty())
		lua_pushnil(L);
	else
		luax_pushstring(L, err);
	return 1;
}
예제 #4
0
	int w_Thread_set(lua_State *L)
	{
		Thread *t = luax_checkthread(L, 1);
		std::string name = luax_checkstring(L, 2);
		Variant *v = Variant::fromLua(L, 3);
		if (!v)
			return luaL_error(L, "Expected boolean, number, string or userdata");
		t->set(name, v);
		t->lock();
		v->release();
		t->unlock();
		return 0;
	}
예제 #5
0
	int w_Thread_peek(lua_State *L)
	{
		Thread *t = luax_checkthread(L, 1);
		std::string name = luax_checklstring(L, 2);
		t->lock();
		ThreadVariant *v = t->get(name);
		t->unlock();
		if (!__pushThreadVariant(L, v))
			return 1;
		t->lock();
		v->release();
		t->unlock();
		return 1;
	}
예제 #6
0
	int w_Thread_getKeys(lua_State *L)
	{
		Thread *t = luax_checkthread(L, 1);
		t->lock();
		std::vector<std::string> keys = t->getKeys();
		t->unlock();
		lua_createtable(L, keys.size(), 0);
		int i = 1;
		for (std::vector<std::string>::iterator it = keys.begin(); it != keys.end(); it++)
		{
			lua_pushnumber(L, i++);
			luax_pushstring(L, *it);
			lua_settable(L, -3);
		}
		return 1;
	}
예제 #7
0
	int w_Thread_peek(lua_State *L)
	{
		Thread *t = luax_checkthread(L, 1);
		std::string name = luax_checkstring(L, 2);
		t->lock();
		Variant *v = t->get(name);
		t->unlock();
		if (!v)
		{
			lua_pushnil(L);
			return 1;
		}
		v->toLua(L);
		t->lock();
		v->release();
		t->unlock();
		return 1;
	}
예제 #8
0
int w_Thread_start(lua_State *L)
{
	LuaThread *t = luax_checkthread(L, 1);
	std::vector<Variant> args;
	int nargs = lua_gettop(L) - 1;

	for (int i = 0; i < nargs; ++i)
	{
		args.push_back(Variant::fromLua(L, i+2));

		if (args.back().getType() == Variant::UNKNOWN)
		{
			args.clear();
			return luaL_argerror(L, i+2, "boolean, number, string, love type, or flat table expected");
		}
	}

	luax_pushboolean(L, t->start(args));
	return 1;
}
예제 #9
0
int w_Thread_isRunning(lua_State *L)
{
	LuaThread *t = luax_checkthread(L, 1);
	luax_pushboolean(L, t->isRunning());
	return 1;
}
예제 #10
0
int w_Thread_wait(lua_State *L)
{
	LuaThread *t = luax_checkthread(L, 1);
	t->wait();
	return 0;
}
예제 #11
0
	int w_Thread_start(lua_State *L)
	{
		Thread *t = luax_checkthread(L, 1);
		t->start();
		return 0;
	}
예제 #12
0
	int w_Thread_kill(lua_State *L)
	{
		Thread *t = luax_checkthread(L, 1);
		t->kill();
		return 0;
	}