From 14653b2e724bf73779fa6d20bfdc45d9f964fd46 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Sun, 10 Mar 2013 20:57:26 -0400 Subject: [PATCH] base: adds error catching / re-raise --- CHANGELOG | 2 ++ include/luaevent.h | 1 + src/event_callback.c | 7 ++++++- src/luaevent.c | 8 ++++++++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 33a1608..f9bc782 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +0.4.2 - 2013-03-10 + * Adds error catching / re-raise 0.4.1 - 2012-04-12 * Fixes event_callback handling to handle the no-return-value case better * Cleans up timertest formatting diff --git a/include/luaevent.h b/include/luaevent.h index c462545..ddd4ce4 100644 --- a/include/luaevent.h +++ b/include/luaevent.h @@ -36,6 +36,7 @@ typedef struct { struct event_base* base; lua_State* loop_L; + int errorMessage; } le_base; le_base* event_base_get(lua_State* L, int idx); diff --git a/src/event_callback.c b/src/event_callback.c index 0a7d25e..8d327bd 100644 --- a/src/event_callback.c +++ b/src/event_callback.c @@ -30,7 +30,12 @@ void luaevent_callback(int fd, short event, void* p) { L = cb->base->loop_L; lua_rawgeti(L, LUA_REGISTRYINDEX, cb->callbackRef); lua_pushinteger(L, event); - lua_call(L, 1, 2); + if(lua_pcall(L, 1, 2, 0)) + { + cb->base->errorMessage = luaL_ref(L, LUA_REGISTRYINDEX); + event_base_loopbreak(cb->base->base); + return; + } if(!cb->base) return; /* event was destroyed during callback */ /* If nothing is returned, re-use the old event value */ diff --git a/src/luaevent.c b/src/luaevent.c index 2d6a564..9918da3 100644 --- a/src/luaevent.c +++ b/src/luaevent.c @@ -89,7 +89,15 @@ static int luaevent_loop(lua_State* L) { int ret; le_base *base = event_base_get(L, 1); base->loop_L = L; + base->errorMessage = LUA_NOREF; ret = event_base_loop(base->base, 0); + if(base->errorMessage != LUA_NOREF) + { + lua_rawgeti(L, LUA_REGISTRYINDEX, base->errorMessage); + luaL_unref(L, LUA_REGISTRYINDEX, base->errorMessage); + base->errorMessage = LUA_NOREF; + return lua_error(L); + } lua_pushinteger(L, ret); return 1; } -- 2.11.4.GIT