src/luaevent.c

Wed, 05 Sep 2007 22:48:49 -0400

author
Thomas Harning Jr <harningt@gmail.com>
date
Wed, 05 Sep 2007 22:48:49 -0400
changeset 20
71bc2e49366c
parent 19
cbaa6e6ef285
child 22
48a109847dce
permissions
-rw-r--r--

Beginning refactoring of the event_callback outside of the core

13
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
1 /* LuaEvent - Copyright (C) 2007 Thomas Harning <harningt@gmail.com>
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
2 * Licensed as LGPL - See doc/COPYING for details */
19
cbaa6e6ef285 Unlearned get/setMainThread functions since they were unused.
Thomas Harning Jr <harningt@gmail.com>
parents: 13
diff changeset
3
cbaa6e6ef285 Unlearned get/setMainThread functions since they were unused.
Thomas Harning Jr <harningt@gmail.com>
parents: 13
diff changeset
4 #include "luaevent.h"
20
71bc2e49366c Beginning refactoring of the event_callback outside of the core
Thomas Harning Jr <harningt@gmail.com>
parents: 19
diff changeset
5 #include "event_callback.h"
13
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
6
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
7 #include <lua.h>
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
8 #include <lauxlib.h>
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
9 #include <assert.h>
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
10
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
11 #define EVENT_BASE_MT "EVENT_BASE_MT"
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
12
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
13 int luaevent_newbase(lua_State* L) {
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
14 le_base *base = (le_base*)lua_newuserdata(L, sizeof(le_base));
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
15 base->loop_L = NULL; /* No running loop */
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
16 base->base = event_init();
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
17 luaL_getmetatable(L, EVENT_BASE_MT);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
18 lua_setmetatable(L, -2);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
19 return 1;
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
20 }
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
21
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
22 static int luaevent_base_gc(lua_State* L) {
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
23 le_base *base = luaL_checkudata(L, 1, EVENT_BASE_MT);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
24 if(base->base) {
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
25 event_base_free(base->base);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
26 base->base = NULL;
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
27 }
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
28 return 0;
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
29 }
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
30
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
31 int getSocketFd(lua_State* L, int idx) {
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
32 int fd;
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
33 luaL_checktype(L, idx, LUA_TUSERDATA);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
34 lua_getfield(L, idx, "getfd");
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
35 if(lua_isnil(L, -1))
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
36 return luaL_error(L, "Socket type missing 'getfd' method");
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
37 lua_pushvalue(L, idx);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
38 lua_call(L, 1, 1);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
39 fd = lua_tointeger(L, -1);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
40 lua_pop(L, 1);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
41 return fd;
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
42 }
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
43
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
44 /* sock, event, callback */
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
45 static int luaevent_addevent(lua_State* L) {
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
46 int fd, event, callbackRef;
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
47 le_callback* arg;
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
48 le_base *base = luaL_checkudata(L, 1, EVENT_BASE_MT);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
49 fd = getSocketFd(L, 2);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
50 event = luaL_checkinteger(L, 3);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
51 luaL_checktype(L, 4, LUA_TFUNCTION);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
52 lua_pushvalue(L, 4);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
53 callbackRef = luaL_ref(L, LUA_REGISTRYINDEX);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
54 arg = lua_newuserdata(L, sizeof(*arg));
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
55 luaL_getmetatable(L, EVENT_CALLBACK_ARG_MT);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
56 lua_setmetatable(L, -2);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
57
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
58 arg->base = base;
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
59 arg->callbackRef = callbackRef;
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
60 /* Setup event... */
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
61 event_set(&arg->ev, fd, event | EV_PERSIST, luaevent_callback, arg);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
62 event_base_set(base->base, &arg->ev);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
63 event_add(&arg->ev, NULL);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
64 return 1;
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
65 }
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
66
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
67 static int luaevent_loop(lua_State* L) {
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
68 le_base *base = luaL_checkudata(L, 1, EVENT_BASE_MT);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
69 base->loop_L = L;
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
70 int ret = event_base_loop(base->base, 0);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
71 lua_pushinteger(L, ret);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
72 return 1;
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
73 }
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
74
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
75 static luaL_Reg base_funcs[] = {
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
76 { "addevent", luaevent_addevent },
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
77 { "loop", luaevent_loop },
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
78 { NULL, NULL }
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
79 };
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
80
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
81 static luaL_Reg funcs[] = {
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
82 { "new", luaevent_newbase },
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
83 { NULL, NULL }
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
84 };
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
85
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
86 typedef struct {
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
87 const char* name;
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
88 int value;
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
89 } namedInteger;
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
90
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
91 static namedInteger consts[] = {
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
92 {"LEAVE", -1},
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
93 {"EV_READ", EV_READ},
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
94 {"EV_WRITE", EV_WRITE},
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
95 {NULL, 0}
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
96 };
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
97
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
98 void setNamedIntegers(lua_State* L, namedInteger* p) {
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
99 while(p->name) {
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
100 lua_pushinteger(L, p->value);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
101 lua_setfield(L, -2, p->name);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
102 p++;
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
103 }
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
104 }
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
105
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
106 /* Verified ok */
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
107 int luaopen_luaevent_core(lua_State* L) {
20
71bc2e49366c Beginning refactoring of the event_callback outside of the core
Thomas Harning Jr <harningt@gmail.com>
parents: 19
diff changeset
108 /* Register external items */
71bc2e49366c Beginning refactoring of the event_callback outside of the core
Thomas Harning Jr <harningt@gmail.com>
parents: 19
diff changeset
109 event_callback_register(L);
13
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
110 /* Setup metatable */
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
111 luaL_newmetatable(L, EVENT_BASE_MT);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
112 lua_newtable(L);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
113 luaL_register(L, NULL, base_funcs);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
114 lua_setfield(L, -2, "__index");
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
115 lua_pushcfunction(L, luaevent_base_gc);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
116 lua_setfield(L, -2, "__gc");
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
117 lua_pop(L, 1);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
118
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
119 luaL_register(L, "luaevent.core", funcs);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
120 setNamedIntegers(L, consts);
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
121 return 1;
3e2ea1e7b2e8 Reformed project layout from 'luaevent/*' -> '*'
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
122 }

mercurial