rhebok 0.8.6 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,6 +2,9 @@
2
2
  #include <time.h>
3
3
  #include <ctype.h>
4
4
  #include <poll.h>
5
+ #ifndef __need_IOV_MAX
6
+ #define __need_IOV_MAX
7
+ #endif
5
8
  #include <sys/uio.h>
6
9
  #include <errno.h>
7
10
  #include <limits.h>
@@ -14,6 +17,16 @@
14
17
  #include <arpa/inet.h>
15
18
  #include "picohttpparser/picohttpparser.c"
16
19
 
20
+ #ifndef IOV_MAX
21
+ #if defined(__FreeBSD__) || defined(__APPLE__)
22
+ # define IOV_MAX 128
23
+ #endif
24
+ #endif
25
+
26
+ #ifndef IOV_MAX
27
+ # error "Unable to determine IOV_MAX from system headers"
28
+ #endif
29
+
17
30
  #define MAX_HEADER_SIZE 16384
18
31
  #define MAX_HEADER_NAME_LEN 1024
19
32
  #define MAX_HEADERS 128
@@ -679,6 +692,7 @@ VALUE rhe_write_chunk(VALUE self, VALUE fileno, VALUE buf, VALUE offsetv, VALUE
679
692
  ssize_t written = 0;
680
693
  ssize_t vec_offset = 0;
681
694
  int count =0;
695
+ int remain;
682
696
  ssize_t iovcnt = 3;
683
697
  char chunked_header_buf[18];
684
698
 
@@ -700,7 +714,8 @@ VALUE rhe_write_chunk(VALUE self, VALUE fileno, VALUE buf, VALUE offsetv, VALUE
700
714
 
701
715
  vec_offset = 0;
702
716
  written = 0;
703
- while ( iovcnt - vec_offset > 0 ) {
717
+ remain = iovcnt;
718
+ while ( remain > 0 ) {
704
719
  count = (iovcnt > IOV_MAX) ? IOV_MAX : iovcnt;
705
720
  rv = _writev_timeout(NUM2INT(fileno), NUM2DBL(timeout), &v[vec_offset], count - vec_offset, (vec_offset == 0) ? 0 : 1);
706
721
  if ( rv <= 0 ) {
@@ -710,8 +725,9 @@ VALUE rhe_write_chunk(VALUE self, VALUE fileno, VALUE buf, VALUE offsetv, VALUE
710
725
  written += rv;
711
726
  while ( rv > 0 ) {
712
727
  if ( (unsigned int)rv >= v[vec_offset].iov_len ) {
713
- rv -= v[vec_offset].iov_len;
728
+ rv -= v[vec_offset].iov_len;
714
729
  vec_offset++;
730
+ remain--;
715
731
  }
716
732
  else {
717
733
  v[vec_offset].iov_base = (char*)v[vec_offset].iov_base + rv;
@@ -774,6 +790,7 @@ VALUE rhe_write_response(VALUE self, VALUE filenov, VALUE timeoutv, VALUE status
774
790
  ssize_t written;
775
791
  int count;
776
792
  int i;
793
+ int remain;
777
794
  char status_line[512];
778
795
  char date_line[512];
779
796
  char server_line[1032];
@@ -940,7 +957,8 @@ VALUE rhe_write_response(VALUE self, VALUE filenov, VALUE timeoutv, VALUE status
940
957
 
941
958
  vec_offset = 0;
942
959
  written = 0;
943
- while ( iovcnt - vec_offset > 0 ) {
960
+ remain = iovcnt;
961
+ while ( remain > 0 ) {
944
962
  count = (iovcnt > IOV_MAX) ? IOV_MAX : iovcnt;
945
963
  rv = _writev_timeout(fileno, timeout, &v[vec_offset], count - vec_offset, (vec_offset == 0) ? 0 : 1);
946
964
  if ( rv <= 0 ) {
@@ -950,8 +968,9 @@ VALUE rhe_write_response(VALUE self, VALUE filenov, VALUE timeoutv, VALUE status
950
968
  written += rv;
951
969
  while ( rv > 0 ) {
952
970
  if ( (unsigned int)rv >= v[vec_offset].iov_len ) {
953
- rv -= v[vec_offset].iov_len;
971
+ rv -= v[vec_offset].iov_len;
954
972
  vec_offset++;
973
+ remain--;
955
974
  }
956
975
  else {
957
976
  v[vec_offset].iov_base = (char*)v[vec_offset].iov_base + rv;
@@ -169,7 +169,10 @@ module Rack
169
169
  self.accept_loop(app)
170
170
  end
171
171
  end
172
- pe.wait_all_children
172
+
173
+ while pe.wait_all_children(1) > 0
174
+ pe.signal_all_children('TERM')
175
+ end
173
176
  end
174
177
 
175
178
  def _calc_reqs_per_child
@@ -200,17 +203,10 @@ module Rack
200
203
 
201
204
 
202
205
  def accept_loop(app)
203
- @can_exit = true
204
206
  @term_received = 0
205
207
  proc_req_count = 0
206
208
  Signal.trap(:TERM) do
207
209
  @term_received += 1
208
- if @can_exit
209
- exit!(true)
210
- end
211
- if @can_exit || @term_received > 1
212
- exit!(true)
213
- end
214
210
  end
215
211
  Signal.trap(:PIPE, "IGNORE")
216
212
  max_reqs = self._calc_reqs_per_child()
@@ -230,7 +226,9 @@ module Rack
230
226
  }
231
227
 
232
228
  while @options[:MaxRequestPerChild].to_i == 0 || proc_req_count < max_reqs
233
- @can_exit = true
229
+ if @term_received > 0
230
+ exit!(true)
231
+ end
234
232
  env = env_template.clone
235
233
  connection, buf = ::Rhebok.accept_rack(fileno, @options[:Timeout], @_is_tcp, env)
236
234
  if connection
@@ -238,7 +236,6 @@ module Rack
238
236
  buffer = nil
239
237
  begin
240
238
  proc_req_count += 1
241
- @can_exit = false
242
239
  # handle request
243
240
  if env.key?("CONTENT_LENGTH") && env["CONTENT_LENGTH"].to_i > 0
244
241
  cl = env["CONTENT_LENGTH"].to_i
@@ -336,9 +333,6 @@ module Rack
336
333
  end
337
334
  end #begin
338
335
  end # accept
339
- if @term_received > 0
340
- exit!(true)
341
- end
342
336
  end #while max_reqs
343
337
  end #def
344
338
 
@@ -1,3 +1,3 @@
1
1
  class Rhebok
2
- VERSION = "0.8.6"
2
+ VERSION = "0.9.0"
3
3
  end
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency "rake", "~> 10.0"
25
25
  spec.add_development_dependency "bacon"
26
26
  spec.add_dependency "rack"
27
- spec.add_dependency "prefork_engine", ">= 0.0.4"
27
+ spec.add_dependency "prefork_engine", ">= 0.0.6"
28
28
 
29
29
  # get an array of submodule dirs by executing 'pwd' inside each submodule
30
30
  `git submodule --quiet foreach pwd`.split($\).each do |submodule_path|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rhebok
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.6
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masahiro Nagano
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-26 00:00:00.000000000 Z
11
+ date: 2015-11-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: 0.0.4
75
+ version: 0.0.6
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: 0.0.4
82
+ version: 0.0.6
83
83
  description: High Performance and Optimized Preforked Rack Handler
84
84
  email:
85
85
  - kazeburo@gmail.com
@@ -97,9 +97,11 @@ files:
97
97
  - README.md
98
98
  - Rakefile
99
99
  - ext/rhebok/extconf.rb
100
+ - ext/rhebok/picohttpparser/.clang-format
100
101
  - ext/rhebok/picohttpparser/.gitattributes
101
102
  - ext/rhebok/picohttpparser/.gitmodules
102
103
  - ext/rhebok/picohttpparser/.travis.yml
104
+ - ext/rhebok/picohttpparser/Jamfile
103
105
  - ext/rhebok/picohttpparser/Makefile
104
106
  - ext/rhebok/picohttpparser/README.md
105
107
  - ext/rhebok/picohttpparser/bench.c
@@ -141,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
143
  version: '0'
142
144
  requirements: []
143
145
  rubyforge_project:
144
- rubygems_version: 2.4.5
146
+ rubygems_version: 2.4.5.1
145
147
  signing_key:
146
148
  specification_version: 4
147
149
  summary: High Performance Preforked Rack Handler