aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Harning Jr <harningt@gmail.com>2011-01-15 19:51:21 -0500
committerThomas Harning Jr <harningt@gmail.com>2011-01-15 19:51:21 -0500
commit1153affe43bbc7f929213e0a5d6f8b5189cc45bd (patch)
tree1e63a88fdebccabf3529fa9c697c3f43b067c673
parent24cac1c1bcf4b0dc3188f72934d2881692829e61 (diff)
parentd6cfe3ef1bc7d3c489abe394830211906e650d2c (diff)
downloadluaevent-prosody-1153affe43bbc7f929213e0a5d6f8b5189cc45bd.tar.gz
luaevent-prosody-1153affe43bbc7f929213e0a5d6f8b5189cc45bd.zip
Merge branch 'prosody-tree'
-rw-r--r--CHANGELOG12
-rw-r--r--Makefile32
-rw-r--r--README10
-rw-r--r--include/buffer_event.h4
-rw-r--r--include/event_buffer.h4
-rw-r--r--include/event_callback.h4
-rw-r--r--include/luaevent.h4
-rw-r--r--lua/luaevent.lua3
-rw-r--r--premake.lua32
-rw-r--r--src/buffer_event.c8
-rw-r--r--src/event_buffer.c3
-rw-r--r--src/event_callback.c2
-rw-r--r--src/luaevent.c60
-rw-r--r--test/basic.lua8
14 files changed, 123 insertions, 63 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 8525ef7..2079f48 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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
+
diff --git a/README b/README
index 4903c71..087fbe0 100644
--- a/README
+++ b/README
@@ -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())