base: adds error catching / re-raisev0.4.2
authorMatthew Wild <mwild1@gmail.com>
Mon, 11 Mar 2013 00:57:26 +0000 (10 20:57 -0400)
committerThomas Harning Jr <harningt@gmail.com>
Mon, 11 Mar 2013 00:57:26 +0000 (10 20:57 -0400)
CHANGELOG
include/luaevent.h
src/event_callback.c
src/luaevent.c

index 33a1608..f9bc782 100644 (file)
--- 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
index c462545..ddd4ce4 100644 (file)
@@ -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);
index 0a7d25e..8d327bd 100644 (file)
@@ -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 */
index 2d6a564..9918da3 100644 (file)
@@ -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;
 }