rhebok 0.8.6 → 0.9.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.
@@ -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