diff options
Diffstat (limited to 'lib/LuaTask.cc')
-rw-r--r-- | lib/LuaTask.cc | 48 |
1 files changed, 34 insertions, 14 deletions
diff --git a/lib/LuaTask.cc b/lib/LuaTask.cc index dfb12d7..4bc0208 100644 --- a/lib/LuaTask.cc +++ b/lib/LuaTask.cc @@ -8,31 +8,50 @@ #include <CopyJob.h> #endif -LuaTask * LuaTask::top = 0; +htab * LuaTask::h = hcreate(1); LuaTask::LuaTask(Lua * _L, const String & _cmd) : L(_L), cmd(_cmd), nargs(0), c(0), b(0) { + LuaTask * top = gettop(); + if (top) { WaitFor(top); } else { SetBurst(); } - top = this; + settop(this); stacktop = L->gettop() + 1; } -LuaTask::LuaTask(Lua * _L, int _nargs) : L(_L), cmd(""), nargs(_nargs), c(0), b(0) { - if (top) { - WaitFor(top); - } else { - SetBurst(); - } - top = this; +LuaTask::LuaTask(Lua * _L, int _nargs) throw (GeneralException) : L(_L), cmd(""), nargs(_nargs), c(0), b(0) { + if (gettop()) + throw GeneralException("Can't run a stack-based LuaTask when there are other tasks waiting."); + + SetBurst(); + settop(this); stacktop = L->gettop() - nargs; } LuaTask::~LuaTask() { - if (top == this) { - top = 0; + if (gettop() == this) { + settop(0); + } +} + +LuaTask * LuaTask::gettop() { + if (!hfind(h, (Uint8 *) L, sizeof(L))) { + hadd(h, (Uint8 *) L, sizeof(L), 0); + } + + return (LuaTask *) hstuff(h); +} + +void LuaTask::settop(LuaTask * v) { + if (!hfind(h, (Uint8 *) L, sizeof(L))) + return; + if (v) { + hstuff(h) = v; + } else { + hdel(h); } } @@ -41,7 +60,6 @@ String LuaTask::GetName() { } int LuaTask::Do() throw (GeneralException) { - int nargs = 0; switch (current) { case 0: current = 1; @@ -51,6 +69,7 @@ int LuaTask::Do() throw (GeneralException) { L->resume(nargs); } case 2: + nargs = 0; #ifndef LUATASK_OMIT_HTTPCLIENT if (task == "HttpClient") { LuaBuffer o(b); @@ -72,7 +91,8 @@ int LuaTask::Do() throw (GeneralException) { delete c; c = 0; - L->resume(nargs); + if (current != 1) + L->resume(nargs); case 1: current = 2; if (L->gettop() >= 1) { @@ -96,7 +116,7 @@ int LuaTask::Do() throw (GeneralException) { } else if (task == "Command") { pid_t pid; int i; - + char * cmd; char ** args, ** ptr; |