src/luaevent.c

changeset 23
897150985f13
parent 22
48a109847dce
child 24
cda8e1a2dfa2
--- a/src/luaevent.c	Wed Sep 05 23:05:05 2007 -0400
+++ b/src/luaevent.c	Wed Sep 05 23:33:46 2007 -0400
@@ -45,16 +45,33 @@
 	return fd;
 }
 
-/* sock, event, callback */
+void load_timeval(double time, struct timeval *tv) {
+	tv->sec = (int)time;
+	tv->usec = (time * 1000000) % 1000000;
+}
+
+/* sock, event, callback, timeout */
 static int luaevent_addevent(lua_State* L) {
 	int fd, event;
 	le_callback* arg = event_callback_push(L, 1, 4);
-	fd = getSocketFd(L, 2);
+	struct timeval *tv = &arg->timeout;
+	if(lua_isnil(L, 2) && lua_isnumber(L, 5)) {
+		fd = -1; /* Per event_timer_set.... */
+	} else {
+		fd = getSocketFd(L, 2);
+	}
 	event = luaL_checkinteger(L, 3);
+	if(lua_isnumber(L, 5)) {
+		double time = lua_tonumber(L, 5);
+		load_timeval(time, tv);
+	} else {
+		tv = NULL;
+	}
+
 	/* Setup event... */
 	event_set(&arg->ev, fd, event | EV_PERSIST, luaevent_callback, arg);
 	event_base_set(arg->base->base, &arg->ev);
-	event_add(&arg->ev, NULL);
+	event_add(&arg->ev, tv);
 	return 1;
 }
 
@@ -86,6 +103,7 @@
 	{"LEAVE", -1},
 	{"EV_READ", EV_READ},
 	{"EV_WRITE", EV_WRITE},
+	{"EV_TIMEOUT", EV_TIMEOUT},
 	{NULL, 0}
 };
 

mercurial