Apply http://prosody.im/patches/luaevent-catch-errors-1.patch
authorKim Alvefur <zash@zash.se>
Sun, 3 Mar 2013 16:54:41 +0000 (3 17:54 +0100)
committerKim Alvefur <zash@zash.se>
Sun, 3 Mar 2013 16:54:41 +0000 (3 17:54 +0100)
include/luaevent.h
src/event_callback.c
src/luaevent.c

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;
 }