ruby-lsapi 3.5 → 4.0

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.
@@ -3,4 +3,7 @@ dir_config( 'lsapi' )
3
3
  if ( have_library( "socket" ))
4
4
  have_library( "nsl" )
5
5
  end
6
+ if RUBY_VERSION =~ /1.9/ then
7
+ $CPPFLAGS += " -DRUBY_19"
8
+ end
6
9
  create_makefile( "lsapi" )
@@ -75,6 +75,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
75
75
  static int g_inited = 0;
76
76
  static int g_running = 1;
77
77
  static int s_ppid;
78
+ static int s_slow_req_msecs = 0;
78
79
  LSAPI_Request g_req = { -1, -1 };
79
80
 
80
81
  void Flush_RespBuf_r( LSAPI_Request * pReq );
@@ -532,11 +533,14 @@ static int parseRequest( LSAPI_Request * pReq, int totalLen )
532
533
  return 0;
533
534
  }
534
535
 
536
+ //OPTIMIZATION
537
+ static int s_accept_notify = 0;
538
+
535
539
  static struct lsapi_packet_header ack = {'L', 'S',
536
540
  LSAPI_REQ_RECEIVED, LSAPI_ENDIAN, {LSAPI_PACKET_HEADER_LEN} };
537
- static inline int notify_req_received( LSAPI_Request * pReq )
541
+ static inline int notify_req_received( int fd )
538
542
  {
539
- if ( write( pReq->m_fd, &ack, LSAPI_PACKET_HEADER_LEN )
543
+ if ( write( fd, &ack, LSAPI_PACKET_HEADER_LEN )
540
544
  < LSAPI_PACKET_HEADER_LEN )
541
545
  return -1;
542
546
  return 0;
@@ -587,7 +591,11 @@ static int readReq( LSAPI_Request * pReq )
587
591
  pReq->m_bufProcessed = packetLen;
588
592
  pReq->m_reqState = LSAPI_ST_REQ_BODY | LSAPI_ST_RESP_HEADER;
589
593
 
590
- return notify_req_received( pReq );
594
+ //OPTIMIZATION
595
+ if ( !s_accept_notify )
596
+ return notify_req_received( pReq->m_fd );
597
+ else
598
+ return 0;
591
599
  }
592
600
 
593
601
 
@@ -699,6 +707,9 @@ int LSAPI_Accept_r( LSAPI_Request * pReq )
699
707
  setsockopt(pReq->m_fd, IPPROTO_TCP, TCP_NODELAY,
700
708
  (char *)&nodelay, sizeof(nodelay));
701
709
  }
710
+ //OPTIMIZATION
711
+ if ( s_accept_notify )
712
+ return notify_req_received( pReq->m_fd );
702
713
  }
703
714
  }
704
715
  else
@@ -927,24 +938,36 @@ int LSAPI_Write_r( LSAPI_Request * pReq, const char * pBuf, int len )
927
938
  int bufLen;
928
939
  int toWrite;
929
940
  int packetLen;
941
+ int skip = 0;
930
942
 
931
943
  if ( !pReq || !pBuf || (pReq->m_fd == -1) )
932
944
  return -1;
933
- if ( len < pReq->m_pRespBufEnd - pReq->m_pRespBufPos )
934
- {
935
- memmove( pReq->m_pRespBufPos, pBuf, len );
936
- pReq->m_pRespBufPos += len;
937
- return len;
938
- }
939
-
940
945
  if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER )
941
946
  {
942
947
  LSAPI_FinalizeRespHeaders_r( pReq );
948
+ /*
949
+ if ( *pBuf == '\r' )
950
+ {
951
+ ++skip;
952
+ }
953
+ if ( *pBuf == '\n' )
954
+ {
955
+ ++skip;
956
+ }
957
+ */
943
958
  }
944
959
  pReq->m_reqState |= LSAPI_ST_RESP_BODY;
960
+
961
+ if ( (len - skip) < pReq->m_pRespBufEnd - pReq->m_pRespBufPos )
962
+ {
963
+ memmove( pReq->m_pRespBufPos, pBuf + skip, len - skip );
964
+ pReq->m_pRespBufPos += len - skip;
965
+ return len;
966
+ }
967
+
945
968
 
946
969
  pHeader = pReq->m_respPktHeader;
947
- p = pBuf;
970
+ p = pBuf + skip;
948
971
  pEnd = pBuf + len;
949
972
  bufLen = pReq->m_pRespBufPos - pReq->m_pRespBuf;
950
973
 
@@ -1384,6 +1407,16 @@ int LSAPI_AppendRespHeader_r( LSAPI_Request * pReq, char * pBuf, int len )
1384
1407
  return -1;
1385
1408
  if ( pReq->m_respHeader.m_respInfo.m_cntHeaders >= LSAPI_MAX_RESP_HEADERS )
1386
1409
  return -1;
1410
+ while( len > 0 )
1411
+ {
1412
+ char ch = *(pBuf + len - 1 );
1413
+ if (( ch == '\n' )||( ch == '\r' ))
1414
+ --len;
1415
+ else
1416
+ break;
1417
+ }
1418
+ if ( len <= 0 )
1419
+ return 0;
1387
1420
  if ( pReq->m_pRespHeaderBufPos + len + 1 > pReq->m_pRespHeaderBufEnd )
1388
1421
  {
1389
1422
  int newlen = pReq->m_pRespHeaderBufPos + len + 4096 - pReq->m_pRespHeaderBuf;
@@ -1646,6 +1679,9 @@ static int lsapi_accept( int fdListen )
1646
1679
  setsockopt( fd, IPPROTO_TCP, TCP_NODELAY,
1647
1680
  (char *)&nodelay, sizeof(nodelay));
1648
1681
  }
1682
+ //OPTIMIZATION
1683
+ if ( s_accept_notify )
1684
+ notify_req_received( fd );
1649
1685
  }
1650
1686
  return fd;
1651
1687
 
@@ -1955,6 +1991,11 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer, LSAPI_Re
1955
1991
 
1956
1992
  }
1957
1993
 
1994
+ void lsapi_error( char * pMessage, int err_no )
1995
+ {
1996
+ fprintf( stderr, "%d: %s, errno: %d (%s)\n", getpid(), pMessage, err_no, strerror( err_no ) );
1997
+ }
1998
+
1958
1999
  int LSAPI_Prefork_Accept_r( LSAPI_Request * pReq )
1959
2000
  {
1960
2001
  int fd;
@@ -1989,7 +2030,10 @@ int LSAPI_Prefork_Accept_r( LSAPI_Request * pReq )
1989
2030
  else if ( pReq->m_fdListen != -1 )
1990
2031
  fd = pReq->m_fdListen;
1991
2032
  else
2033
+ {
2034
+ lsapi_error( "no available fd", 0 );
1992
2035
  return -1;
2036
+ }
1993
2037
  wait_secs = 0;
1994
2038
  while( 1 )
1995
2039
  {
@@ -2037,6 +2081,7 @@ int LSAPI_Prefork_Accept_r( LSAPI_Request * pReq )
2037
2081
  {
2038
2082
  if (( errno == EINTR )||( errno == EAGAIN))
2039
2083
  continue;
2084
+ lsapi_error( "lsapi_accept() error", errno );
2040
2085
  return -1;
2041
2086
  }
2042
2087
  }
@@ -2100,6 +2145,16 @@ void LSAPI_Set_Server_Max_Idle_Secs( int serverMaxIdle )
2100
2145
  g_prefork_server->m_iServerMaxIdle = serverMaxIdle;
2101
2146
  }
2102
2147
 
2148
+ void LSAPI_Set_Slow_Req_Msecs( int msecs )
2149
+ {
2150
+ s_slow_req_msecs = msecs;
2151
+ }
2152
+
2153
+ int LSAPI_Get_Slow_Req_Msecs()
2154
+ {
2155
+ return s_slow_req_msecs;
2156
+ }
2157
+
2103
2158
 
2104
2159
  void LSAPI_No_Check_ppid()
2105
2160
  {
@@ -2154,6 +2209,19 @@ void LSAPI_Init_Env_Parameters( fn_select_t fp )
2154
2209
  avoidFork = atoi( p );
2155
2210
  }
2156
2211
 
2212
+ p = getenv( "LSAPI_ACCEPT_NOTIFY" );
2213
+ if ( p )
2214
+ {
2215
+ s_accept_notify = atoi( p );
2216
+ }
2217
+
2218
+ p = getenv( "LSAPI_SLOW_REQ_MSECS" );
2219
+ if ( p )
2220
+ {
2221
+ n = atoi( p );
2222
+ LSAPI_Set_Slow_Req_Msecs( n );
2223
+ }
2224
+
2157
2225
  #if defined( RLIMIT_CORE )
2158
2226
  p = getenv( "LSAPI_ALLOW_CORE_DUMP" );
2159
2227
  if ( !p )
@@ -331,6 +331,10 @@ void LSAPI_Set_Max_Process_Time( int secs );
331
331
 
332
332
  void LSAPI_Init_Env_Parameters( fn_select_t fp );
333
333
 
334
+ void LSAPI_Set_Slow_Req_Msecs( int msecs );
335
+
336
+ int LSAPI_Get_Slow_Req_Msecs( );
337
+
334
338
  #if defined (c_plusplus) || defined (__cplusplus)
335
339
  }
336
340
  #endif
@@ -1,6 +1,11 @@
1
1
 
2
2
  #include "ruby.h"
3
+
4
+ #ifdef RUBY_19
5
+ #include <ruby/util.h>
6
+ #else
3
7
  #include "util.h"
8
+ #endif
4
9
 
5
10
  #include "lsapilib.h"
6
11
  #include <errno.h>
@@ -251,10 +256,10 @@ static VALUE lsapi_write( VALUE self, VALUE str )
251
256
  lsapi_data *data;
252
257
  int len;
253
258
  Data_Get_Struct(self,lsapi_data, data);
254
- /* len = LSAPI_Write_r( data->req, RSTRING(str)->ptr, RSTRING(str)->len ); */
259
+ /* len = LSAPI_Write_r( data->req, RSTRING_PTR(str), RSTRING_LEN(str) ); */
255
260
  if (TYPE(str) != T_STRING)
256
261
  str = rb_obj_as_string(str);
257
- len = (*data->fn_write)( data->req, RSTRING(str)->ptr, RSTRING(str)->len );
262
+ len = (*data->fn_write)( data->req, RSTRING_PTR(str), RSTRING_LEN(str) );
258
263
  return INT2NUM( len );
259
264
  }
260
265
 
@@ -302,14 +307,35 @@ static VALUE lsapi_printf(int argc, VALUE *argv, VALUE out)
302
307
 
303
308
  static VALUE lsapi_puts _((int, VALUE*, VALUE));
304
309
 
310
+ #ifdef RUBY_19
311
+ static VALUE lsapi_puts_ary(VALUE ary, VALUE out, int recur )
312
+ {
313
+ VALUE tmp;
314
+ long i;
315
+
316
+ if (recur)
317
+ {
318
+ tmp = rb_str_new2("[...]");
319
+ rb_io_puts(1, &tmp, out);
320
+ return Qnil;
321
+ }
322
+ for (i=0; i<RARRAY_LEN(ary); i++)
323
+ {
324
+ tmp = RARRAY_PTR(ary)[i];
325
+ rb_io_puts(1, &tmp, out);
326
+ }
327
+ return Qnil;
328
+
329
+ }
330
+ #else
305
331
  static VALUE lsapi_puts_ary(VALUE ary, VALUE out)
306
332
  {
307
333
  VALUE tmp;
308
334
  int i;
309
335
 
310
- for (i=0; i<RARRAY(ary)->len; i++)
336
+ for (i=0; i<RARRAY_LEN(ary); i++)
311
337
  {
312
- tmp = RARRAY(ary)->ptr[i];
338
+ tmp = RARRAY_PTR(ary)[i];
313
339
  if (rb_inspecting_p(tmp))
314
340
  {
315
341
  tmp = rb_str_new2("[...]");
@@ -318,6 +344,7 @@ static VALUE lsapi_puts_ary(VALUE ary, VALUE out)
318
344
  }
319
345
  return Qnil;
320
346
  }
347
+ #endif
321
348
 
322
349
  static VALUE lsapi_puts(int argc, VALUE *argv, VALUE out)
323
350
  {
@@ -338,7 +365,11 @@ static VALUE lsapi_puts(int argc, VALUE *argv, VALUE out)
338
365
  line = rb_str_new2("nil");
339
366
  break;
340
367
  case T_ARRAY:
368
+ #ifdef RUBY_19
369
+ rb_exec_recursive(lsapi_puts_ary, argv[i], out);
370
+ #else
341
371
  rb_protect_inspect(lsapi_puts_ary, argv[i], out);
372
+ #endif
342
373
  continue;
343
374
  default:
344
375
  line = argv[i];
@@ -346,7 +377,7 @@ static VALUE lsapi_puts(int argc, VALUE *argv, VALUE out)
346
377
  }
347
378
  line = rb_obj_as_string(line);
348
379
  lsapi_write(out, line);
349
- if (RSTRING(line)->ptr[RSTRING(line)->len-1] != '\n')
380
+ if (*( RSTRING_PTR(line) + RSTRING_LEN(line) - 1 ) != '\n')
350
381
  {
351
382
  lsapi_write(out, rb_default_rs);
352
383
  }
@@ -410,7 +441,7 @@ static VALUE lsapi_gets( VALUE self )
410
441
  rb_str_buf_cat( str, buff, len );
411
442
 
412
443
  }
413
- if (RSTRING(str)->len == 0)
444
+ if (RSTRING_LEN(str) == 0)
414
445
  return Qnil;
415
446
  return str;
416
447
  }
@@ -455,7 +486,7 @@ static VALUE lsapi_read(int argc, VALUE *argv, VALUE self)
455
486
  break;
456
487
  }
457
488
  }
458
- if (RSTRING(str)->len == 0)
489
+ if (RSTRING_LEN(str) == 0)
459
490
  return Qnil;
460
491
  return str;
461
492
  }
@@ -619,6 +650,7 @@ void Init_lsapi()
619
650
  ruby_verbose = Qnil;
620
651
 
621
652
  lsapi_env = rb_hash_new();
653
+ clear_env();
622
654
  /* redefine ENV using a hash table, should be faster than char **environment */
623
655
  rb_define_global_const("ENV", lsapi_env);
624
656
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-lsapi
3
3
  version: !ruby/object:Gem::Version
4
- version: "3.5"
4
+ version: "4.0"
5
5
  platform: ruby
6
6
  authors:
7
7
  - LiteSpeed Technologies Inc.
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-05-14 00:00:00 -04:00
12
+ date: 2010-02-10 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies: []
15
15