rhebok 0.8.6 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changes +5 -0
- data/ext/rhebok/picohttpparser/.clang-format +6 -0
- data/ext/rhebok/picohttpparser/Jamfile +7 -0
- data/ext/rhebok/picohttpparser/README.md +92 -0
- data/ext/rhebok/picohttpparser/bench.c +32 -19
- data/ext/rhebok/picohttpparser/picohttpparser.c +509 -342
- data/ext/rhebok/picohttpparser/picohttpparser.h +37 -14
- data/ext/rhebok/picohttpparser/test.c +366 -204
- data/ext/rhebok/rhebok.c +23 -4
- data/lib/rack/handler/rhebok.rb +7 -13
- data/lib/rhebok/version.rb +1 -1
- data/rhebok.gemspec +1 -1
- metadata +7 -5
data/ext/rhebok/rhebok.c
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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;
|
data/lib/rack/handler/rhebok.rb
CHANGED
@@ -169,7 +169,10 @@ module Rack
|
|
169
169
|
self.accept_loop(app)
|
170
170
|
end
|
171
171
|
end
|
172
|
-
|
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
|
-
@
|
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
|
|
data/lib/rhebok/version.rb
CHANGED
data/rhebok.gemspec
CHANGED
@@ -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.
|
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.
|
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-
|
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.
|
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.
|
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
|