mirror of
https://github.com/love2d/love.git
synced 2026-08-15 15:51:12 +02:00
Threads can now start with arguments, which will be in ... inside of the thread
This commit is contained in:
@@ -33,6 +33,8 @@ namespace thread
|
||||
LuaThread::LuaThread(const std::string &name, love::Data *code)
|
||||
: code(code)
|
||||
, name(name)
|
||||
, args(0)
|
||||
, nargs(0)
|
||||
{
|
||||
code->retain();
|
||||
}
|
||||
@@ -40,6 +42,11 @@ LuaThread::LuaThread(const std::string &name, love::Data *code)
|
||||
LuaThread::~LuaThread()
|
||||
{
|
||||
code->release();
|
||||
|
||||
// No args should still exist at this point,
|
||||
// but you never know.
|
||||
for (int i = 0; i < nargs; ++i)
|
||||
args[i]->release();
|
||||
}
|
||||
|
||||
void LuaThread::threadFunction()
|
||||
@@ -55,12 +62,37 @@ void LuaThread::threadFunction()
|
||||
if (luaL_loadbuffer(L, (const char *) code->getData(), code->getSize(), name.c_str()) != 0)
|
||||
error = luax_tostring(L, -1);
|
||||
else
|
||||
if (lua_pcall(L, 0, 0, 0) != 0)
|
||||
{
|
||||
int pushedargs = nargs;
|
||||
for (int i = 0; i < nargs; ++i)
|
||||
{
|
||||
args[i]->toLua(L);
|
||||
args[i]->release();
|
||||
}
|
||||
// Set both args and nargs to nil,
|
||||
// prevents the deconstructor from
|
||||
// accessing it again.
|
||||
nargs = 0;
|
||||
args = 0;
|
||||
|
||||
if (lua_pcall(L, pushedargs, 0, 0) != 0)
|
||||
error = luax_tostring(L, -1);
|
||||
}
|
||||
lua_close(L);
|
||||
this->release();
|
||||
}
|
||||
|
||||
bool LuaThread::start(Variant **args, int nargs)
|
||||
{
|
||||
for (int i = 0; i < this->nargs; ++i)
|
||||
this->args[i]->release();
|
||||
|
||||
this->args = args;
|
||||
this->nargs = nargs;
|
||||
|
||||
return Threadable::start();
|
||||
}
|
||||
|
||||
const std::string &LuaThread::getError()
|
||||
{
|
||||
return error;
|
||||
|
||||
@@ -25,8 +25,9 @@
|
||||
#include <string>
|
||||
|
||||
// LOVE
|
||||
#include <common/Object.h>
|
||||
#include <common/Data.h>
|
||||
#include <common/Object.h>
|
||||
#include <common/Variant.h>
|
||||
#include <thread/threads.h>
|
||||
|
||||
namespace love
|
||||
@@ -41,10 +42,15 @@ public:
|
||||
void threadFunction();
|
||||
const std::string &getError();
|
||||
|
||||
bool start(Variant **args, int nargs);
|
||||
|
||||
private:
|
||||
love::Data *code;
|
||||
std::string name;
|
||||
std::string error;
|
||||
|
||||
Variant **args;
|
||||
int nargs;
|
||||
};
|
||||
} // thread
|
||||
} // love
|
||||
|
||||
@@ -33,7 +33,17 @@ LuaThread *luax_checkthread(lua_State *L, int idx)
|
||||
int w_Thread_start(lua_State *L)
|
||||
{
|
||||
LuaThread *t = luax_checkthread(L, 1);
|
||||
luax_pushboolean(L, t->start());
|
||||
int nargs = lua_gettop(L) - 1;
|
||||
Variant **args = 0;
|
||||
|
||||
if (nargs > 0)
|
||||
{
|
||||
args = new Variant*[nargs];
|
||||
for (int i = 0; i < nargs; ++i)
|
||||
args[i] = Variant::fromLua(L, i+2);
|
||||
}
|
||||
|
||||
luax_pushboolean(L, t->start(args, nargs));
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user