aboutsummaryrefslogtreecommitdiff
path: root/src/select.c
diff options
context:
space:
mode:
authorDiego Nehab <diego.nehab@gmail.com>2015-08-21 15:39:34 -0300
committerDiego Nehab <diego.nehab@gmail.com>2015-08-21 15:39:34 -0300
commite75444ccd1f30a3b5fbc7cec4a85e831bd0560ed (patch)
tree71475c18fee070c770fc0fe25d0859b7d54c8fbb /src/select.c
parent321c0c9b1f7b6b83cd83b58e7e259f53eca69373 (diff)
downloadluasocket-e75444ccd1f30a3b5fbc7cec4a85e831bd0560ed.tar.gz
luasocket-e75444ccd1f30a3b5fbc7cec4a85e831bd0560ed.tar.bz2
luasocket-e75444ccd1f30a3b5fbc7cec4a85e831bd0560ed.zip
New compat.h module implements luaL_setfuncs.
Makes initialization code simpler everywhere.
Diffstat (limited to 'src/select.c')
-rw-r--r--src/select.c29
1 files changed, 13 insertions, 16 deletions
diff --git a/src/select.c b/src/select.c
index fafaa62..d14c40a 100644
--- a/src/select.c
+++ b/src/select.c
@@ -6,6 +6,7 @@
6 6
7#include "lua.h" 7#include "lua.h"
8#include "lauxlib.h" 8#include "lauxlib.h"
9#include "compat.h"
9 10
10#include "socket.h" 11#include "socket.h"
11#include "timeout.h" 12#include "timeout.h"
@@ -16,10 +17,10 @@
16\*=========================================================================*/ 17\*=========================================================================*/
17static t_socket getfd(lua_State *L); 18static t_socket getfd(lua_State *L);
18static int dirty(lua_State *L); 19static int dirty(lua_State *L);
19static void collect_fd(lua_State *L, int tab, int itab, 20static void collect_fd(lua_State *L, int tab, int itab,
20 fd_set *set, t_socket *max_fd); 21 fd_set *set, t_socket *max_fd);
21static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set); 22static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set);
22static void return_fd(lua_State *L, fd_set *set, t_socket max_fd, 23static void return_fd(lua_State *L, fd_set *set, t_socket max_fd,
23 int itab, int tab, int start); 24 int itab, int tab, int start);
24static void make_assoc(lua_State *L, int tab); 25static void make_assoc(lua_State *L, int tab);
25static int global_select(lua_State *L); 26static int global_select(lua_State *L);
@@ -40,11 +41,7 @@ int select_open(lua_State *L) {
40 lua_pushstring(L, "_SETSIZE"); 41 lua_pushstring(L, "_SETSIZE");
41 lua_pushnumber(L, FD_SETSIZE); 42 lua_pushnumber(L, FD_SETSIZE);
42 lua_rawset(L, -3); 43 lua_rawset(L, -3);
43#if LUA_VERSION_NUM > 501 && !defined(LUA_COMPAT_MODULE)
44 luaL_setfuncs(L, func, 0); 44 luaL_setfuncs(L, func, 0);
45#else
46 luaL_openlib(L, NULL, func, 0);
47#endif
48 return 0; 45 return 0;
49} 46}
50 47
@@ -98,10 +95,10 @@ static t_socket getfd(lua_State *L) {
98 lua_pushvalue(L, -2); 95 lua_pushvalue(L, -2);
99 lua_call(L, 1, 1); 96 lua_call(L, 1, 1);
100 if (lua_isnumber(L, -1)) { 97 if (lua_isnumber(L, -1)) {
101 double numfd = lua_tonumber(L, -1); 98 double numfd = lua_tonumber(L, -1);
102 fd = (numfd >= 0.0)? (t_socket) numfd: SOCKET_INVALID; 99 fd = (numfd >= 0.0)? (t_socket) numfd: SOCKET_INVALID;
103 } 100 }
104 } 101 }
105 lua_pop(L, 1); 102 lua_pop(L, 1);
106 return fd; 103 return fd;
107} 104}
@@ -114,12 +111,12 @@ static int dirty(lua_State *L) {
114 lua_pushvalue(L, -2); 111 lua_pushvalue(L, -2);
115 lua_call(L, 1, 1); 112 lua_call(L, 1, 1);
116 is = lua_toboolean(L, -1); 113 is = lua_toboolean(L, -1);
117 } 114 }
118 lua_pop(L, 1); 115 lua_pop(L, 1);
119 return is; 116 return is;
120} 117}
121 118
122static void collect_fd(lua_State *L, int tab, int itab, 119static void collect_fd(lua_State *L, int tab, int itab,
123 fd_set *set, t_socket *max_fd) { 120 fd_set *set, t_socket *max_fd) {
124 int i = 1, n = 0; 121 int i = 1, n = 0;
125 /* nil is the same as an empty table */ 122 /* nil is the same as an empty table */
@@ -139,16 +136,16 @@ static void collect_fd(lua_State *L, int tab, int itab,
139 if (fd != SOCKET_INVALID) { 136 if (fd != SOCKET_INVALID) {
140 /* make sure we don't overflow the fd_set */ 137 /* make sure we don't overflow the fd_set */
141#ifdef _WIN32 138#ifdef _WIN32
142 if (n >= FD_SETSIZE) 139 if (n >= FD_SETSIZE)
143 luaL_argerror(L, tab, "too many sockets"); 140 luaL_argerror(L, tab, "too many sockets");
144#else 141#else
145 if (fd >= FD_SETSIZE) 142 if (fd >= FD_SETSIZE)
146 luaL_argerror(L, tab, "descriptor too large for set size"); 143 luaL_argerror(L, tab, "descriptor too large for set size");
147#endif 144#endif
148 FD_SET(fd, set); 145 FD_SET(fd, set);
149 n++; 146 n++;
150 /* keep track of the largest descriptor so far */ 147 /* keep track of the largest descriptor so far */
151 if (*max_fd == SOCKET_INVALID || *max_fd < fd) 148 if (*max_fd == SOCKET_INVALID || *max_fd < fd)
152 *max_fd = fd; 149 *max_fd = fd;
153 /* make sure we can map back from descriptor to the object */ 150 /* make sure we can map back from descriptor to the object */
154 lua_pushnumber(L, (lua_Number) fd); 151 lua_pushnumber(L, (lua_Number) fd);
@@ -162,9 +159,9 @@ static void collect_fd(lua_State *L, int tab, int itab,
162 159
163static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set) { 160static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set) {
164 int ndirty = 0, i = 1; 161 int ndirty = 0, i = 1;
165 if (lua_isnil(L, tab)) 162 if (lua_isnil(L, tab))
166 return 0; 163 return 0;
167 for ( ;; ) { 164 for ( ;; ) {
168 t_socket fd; 165 t_socket fd;
169 lua_pushnumber(L, i); 166 lua_pushnumber(L, i);
170 lua_gettable(L, tab); 167 lua_gettable(L, tab);
@@ -185,7 +182,7 @@ static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set) {
185 return ndirty; 182 return ndirty;
186} 183}
187 184
188static void return_fd(lua_State *L, fd_set *set, t_socket max_fd, 185static void return_fd(lua_State *L, fd_set *set, t_socket max_fd,
189 int itab, int tab, int start) { 186 int itab, int tab, int start) {
190 t_socket fd; 187 t_socket fd;
191 for (fd = 0; fd < max_fd; fd++) { 188 for (fd = 0; fd < max_fd; fd++) {