summaryrefslogtreecommitdiff
path: root/lib/LuaTask.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/LuaTask.cc')
-rw-r--r--lib/LuaTask.cc48
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;