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.
Files changed (2) hide show
  1. data/ext/lsapi/lsruby.c +26 -18
  2. 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( g_req.m_fdListen, &readfds );
163
+ FD_SET( s_listenFd, &readfds );
162
164
  timeout.tv_sec = 0; timeout.tv_usec = 100000;
163
- if ((ret = rb_thread_select(g_req.m_fdListen+1, &readfds, NULL, NULL, &timeout)) == 1 )
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( g_req.m_fdListen, &readfds );
171
+ FD_SET( s_listenFd, &readfds );
170
172
  timeout.tv_sec = 0; timeout.tv_usec = 0;
171
- if ( select(g_req.m_fdListen+1, &readfds, NULL, NULL, &timeout) == 0 )
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( g_req.m_fdListen,
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 ( g_req.m_fdListen != -1 )
243
+ if ( s_listenFd != -1 )
243
244
  if ( lsapi_fork_child() == -1 )
244
245
  return Qnil;
245
246
  }
246
- if ( s_req_processed < s_max_reqs )
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 ( g_req.m_fdListen != -1 )
253
- fd = g_req.m_fdListen;
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.5"
7
- date: 2006-07-20 00:00:00 -04:00
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