diff options
Diffstat (limited to 'lib')
| -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;  | 
