diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/buffer_event.c | 8 | ||||
-rw-r--r-- | src/event_buffer.c | 3 | ||||
-rw-r--r-- | src/event_callback.c | 2 | ||||
-rw-r--r-- | src/luaevent.c | 60 |
4 files changed, 54 insertions, 19 deletions
diff --git a/src/buffer_event.c b/src/buffer_event.c index 7f1ab9b..0aab636 100644 --- a/src/buffer_event.c +++ b/src/buffer_event.c @@ -1,7 +1,6 @@ /* LuaEvent - Copyright (C) 2007 Thomas Harning <harningt@gmail.com> * Licensed as LGPL - See doc/COPYING for details */ #include "buffer_event.h" -#include "luaevent.h" #include "utility.h" #include <lauxlib.h> #include <malloc.h> @@ -49,7 +48,12 @@ static void handle_callback(le_bufferevent* le_ev, short what, int callbackIndex /* func, bufferevent */ lua_pushinteger(L, what); /* What to do w/ errors...? */ - lua_pcall(L, 2, 0, 0); + if(!lua_pcall(L, 2, 0, 0)) + { + /* FIXME: Perhaps luaevent users should be + * able to set an error handler? */ + lua_pop(L, 1); /* Pop error message */ + } } static void buffer_event_readcb(struct bufferevent *ev, void *ptr) { diff --git a/src/event_buffer.c b/src/event_buffer.c index 62dc0e3..ea66a94 100644 --- a/src/event_buffer.c +++ b/src/event_buffer.c @@ -2,7 +2,6 @@ * Licensed as LGPL - See doc/COPYING for details */ #include "event_buffer.h" -#include "luaevent.h" #include <lauxlib.h> #include <malloc.h> @@ -201,6 +200,7 @@ static int event_buffer_write(lua_State* L) { } else if(lua_isuserdata(L, 2)) { ret = evbuffer_write(buf->buffer, getSocketFd(L, 2)); } else { + ret = 0; /* Shush uninitialized warning */ luaL_argerror(L, 2, "Unexpected data type. Expects: integer/lightuserdata/socket"); } lua_pushinteger(L, ret); @@ -222,6 +222,7 @@ static int event_buffer_read(lua_State* L) { } else if(lua_isuserdata(L, 2)) { ret = evbuffer_read(buf->buffer, getSocketFd(L, 2), len); } else { + ret = 0; /* Shush uninitialized warning */ luaL_argerror(L, 2, "Unexpected data type. Expects: integer/lightuserdata/socket"); } lua_pushinteger(L, ret); diff --git a/src/event_callback.c b/src/event_callback.c index 76a7789..b1cdd02 100644 --- a/src/event_callback.c +++ b/src/event_callback.c @@ -43,7 +43,7 @@ void luaevent_callback(int fd, short event, void* p) { load_timeval(newTimeout, &cb->timeout); } } - lua_pop(L, 1); + lua_pop(L, 2); if(ret == -1) { freeCallbackArgs(cb, L); } else { diff --git a/src/luaevent.c b/src/luaevent.c index c9b5430..6036cf1 100644 --- a/src/luaevent.c +++ b/src/luaevent.c @@ -1,21 +1,16 @@ /* LuaEvent - Copyright (C) 2007 Thomas Harning <harningt@gmail.com> * Licensed as LGPL - See doc/COPYING for details */ -#include "luaevent.h" #include "event_callback.h" #include "event_buffer.h" #include "buffer_event.h" -#include <lua.h> #include <lauxlib.h> #include <assert.h> +#include <string.h> #define EVENT_BASE_MT "EVENT_BASE_MT" -#ifdef _WIN32 -#include <winsock2.h> -#endif - le_base* event_base_get(lua_State* L, int idx) { return (le_base*)luaL_checkudata(L, idx, EVENT_BASE_MT); } @@ -29,6 +24,11 @@ int luaevent_newbase(lua_State* L) { return 1; } +int luaevent_libevent_version(lua_State* L) { + lua_pushstring(L, event_get_version()); + return 1; +} + static int luaevent_base_gc(lua_State* L) { le_base *base = event_base_get(L, 1); if(base->base) { @@ -40,14 +40,18 @@ static int luaevent_base_gc(lua_State* L) { int getSocketFd(lua_State* L, int idx) { int fd; - luaL_checktype(L, idx, LUA_TUSERDATA); - lua_getfield(L, idx, "getfd"); - if(lua_isnil(L, -1)) - return luaL_error(L, "Socket type missing 'getfd' method"); - lua_pushvalue(L, idx); - lua_call(L, 1, 1); - fd = lua_tointeger(L, -1); - lua_pop(L, 1); + if(lua_isnumber(L, idx)) { + fd = lua_tonumber(L, idx); + } else { + luaL_checktype(L, idx, LUA_TUSERDATA); + lua_getfield(L, idx, "getfd"); + if(lua_isnil(L, -1)) + return luaL_error(L, "Socket type missing 'getfd' method"); + lua_pushvalue(L, idx); + lua_call(L, 1, 1); + fd = lua_tointeger(L, -1); + lua_pop(L, 1); + } return fd; } @@ -82,21 +86,47 @@ static int luaevent_addevent(lua_State* L) { } static int luaevent_loop(lua_State* L) { + int ret; le_base *base = event_base_get(L, 1); base->loop_L = L; - int ret = event_base_loop(base->base, 0); + ret = event_base_loop(base->base, 0); lua_pushinteger(L, ret); return 1; } +static int luaevent_loopexit(lua_State*L) { + int ret; + le_base *base = event_base_get(L, 1); + struct timeval tv = { 0, 0 }; + if(lua_gettop(L) >= 2) /* Optional timeout before exiting the loop */ + load_timeval(luaL_checknumber(L, 2), &tv); + ret = event_base_loopexit(base->base, &tv); + lua_pushinteger(L, ret); + return 1; +} + +static int luaevent_method(lua_State* L) { + #ifdef _EVENT_VERSION + le_base *base = event_base_get(L, 1); + if(strcmp(_EVENT_VERSION, "1.3")<0) + lua_pushstring(L, event_base_get_method(base->base)); + else + #endif + lua_pushstring(L, event_get_method()); + return 1; +} + static luaL_Reg base_funcs[] = { { "addevent", luaevent_addevent }, { "loop", luaevent_loop }, + { "loopexit", luaevent_loopexit }, + { "method", luaevent_method }, { NULL, NULL } }; static luaL_Reg funcs[] = { { "new", luaevent_newbase }, + { "libevent_version", luaevent_libevent_version }, { NULL, NULL } }; |