summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmil Renner Berthing <esmil@mailme.dk>2011-02-11 11:25:01 +0100
committerEmil Renner Berthing <esmil@mailme.dk>2011-02-11 11:25:01 +0100
commit62509f07633c6f31c7cebf920e3e0782bdbf3d0d (patch)
tree9afbe9825ccb7c727a39176523ed86c8988781c0
parente0f4a41152065e4051f8245ddb6b719387584c80 (diff)
downloadlem-62509f07633c6f31c7cebf920e3e0782bdbf3d0d.tar.gz
lem-62509f07633c6f31c7cebf920e3e0782bdbf3d0d.tar.xz
lem-62509f07633c6f31c7cebf920e3e0782bdbf3d0d.zip
utils: make sleeper return nil, "timeout" on timeout
-rw-r--r--utils.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/utils.c b/utils.c
index 731eeb5..94536f1 100644
--- a/utils.c
+++ b/utils.c
@@ -38,6 +38,7 @@ sleeper_wakeup(lua_State *T)
ev_timer_stop(EV_G_ w);
nargs = lua_gettop(T) - 1;
+ lua_settop(S, 0);
lua_xmove(T, S, nargs);
lem_queue(S, nargs);
w->data = NULL;
@@ -54,8 +55,8 @@ sleep_handler(EV_P_ struct ev_timer *w, int revents)
(void)revents;
- lua_pushboolean(T, 1);
- lem_queue(T, 1);
+ /* return nil, "timeout" */
+ lem_queue(T, 2);
w->data = NULL;
}
@@ -76,10 +77,13 @@ sleeper_sleep(lua_State *T)
ev_tstamp delay = (ev_tstamp)luaL_checknumber(T, 2);
if (delay <= 0) {
- lua_pushboolean(T, 1);
- lem_queue(T, 1);
+ /* return nil, "timeout"
+ * ..but yield the thread */
+ lua_pushnil(T);
+ lua_pushvalue(T, lua_upvalueindex(1));
+ lem_queue(T, 2);
- return lua_yield(T, 1);
+ return lua_yield(T, 2);
}
ev_timer_set(w, delay, 0);
@@ -87,8 +91,12 @@ sleeper_sleep(lua_State *T)
}
w->data = T;
+
+ /* yield sleeper, nil, "timeout" */
lua_settop(T, 1);
- return lua_yield(T, 1);
+ lua_pushnil(T);
+ lua_pushvalue(T, lua_upvalueindex(1));
+ return lua_yield(T, 3);
}
static int
@@ -230,7 +238,8 @@ int luaopen_lem_utils(lua_State *L)
lua_pushcfunction(L, sleeper_wakeup);
lua_setfield(L, -2, "wakeup");
/* mt.sleep = <sleeper_sleep> */
- lua_pushcfunction(L, sleeper_sleep);
+ lua_pushliteral(L, "timeout"); /* upvalue 1: "timeout" */
+ lua_pushcclosure(L, sleeper_sleep, 1);
lua_setfield(L, -2, "sleep");
/* set sleeper function */
lua_pushcclosure(L, sleeper_new, 1);