static int utils_exit(lua_State *T) { int status = (int)luaL_checknumber(T, 1); lem_exit(status); return lua_yield(T, 0); }
static void runqueue_pop(EV_P_ struct ev_idle *w, int revents) { struct lem_runqueue_slot *slot; lua_State *T; int nargs; (void)revents; if (rq.first == rq.last) { /* queue is empty */ lem_debug("runqueue is empty, collecting.."); #if 0 if (lua_gc(L, LUA_GCSTEP, 0)) { lem_debug("done collecting"); ev_idle_stop(EV_A_ w); } #else ev_idle_stop(EV_A_ w); lua_gc(L, LUA_GCCOLLECT, 0); #endif return; } lem_debug("running thread..."); slot = &rq.queue[rq.first]; T = slot->T; nargs = slot->nargs; rq.first++; rq.first &= rq.mask; /* run Lua thread */ #if LUA_VERSION_NUM >= 502 switch (lua_resume(T, NULL, nargs)) { #else switch (lua_resume(T, nargs)) { #endif case LUA_OK: /* thread finished successfully */ lem_debug("thread finished successfully"); lem_forgetthread(T); return; case LUA_YIELD: /* thread yielded */ lem_debug("thread yielded"); return; case LUA_ERRERR: /* error running error handler */ lem_debug("thread errored while running error handler"); #if LUA_VERSION_NUM >= 502 case LUA_ERRGCMM: lem_debug("error in __gc metamethod"); #endif case LUA_ERRRUN: /* runtime error */ lem_debug("thread errored"); thread_error(T); break; case LUA_ERRMEM: /* out of memory */ oom(); default: /* this shouldn't happen */ lem_debug("lua_resume: unknown error"); lua_pushliteral(L, "unknown error"); break; } lem_exit(EXIT_FAILURE); } #include "pool.c" static int queue_file(int argc, char *argv[], int fidx) { lua_State *T = lem_newthread(); const char *filename; int i; if (fidx < argc) filename = argv[fidx]; else filename = LEM_LDIR "lem/repl.lua"; switch (luaL_loadfile(T, filename)) { case LUA_OK: /* success */ break; case LUA_ERRMEM: oom(); default: lem_log_error("lem: %s", lua_tostring(T, 1)); return -1; } lua_createtable(T, argc, 0); for (i = 0; i < argc; i++) { lua_pushstring(T, argv[i]); lua_rawseti(T, -2, i - fidx); } lua_setglobal(T, "arg"); lem_queue(T, 0); return 0; }
static void runqueue_pop(EV_P_ struct ev_idle *w, int revents) { struct lem_runqueue_slot *slot; lua_State *T; int nargs; (void)revents; if (rq.first == rq.last) { /* queue is empty */ lem_debug("runqueue is empty, collecting.."); #if 0 if (lua_gc(L, LUA_GCSTEP, 0)) { lem_debug("done collecting"); ev_idle_stop(EV_A_ w); } #else ev_idle_stop(EV_A_ w); lua_gc(L, LUA_GCCOLLECT, 0); #endif return; } lem_debug("running thread..."); slot = &rq.queue[rq.first]; T = slot->T; nargs = slot->nargs; rq.first++; rq.first &= rq.mask; /* run Lua thread */ switch (lua_resume(T, NULL, nargs)) { case LUA_OK: /* thread finished successfully */ lem_debug("thread finished successfully"); lem_forgetthread(T); return; case LUA_YIELD: /* thread yielded */ lem_debug("thread yielded"); return; case LUA_ERRERR: /* error running error handler */ lem_debug("thread errored while running error handler"); case LUA_ERRGCMM: lem_debug("error in __gc metamethod"); case LUA_ERRRUN: /* runtime error */ lem_debug("thread errored"); thread_error(T); break; case LUA_ERRMEM: /* out of memory */ oom(); default: /* this shouldn't happen */ lem_debug("lua_resume: unknown error"); lua_pushliteral(L, "unknown error"); break; } lem_exit(EXIT_FAILURE); }