aboutsummaryrefslogtreecommitdiff
path: root/src/select.c
diff options
context:
space:
mode:
authorDiego Nehab <diego@tecgraf.puc-rio.br>2009-05-27 09:31:38 +0000
committerDiego Nehab <diego@tecgraf.puc-rio.br>2009-05-27 09:31:38 +0000
commitbce60be30fe8e9c1b0eb33128c23c93d7bca5303 (patch)
tree3927343c777fcb7764a0f2f89754a0ceab141c21 /src/select.c
parentd1a72435d5bd3528f3c334cd4d1da16dcead47bf (diff)
downloadluasocket-bce60be30fe8e9c1b0eb33128c23c93d7bca5303.tar.gz
luasocket-bce60be30fe8e9c1b0eb33128c23c93d7bca5303.tar.bz2
luasocket-bce60be30fe8e9c1b0eb33128c23c93d7bca5303.zip
Decent makefiles!
Diffstat (limited to 'src/select.c')
-rw-r--r--src/select.c39
1 files changed, 25 insertions, 14 deletions
diff --git a/src/select.c b/src/select.c
index 99b59f5..8e47d0e 100644
--- a/src/select.c
+++ b/src/select.c
@@ -18,8 +18,8 @@
18\*=========================================================================*/ 18\*=========================================================================*/
19static t_socket getfd(lua_State *L); 19static t_socket getfd(lua_State *L);
20static int dirty(lua_State *L); 20static int dirty(lua_State *L);
21static t_socket collect_fd(lua_State *L, int tab, t_socket max_fd, 21static void collect_fd(lua_State *L, int tab, int itab,
22 int itab, fd_set *set); 22 fd_set *set, t_socket *max_fd);
23static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set); 23static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set);
24static void return_fd(lua_State *L, fd_set *set, t_socket max_fd, 24static void return_fd(lua_State *L, fd_set *set, t_socket max_fd,
25 int itab, int tab, int start); 25 int itab, int tab, int start);
@@ -39,6 +39,9 @@ static luaL_reg func[] = {
39* Initializes module 39* Initializes module
40\*-------------------------------------------------------------------------*/ 40\*-------------------------------------------------------------------------*/
41int select_open(lua_State *L) { 41int select_open(lua_State *L) {
42 lua_pushstring(L, "_SETSIZE");
43 lua_pushnumber(L, FD_SETSIZE);
44 lua_rawset(L, -3);
42 luaL_openlib(L, NULL, func, 0); 45 luaL_openlib(L, NULL, func, 0);
43 return 0; 46 return 0;
44} 47}
@@ -51,7 +54,7 @@ int select_open(lua_State *L) {
51\*-------------------------------------------------------------------------*/ 54\*-------------------------------------------------------------------------*/
52static int global_select(lua_State *L) { 55static int global_select(lua_State *L) {
53 int rtab, wtab, itab, ret, ndirty; 56 int rtab, wtab, itab, ret, ndirty;
54 t_socket max_fd; 57 t_socket max_fd = SOCKET_INVALID;
55 fd_set rset, wset; 58 fd_set rset, wset;
56 t_timeout tm; 59 t_timeout tm;
57 double t = luaL_optnumber(L, 3, -1); 60 double t = luaL_optnumber(L, 3, -1);
@@ -60,12 +63,12 @@ static int global_select(lua_State *L) {
60 lua_newtable(L); itab = lua_gettop(L); 63 lua_newtable(L); itab = lua_gettop(L);
61 lua_newtable(L); rtab = lua_gettop(L); 64 lua_newtable(L); rtab = lua_gettop(L);
62 lua_newtable(L); wtab = lua_gettop(L); 65 lua_newtable(L); wtab = lua_gettop(L);
63 max_fd = collect_fd(L, 1, SOCKET_INVALID, itab, &rset); 66 collect_fd(L, 1, itab, &rset, &max_fd);
67 collect_fd(L, 2, itab, &wset, &max_fd);
64 ndirty = check_dirty(L, 1, rtab, &rset); 68 ndirty = check_dirty(L, 1, rtab, &rset);
65 t = ndirty > 0? 0.0: t; 69 t = ndirty > 0? 0.0: t;
66 timeout_init(&tm, t, -1); 70 timeout_init(&tm, t, -1);
67 timeout_markstart(&tm); 71 timeout_markstart(&tm);
68 max_fd = collect_fd(L, 2, max_fd, itab, &wset);
69 ret = socket_select(max_fd+1, &rset, &wset, NULL, &tm); 72 ret = socket_select(max_fd+1, &rset, &wset, NULL, &tm);
70 if (ret > 0 || ndirty > 0) { 73 if (ret > 0 || ndirty > 0) {
71 return_fd(L, &rset, max_fd+1, itab, rtab, ndirty); 74 return_fd(L, &rset, max_fd+1, itab, rtab, ndirty);
@@ -77,7 +80,7 @@ static int global_select(lua_State *L) {
77 lua_pushstring(L, "timeout"); 80 lua_pushstring(L, "timeout");
78 return 3; 81 return 3;
79 } else { 82 } else {
80 lua_pushstring(L, "error"); 83 luaL_error(L, "select failed");
81 return 3; 84 return 3;
82 } 85 }
83} 86}
@@ -112,11 +115,13 @@ static int dirty(lua_State *L) {
112 return is; 115 return is;
113} 116}
114 117
115static t_socket collect_fd(lua_State *L, int tab, t_socket max_fd, 118static void collect_fd(lua_State *L, int tab, int itab,
116 int itab, fd_set *set) { 119 fd_set *set, t_socket *max_fd) {
117 int i = 1; 120 int i = 1, n = 0;
118 if (lua_isnil(L, tab)) 121 /* nil is the same as an empty table */
119 return max_fd; 122 if (lua_isnil(L, tab)) return;
123 /* otherwise we need it to be a table */
124 luaL_checktype(L, tab, LUA_TTABLE);
120 while (1) { 125 while (1) {
121 t_socket fd; 126 t_socket fd;
122 lua_pushnumber(L, i); 127 lua_pushnumber(L, i);
@@ -125,11 +130,18 @@ static t_socket collect_fd(lua_State *L, int tab, t_socket max_fd,
125 lua_pop(L, 1); 130 lua_pop(L, 1);
126 break; 131 break;
127 } 132 }
133 /* getfd figures out if this is a socket */
128 fd = getfd(L); 134 fd = getfd(L);
129 if (fd != SOCKET_INVALID) { 135 if (fd != SOCKET_INVALID) {
136 /* make sure we don't overflow the fd_set */
137 if (n >= FD_SETSIZE)
138 luaL_argerror(L, tab, "too many sockets");
130 FD_SET(fd, set); 139 FD_SET(fd, set);
131 if (max_fd == SOCKET_INVALID || max_fd < fd) 140 n++;
132 max_fd = fd; 141 /* keep track of the largest descriptor so far */
142 if (*max_fd == SOCKET_INVALID || *max_fd < fd)
143 *max_fd = fd;
144 /* make sure we can map back from descriptor to the object */
133 lua_pushnumber(L, fd); 145 lua_pushnumber(L, fd);
134 lua_pushvalue(L, -2); 146 lua_pushvalue(L, -2);
135 lua_settable(L, itab); 147 lua_settable(L, itab);
@@ -137,7 +149,6 @@ static t_socket collect_fd(lua_State *L, int tab, t_socket max_fd,
137 lua_pop(L, 1); 149 lua_pop(L, 1);
138 i = i + 1; 150 i = i + 1;
139 } 151 }
140 return max_fd;
141} 152}
142 153
143static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set) { 154static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set) {