From 5a9b21174a61780d22a369daa7dfcf51c1e59592 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Sun, 3 Mar 2013 17:54:41 +0100 Subject: [PATCH] Apply http://prosody.im/patches/luaevent-catch-errors-1.patch --- include/luaevent.h | 1 + src/event_callback.c | 7 ++++++- src/luaevent.c | 8 ++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) 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