diff options
author | Thomas Harning Jr <harningt@gmail.com> | 2011-01-15 19:51:21 -0500 |
---|---|---|
committer | Thomas Harning Jr <harningt@gmail.com> | 2011-01-15 19:51:21 -0500 |
commit | 1153affe43bbc7f929213e0a5d6f8b5189cc45bd (patch) | |
tree | 1e63a88fdebccabf3529fa9c697c3f43b067c673 | |
parent | 24cac1c1bcf4b0dc3188f72934d2881692829e61 (diff) | |
parent | d6cfe3ef1bc7d3c489abe394830211906e650d2c (diff) | |
download | luaevent-prosody-1153affe43bbc7f929213e0a5d6f8b5189cc45bd.tar.gz luaevent-prosody-1153affe43bbc7f929213e0a5d6f8b5189cc45bd.zip |
Merge branch 'prosody-tree'
-rw-r--r-- | CHANGELOG | 12 | ||||
-rw-r--r-- | Makefile | 32 | ||||
-rw-r--r-- | README | 10 | ||||
-rw-r--r-- | include/buffer_event.h | 4 | ||||
-rw-r--r-- | include/event_buffer.h | 4 | ||||
-rw-r--r-- | include/event_callback.h | 4 | ||||
-rw-r--r-- | include/luaevent.h | 4 | ||||
-rw-r--r-- | lua/luaevent.lua | 3 | ||||
-rw-r--r-- | premake.lua | 32 | ||||
-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 | ||||
-rw-r--r-- | test/basic.lua | 8 |
14 files changed, 123 insertions, 63 deletions
@@ -1,3 +1,15 @@ +luaevent-prosody 0.1.0 - 2010-02-15 + * Fixed stack slot leak in event callbacks + * Fixed stack slot leak when error occurs in callback + * Various compilation fixes for Windows/ANSI C + * Silence some compiler warnings + + Add base:loopexit() method, with timeout support + + Add base:method() to discover backend in use + + Add core.libevent_version() to detect libevent version + + Add _NAME and _VERSION fields to module table + + base:addevent() now accepts integer fd to watch + + Switched from premake to standard Makefile for building +====== 0.2.0 - 2007-09-21 + Reorganized project to better fit GIT + Refactored and cleaned sources diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..40a13d3 --- /dev/null +++ b/Makefile @@ -0,0 +1,32 @@ +# Utilities +INSTALL = install +INSTALL_PROGRAM = $(INSTALL) +INSTALL_DATA = $(INSTALL) -m 644 + +# Flags +CFLAGS = -O3 -c -Wall -fpic +LDFLAGS = -shared + +# Directories +LUA_INC_DIR=/usr/include/lua5.1 +LUA_LIB_DIR=/usr/lib + +INSTALL_DIR_LUA=/usr/share/lua/5.1 +INSTALL_DIR_BIN=/usr/lib/lua/5.1 + +# Files +LUA_LIB = lua5.1 +LIB = core.so + +all: + $(CC) $(CFLAGS) -Iinclude -I$(LUA_INC_DIR) src/*.c + $(CC) $(LDFLAGS) -o $(LIB) *.o -L$(LUA_LIB_DIR) -l$(LUA_LIB) -levent + +install: all + $(INSTALL_DATA) -D lua/luaevent.lua $(DESTDIR)$(INSTALL_DIR_LUA)/luaevent.lua + $(INSTALL_PROGRAM) -D $(LIB) $(DESTDIR)$(INSTALL_DIR_BIN)/luaevent/$(LIB) + +clean: + rm *.so + rm *.o + @@ -1,3 +1,13 @@ +luaevent-prosody is a (hopefully temporary) fork of the luaevent library. This fork is +maintained by Matthew Wild <mwild1@gmail.com>. + +Source repository: http://code.matthewwild.co.uk/luaevent-prosody + +This luaevent-prosody 0.1.0 release is based on luaevent 0.2.0. See CHANGELOG for more +information about the changes. + +=== Original README from luaevent 0.2.0 === + Description: This is a binding of libevent to Lua. It will serve as a drop-in replacement for copas, and eventually support more features (async DNS, HTTP, RPC...). diff --git a/include/buffer_event.h b/include/buffer_event.h index b3fe3c1..ad8fc55 100644 --- a/include/buffer_event.h +++ b/include/buffer_event.h @@ -4,10 +4,6 @@ #define BUFFER_EVENT_H #include "luaevent.h" -#include <lua.h> -#include <sys/types.h> -#include <sys/time.h> -#include <event.h> typedef struct { struct bufferevent* ev; diff --git a/include/event_buffer.h b/include/event_buffer.h index a7b1525..0ee4cd2 100644 --- a/include/event_buffer.h +++ b/include/event_buffer.h @@ -4,10 +4,6 @@ #define EVENT_BUFFER_H #include "luaevent.h" -#include <lua.h> -#include <sys/types.h> -#include <sys/time.h> -#include <event.h> typedef struct { struct evbuffer* buffer; diff --git a/include/event_callback.h b/include/event_callback.h index 38aedb8..fcda8ce 100644 --- a/include/event_callback.h +++ b/include/event_callback.h @@ -4,10 +4,6 @@ #define EVENT_CALLBACK #include "luaevent.h" -#include <lua.h> -#include <sys/types.h> -#include <sys/time.h> -#include <event.h> typedef struct { struct event ev; diff --git a/include/luaevent.h b/include/luaevent.h index ef3386b..e419998 100644 --- a/include/luaevent.h +++ b/include/luaevent.h @@ -5,7 +5,11 @@ #include <lua.h> #include <sys/types.h> +#ifdef _WIN32 +#include <winsock2.h> +#else #include <sys/time.h> +#endif #include <event.h> typedef struct { diff --git a/lua/luaevent.lua b/lua/luaevent.lua index a05de29..7e1b9ad 100644 --- a/lua/luaevent.lua +++ b/lua/luaevent.lua @@ -5,6 +5,9 @@ module("luaevent", package.seeall) require("luaevent.core") +_NAME = "luaevent-prosody"; +_VERSION = "0.1.0"; + local EV_READ = luaevent.core.EV_READ local EV_WRITE = luaevent.core.EV_WRITE local base = luaevent.core.new() diff --git a/premake.lua b/premake.lua deleted file mode 100644 index d66861a..0000000 --- a/premake.lua +++ /dev/null @@ -1,32 +0,0 @@ -project.name = "luaevent.core" -project.libdir = "lib" -project.bindir = "bin" - -package = newpackage() -package.kind = "dll" -package.language = "c++" -package.targetprefix = "" -package.target = "core" - -package.links = { - "event" -} - -package.includepaths = { - "include", -} -if linux then - package.buildoptions = { "-Wall" } - package.config["Debug"].buildoptions = { "-O0" } - package.linkoptions = { "-Wall -L/usr/local/lib" } - package.postbuildcommands = { "mkdir -p test/luaevent", "cp bin/* test/luaevent", "cp lua/* test" } -else - print([[Other environements currently untested, may need tweaking]]) -end - -package.files = { - matchrecursive( - "src/*.c", - "include/*.h" - ) -} 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 } }; diff --git a/test/basic.lua b/test/basic.lua new file mode 100644 index 0000000..4ec72c4 --- /dev/null +++ b/test/basic.lua @@ -0,0 +1,8 @@ +require "luaevent" + +print("Version:", luaevent._NAME.." "..luaevent._VERSION) +print("libevent version:", luaevent.core.libevent_version()) +print("") +base = luaevent.core.new() +print("Testing creating base object:", type(base) == "userdata" and "OK" or "FAIL") +print("libevent backend:", base:method()) |