ruby-lsapi 1.5 → 1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ext/lsapi/lsruby.c +26 -18
- metadata +2 -2
data/ext/lsapi/lsruby.c
CHANGED
@@ -45,6 +45,8 @@ static int s_cur_children = 0;
|
|
45
45
|
static int s_req_processed = 0;
|
46
46
|
static int s_max_reqs = 1000;
|
47
47
|
static int s_max_idle_secs = 60;
|
48
|
+
static int s_listenFd = -1;
|
49
|
+
static int s_ppid = 0;
|
48
50
|
|
49
51
|
static void lsapi_ruby_setenv(const char *name, const char *value)
|
50
52
|
{
|
@@ -158,17 +160,17 @@ static int lsapi_fork_child()
|
|
158
160
|
}
|
159
161
|
|
160
162
|
FD_ZERO( &readfds );
|
161
|
-
FD_SET(
|
163
|
+
FD_SET( s_listenFd, &readfds );
|
162
164
|
timeout.tv_sec = 0; timeout.tv_usec = 100000;
|
163
|
-
if ((ret = rb_thread_select(
|
165
|
+
if ((ret = rb_thread_select(s_listenFd+1, &readfds, NULL, NULL, &timeout)) == 1 )
|
164
166
|
{
|
165
167
|
if ( s_cur_children >= s_children )
|
166
168
|
{
|
167
169
|
usleep( 10 );
|
168
170
|
FD_ZERO( &readfds );
|
169
|
-
FD_SET(
|
171
|
+
FD_SET( s_listenFd, &readfds );
|
170
172
|
timeout.tv_sec = 0; timeout.tv_usec = 0;
|
171
|
-
if ( select(
|
173
|
+
if ( select(s_listenFd+1, &readfds, NULL, NULL, &timeout) == 0 )
|
172
174
|
continue;
|
173
175
|
}
|
174
176
|
}
|
@@ -177,7 +179,7 @@ static int lsapi_fork_child()
|
|
177
179
|
else
|
178
180
|
continue;
|
179
181
|
len = sizeof( achPeer );
|
180
|
-
g_req.m_fd = accept(
|
182
|
+
g_req.m_fd = accept( s_listenFd,
|
181
183
|
(struct sockaddr *)&achPeer, &len );
|
182
184
|
if ( g_req.m_fd != -1 )
|
183
185
|
{
|
@@ -189,9 +191,8 @@ static int lsapi_fork_child()
|
|
189
191
|
int pid = fork();
|
190
192
|
if ( !pid )
|
191
193
|
{
|
192
|
-
//close( g_req.m_fdListen );
|
193
|
-
//g_req.m_fdListen = -1;
|
194
194
|
s_children = 0;
|
195
|
+
s_ppid = getppid();
|
195
196
|
|
196
197
|
/* don't catch our signals */
|
197
198
|
sigaction( SIGCHLD, &old_child, 0 );
|
@@ -239,23 +240,30 @@ static VALUE lsapi_s_accept( VALUE self )
|
|
239
240
|
LSAPI_Finish_r( &g_req );
|
240
241
|
if ( s_children )
|
241
242
|
{
|
242
|
-
if (
|
243
|
+
if ( s_listenFd != -1 )
|
243
244
|
if ( lsapi_fork_child() == -1 )
|
244
245
|
return Qnil;
|
245
246
|
}
|
246
|
-
if ( s_req_processed
|
247
|
+
if ( s_req_processed >= s_max_reqs )
|
248
|
+
return Qnil;
|
249
|
+
while( 1 )
|
247
250
|
{
|
248
251
|
if ( g_req.m_fd != -1 )
|
249
252
|
{
|
250
253
|
fd = g_req.m_fd;
|
251
254
|
}
|
252
|
-
else if (
|
253
|
-
fd =
|
255
|
+
else if ( s_listenFd != -1 )
|
256
|
+
fd = s_listenFd;
|
254
257
|
else
|
255
258
|
return Qnil;
|
256
259
|
wait_secs = 0;
|
257
260
|
while( LSAPI_IsRunning() )
|
258
261
|
{
|
262
|
+
if ( s_ppid )
|
263
|
+
{
|
264
|
+
if ((kill(s_ppid, 0) == -1)&&(errno == ESRCH))
|
265
|
+
return Qnil;
|
266
|
+
}
|
259
267
|
FD_ZERO( &readfds );
|
260
268
|
FD_SET( fd, &readfds );
|
261
269
|
timeout.tv_sec = 1;
|
@@ -274,17 +282,14 @@ static VALUE lsapi_s_accept( VALUE self )
|
|
274
282
|
|
275
283
|
if ( !ret )
|
276
284
|
{
|
277
|
-
// req = Data_Make_Struct( self, lsapi_data, lsapi_mark, free, req_data );
|
278
|
-
// s_req = req;
|
279
|
-
// req_data->req = &g_req;
|
280
|
-
// rb_stdin = rb_stdout = req;
|
281
|
-
//#if RUBY_VERSION_CODE < 180
|
282
|
-
// rb_defout = req;
|
283
|
-
//#endif
|
284
285
|
++s_req_processed;
|
285
286
|
setup_cgi_env( s_req_data );
|
286
287
|
return s_req;
|
287
288
|
}
|
289
|
+
else if (( g_req.m_fd == -1 )&&( fd != s_listenFd ))
|
290
|
+
continue;
|
291
|
+
else
|
292
|
+
break;
|
288
293
|
}
|
289
294
|
return Qnil;
|
290
295
|
}
|
@@ -601,6 +606,9 @@ void Init_lsapi()
|
|
601
606
|
|
602
607
|
LSAPI_Init();
|
603
608
|
|
609
|
+
s_listenFd = g_req.m_fdListen;
|
610
|
+
g_req.m_fdListen = -1;
|
611
|
+
|
604
612
|
rb_define_global_function("eval_string_wrap", lsapi_eval_string_wrap, 1);
|
605
613
|
|
606
614
|
cLSAPI = rb_define_class("LSAPI", rb_cObject);
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ruby-lsapi
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: "1.
|
7
|
-
date: 2006-
|
6
|
+
version: "1.6"
|
7
|
+
date: 2006-08-22 00:00:00 -04:00
|
8
8
|
summary: A ruby extension for fast communication with LiteSpeed Web Server.
|
9
9
|
require_paths:
|
10
10
|
- lib
|