kgio 2.0.0 → 2.1.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.
- data/.document +1 -0
- data/.gitignore +1 -0
- data/GIT-VERSION-GEN +1 -1
- data/GNUmakefile +15 -53
- data/Rakefile +2 -102
- data/ext/kgio/accept.c +66 -15
- data/ext/kgio/connect.c +1 -1
- data/ext/kgio/missing/accept4.h +9 -2
- data/ext/kgio/sock_for_fd.h +1 -1
- data/ext/kgio/wait.c +3 -2
- data/kgio.gemspec +11 -20
- data/test/test_accept_class.rb +10 -0
- metadata +24 -7
data/.document
CHANGED
data/.gitignore
CHANGED
data/GIT-VERSION-GEN
CHANGED
data/GNUmakefile
CHANGED
@@ -3,7 +3,6 @@ all::
|
|
3
3
|
RUBY = ruby
|
4
4
|
RAKE = rake
|
5
5
|
RSYNC = rsync
|
6
|
-
GIT_URL = git://git.bogomips.org/kgio.git
|
7
6
|
|
8
7
|
GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
|
9
8
|
@./GIT-VERSION-GEN
|
@@ -32,56 +31,22 @@ clean:
|
|
32
31
|
-$(MAKE) -C ext/kgio clean
|
33
32
|
$(RM) $(setup_rb_files) ext/kgio/Makefile
|
34
33
|
|
35
|
-
pkg_extra := GIT-VERSION-FILE NEWS ChangeLog
|
36
|
-
|
37
|
-
|
38
|
-
$(MAKE) .manifest
|
34
|
+
pkg_extra := GIT-VERSION-FILE NEWS ChangeLog LATEST
|
35
|
+
ChangeLog: GIT-VERSION-FILE .wrongdoc.yml
|
36
|
+
wrongdoc prepare
|
39
37
|
|
40
|
-
.manifest:
|
41
|
-
(git ls-files && \
|
42
|
-
|
43
|
-
do echo $$i; done) | LC_ALL=C sort > $@+
|
38
|
+
.manifest: ChangeLog
|
39
|
+
(git ls-files && for i in $@ $(pkg_extra); do echo $$i; done) | \
|
40
|
+
LC_ALL=C sort > $@+
|
44
41
|
cmp $@+ $@ || mv $@+ $@
|
45
42
|
$(RM) $@+
|
46
43
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
latest: NEWS
|
52
|
-
@awk 'BEGIN{RS="=== ";ORS=""}NR==2{sub(/\n$$/,"");print RS""$$0 }' $<
|
53
|
-
|
54
|
-
SINCE =
|
55
|
-
ChangeLog: LOG_VERSION = \
|
56
|
-
$(shell git rev-parse -q "$(GIT_VERSION)" >/dev/null 2>&1 && \
|
57
|
-
echo $(GIT_VERSION) || git describe)
|
58
|
-
ifneq ($(SINCE),)
|
59
|
-
ChangeLog: log_range = v$(SINCE)..$(LOG_VERSION)
|
60
|
-
endif
|
61
|
-
ChangeLog: GIT-VERSION-FILE
|
62
|
-
@echo "ChangeLog from $(GIT_URL) ($(log_range))" > $@+
|
63
|
-
@echo >> $@+
|
64
|
-
git log $(log_range) | sed -e 's/^/ /' >> $@+
|
65
|
-
mv $@+ $@
|
66
|
-
|
67
|
-
news_atom := http://bogomips.org/kgio/NEWS.atom.xml
|
68
|
-
cgit_atom := http://git.bogomips.org/cgit/kgio.git/atom/?h=master
|
69
|
-
atom = <link rel="alternate" title="Atom feed" href="$(1)" \
|
70
|
-
type="application/atom+xml"/>
|
71
|
-
|
72
|
-
# using rdoc 2.5.x
|
73
|
-
doc: .document NEWS ChangeLog
|
74
|
-
rdoc -t "$(shell sed -ne '1s/^= //p' README)"
|
44
|
+
doc: .document .wrongdoc.yml
|
45
|
+
find lib ext -type f -name '*.rbc' -exec rm -f '{}' ';'
|
46
|
+
$(RM) -r doc
|
47
|
+
wrongdoc all
|
75
48
|
install -m644 COPYING doc/COPYING
|
76
49
|
install -m644 $(shell grep '^[A-Z]' .document) doc/
|
77
|
-
$(RUBY) -i -p -e \
|
78
|
-
'$$_.gsub!("</title>",%q{\&$(call atom,$(cgit_atom))})' \
|
79
|
-
doc/ChangeLog.html
|
80
|
-
$(RUBY) -i -p -e \
|
81
|
-
'$$_.gsub!("</title>",%q{\&$(call atom,$(news_atom))})' \
|
82
|
-
doc/NEWS.html doc/README.html
|
83
|
-
$(RAKE) -s news_atom > doc/NEWS.atom.xml
|
84
|
-
cd doc && ln README.html tmp && mv tmp index.html
|
85
50
|
|
86
51
|
ifneq ($(VERSION),)
|
87
52
|
rfproject := rainbows
|
@@ -94,10 +59,10 @@ release_changes := release_changes-$(VERSION)
|
|
94
59
|
release-notes: $(release_notes)
|
95
60
|
release-changes: $(release_changes)
|
96
61
|
$(release_changes):
|
97
|
-
|
62
|
+
wrongdoc release_changes > $@+
|
98
63
|
$(VISUAL) $@+ && test -s $@+ && mv $@+ $@
|
99
64
|
$(release_notes):
|
100
|
-
|
65
|
+
wrongdoc release_notes > $@+
|
101
66
|
$(VISUAL) $@+ && test -s $@+ && mv $@+ $@
|
102
67
|
|
103
68
|
# ensures we're actually on the tagged $(VERSION), only used for release
|
@@ -170,10 +135,8 @@ $(test_units): build
|
|
170
135
|
# this requires GNU coreutils variants
|
171
136
|
publish_doc:
|
172
137
|
-git set-file-times
|
173
|
-
$(
|
174
|
-
|
175
|
-
$(MAKE) -s latest > doc/LATEST
|
176
|
-
find doc/images doc/js -type f | \
|
138
|
+
$(MAKE) doc
|
139
|
+
find doc/images -type f | \
|
177
140
|
TZ=UTC xargs touch -d '1970-01-01 00:00:00' doc/rdoc.css
|
178
141
|
$(MAKE) doc_gz
|
179
142
|
chmod 644 $$(find doc -type f)
|
@@ -184,8 +147,7 @@ publish_doc:
|
|
184
147
|
# "gzip_static on" can serve the gzipped versions directly.
|
185
148
|
doc_gz: docs = $(shell find doc -type f ! -regex '^.*\.\(gif\|jpg\|png\|gz\)$$')
|
186
149
|
doc_gz:
|
187
|
-
touch doc/NEWS.atom.xml -d "$$(awk 'NR==1{print $$4,$$5,$$6}' NEWS)"
|
188
150
|
for i in $(docs); do \
|
189
151
|
gzip --rsyncable -9 < $$i > $$i.gz; touch -r $$i $$i.gz; done
|
190
152
|
|
191
|
-
.PHONY: .FORCE-GIT-VERSION-FILE doc manifest
|
153
|
+
.PHONY: .FORCE-GIT-VERSION-FILE doc manifest test $(test_units)
|
data/Rakefile
CHANGED
@@ -1,106 +1,6 @@
|
|
1
1
|
# -*- encoding: binary -*-
|
2
|
-
|
3
|
-
# most tasks are in the GNUmakefile which offers better parallelism
|
4
|
-
|
5
|
-
def tags
|
6
|
-
timefmt = '%Y-%m-%dT%H:%M:%SZ'
|
7
|
-
@tags ||= `git tag -l`.split(/\n/).map do |tag|
|
8
|
-
if %r{\Av[\d\.]+} =~ tag
|
9
|
-
header, subject, body = `git cat-file tag #{tag}`.split(/\n\n/, 3)
|
10
|
-
header = header.split(/\n/)
|
11
|
-
tagger = header.grep(/\Atagger /).first
|
12
|
-
body ||= "initial"
|
13
|
-
{
|
14
|
-
:time => Time.at(tagger.split(/ /)[-2].to_i).utc.strftime(timefmt),
|
15
|
-
:tagger_name => %r{^tagger ([^<]+)}.match(tagger)[1].strip,
|
16
|
-
:tagger_email => %r{<([^>]+)>}.match(tagger)[1].strip,
|
17
|
-
:id => `git rev-parse refs/tags/#{tag}`.chomp!,
|
18
|
-
:tag => tag,
|
19
|
-
:subject => subject,
|
20
|
-
:body => body,
|
21
|
-
}
|
22
|
-
end
|
23
|
-
end.compact.sort { |a,b| b[:time] <=> a[:time] }
|
24
|
-
end
|
25
|
-
|
26
2
|
cgit_url = "http://git.bogomips.org/cgit/kgio.git"
|
27
|
-
git_url =
|
28
|
-
web_url = "http://bogomips.org/kgio"
|
29
|
-
|
30
|
-
desc 'prints news as an Atom feed'
|
31
|
-
task :news_atom do
|
32
|
-
require 'nokogiri'
|
33
|
-
new_tags = tags[0,10]
|
34
|
-
puts(Nokogiri::XML::Builder.new do
|
35
|
-
feed :xmlns => "http://www.w3.org/2005/Atom" do
|
36
|
-
id! "#{web_url}NEWS.atom.xml"
|
37
|
-
title "kgio news"
|
38
|
-
subtitle "socket methods using MSG_DONTWAIT and more"
|
39
|
-
link! :rel => "alternate", :type => "text/html",
|
40
|
-
:href => "#{web_url}NEWS.html"
|
41
|
-
updated(new_tags.empty? ? "1970-01-01T00:00:00Z" : new_tags.first[:time])
|
42
|
-
new_tags.each do |tag|
|
43
|
-
entry do
|
44
|
-
title tag[:subject]
|
45
|
-
updated tag[:time]
|
46
|
-
published tag[:time]
|
47
|
-
author {
|
48
|
-
name tag[:tagger_name]
|
49
|
-
email tag[:tagger_email]
|
50
|
-
}
|
51
|
-
url = "#{cgit_url}/tag/?id=#{tag[:tag]}"
|
52
|
-
link! :rel => "alternate", :type => "text/html", :href =>url
|
53
|
-
id! url
|
54
|
-
message_only = tag[:body].split(/\n.+\(\d+\):\n {6}/s).first.strip
|
55
|
-
content({:type =>:text}, message_only)
|
56
|
-
content(:type =>:xhtml) { pre tag[:body] }
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end.to_xml)
|
61
|
-
end
|
62
|
-
|
63
|
-
desc 'prints RDoc-formatted news'
|
64
|
-
task :news_rdoc do
|
65
|
-
tags.each do |tag|
|
66
|
-
time = tag[:time].tr!('T', ' ').gsub!(/:\d\dZ/, ' UTC')
|
67
|
-
puts "=== #{tag[:tag].sub(/^v/, '')} / #{time}"
|
68
|
-
puts ""
|
69
|
-
|
70
|
-
body = tag[:body]
|
71
|
-
puts tag[:body].gsub(/^/sm, " ").gsub(/[ \t]+$/sm, "")
|
72
|
-
puts ""
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
desc "print release changelog for Rubyforge"
|
77
|
-
task :release_changes do
|
78
|
-
version = ENV['VERSION'] or abort "VERSION= needed"
|
79
|
-
version = "v#{version}"
|
80
|
-
vtags = tags.map { |tag| tag[:tag] =~ /\Av/ and tag[:tag] }.sort
|
81
|
-
prev = vtags[vtags.index(version) - 1]
|
82
|
-
if prev
|
83
|
-
system('git', 'diff', '--stat', prev, version) or abort $?
|
84
|
-
puts ""
|
85
|
-
system('git', 'log', "#{prev}..#{version}") or abort $?
|
86
|
-
else
|
87
|
-
system('git', 'log', version) or abort $?
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
desc "print release notes for Rubyforge"
|
92
|
-
task :release_notes do
|
93
|
-
spec = Gem::Specification.load('kgio.gemspec')
|
94
|
-
puts spec.description.strip
|
95
|
-
puts ""
|
96
|
-
puts "* #{spec.homepage}"
|
97
|
-
puts "* #{spec.email}"
|
98
|
-
puts "* #{git_url}"
|
99
|
-
|
100
|
-
_, _, body = `git cat-file tag v#{spec.version}`.split(/\n\n/, 3)
|
101
|
-
print "\nChanges:\n\n"
|
102
|
-
puts body
|
103
|
-
end
|
3
|
+
git_url = 'git://git.bogomips.org/kgio.git'
|
104
4
|
|
105
5
|
desc "post news article to rubyforge"
|
106
6
|
task :publish_news do
|
@@ -157,7 +57,7 @@ task :raa_update do
|
|
157
57
|
:category_minor => 'System',
|
158
58
|
:url => s.homepage,
|
159
59
|
:download => 'http://rubyforge.org/frs/?group_id=8977',
|
160
|
-
:license => "
|
60
|
+
:license => "LGPL",
|
161
61
|
:description_style => 'Plain',
|
162
62
|
:description => desc,
|
163
63
|
:pass => password,
|
data/ext/kgio/accept.c
CHANGED
@@ -20,6 +20,11 @@ struct accept_args {
|
|
20
20
|
socklen_t *addrlen;
|
21
21
|
};
|
22
22
|
|
23
|
+
/*
|
24
|
+
* Sets the default class for newly accepted sockets. This is
|
25
|
+
* legacy behavior, kgio_accept and kgio_tryaccept now take optional
|
26
|
+
* class arguments to override this value.
|
27
|
+
*/
|
23
28
|
static VALUE set_accepted(VALUE klass, VALUE aclass)
|
24
29
|
{
|
25
30
|
VALUE tmp;
|
@@ -39,6 +44,10 @@ static VALUE set_accepted(VALUE klass, VALUE aclass)
|
|
39
44
|
return aclass;
|
40
45
|
}
|
41
46
|
|
47
|
+
/*
|
48
|
+
* Returns the default class for newly accepted sockets when kgio_accept
|
49
|
+
* or kgio_tryaccept are not passed arguments
|
50
|
+
*/
|
42
51
|
static VALUE get_accepted(VALUE klass)
|
43
52
|
{
|
44
53
|
return cClientSocket;
|
@@ -47,8 +56,15 @@ static VALUE get_accepted(VALUE klass)
|
|
47
56
|
static VALUE xaccept(void *ptr)
|
48
57
|
{
|
49
58
|
struct accept_args *a = ptr;
|
59
|
+
int rv;
|
50
60
|
|
51
|
-
|
61
|
+
rv = accept_fn(a->fd, a->addr, a->addrlen, accept4_flags);
|
62
|
+
if (rv == -1 && errno == ENOSYS && accept_fn != my_accept4) {
|
63
|
+
accept_fn = my_accept4;
|
64
|
+
rv = accept_fn(a->fd, a->addr, a->addrlen, accept4_flags);
|
65
|
+
}
|
66
|
+
|
67
|
+
return (VALUE)rv;
|
52
68
|
}
|
53
69
|
|
54
70
|
#ifdef HAVE_RB_THREAD_BLOCKING_REGION
|
@@ -107,8 +123,19 @@ static int thread_accept(struct accept_args *a, int force_nonblock)
|
|
107
123
|
#define set_blocking_or_block(fd) (void)rb_io_wait_readable(fd)
|
108
124
|
#endif /* ! HAVE_RB_THREAD_BLOCKING_REGION */
|
109
125
|
|
126
|
+
static VALUE acceptor(int argc, const VALUE *argv)
|
127
|
+
{
|
128
|
+
if (argc == 0)
|
129
|
+
return cClientSocket; /* default, legacy behavior */
|
130
|
+
else if (argc == 1)
|
131
|
+
return argv[0];
|
132
|
+
|
133
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
|
134
|
+
}
|
135
|
+
|
110
136
|
static VALUE
|
111
|
-
my_accept(VALUE io,
|
137
|
+
my_accept(VALUE io, VALUE klass,
|
138
|
+
struct sockaddr *addr, socklen_t *addrlen, int nonblock)
|
112
139
|
{
|
113
140
|
int client;
|
114
141
|
struct accept_args a;
|
@@ -148,7 +175,7 @@ retry:
|
|
148
175
|
rb_sys_fail("accept");
|
149
176
|
}
|
150
177
|
}
|
151
|
-
return sock_for_fd(
|
178
|
+
return sock_for_fd(klass, client);
|
152
179
|
}
|
153
180
|
|
154
181
|
static void in_addr_set(VALUE io, struct sockaddr_in *addr)
|
@@ -175,12 +202,18 @@ static void in_addr_set(VALUE io, struct sockaddr_in *addr)
|
|
175
202
|
* connected client on success.
|
176
203
|
*
|
177
204
|
* Returns nil on EAGAIN, and raises on other errors.
|
205
|
+
*
|
206
|
+
* An optional class argument may be specified to override the
|
207
|
+
* Kgio::Socket-class return value:
|
208
|
+
*
|
209
|
+
* server.kgio_accept(MySocket) -> MySocket
|
178
210
|
*/
|
179
|
-
static VALUE tcp_tryaccept(VALUE io)
|
211
|
+
static VALUE tcp_tryaccept(int argc, VALUE *argv, VALUE io)
|
180
212
|
{
|
181
213
|
struct sockaddr_in addr;
|
182
214
|
socklen_t addrlen = sizeof(struct sockaddr_in);
|
183
|
-
VALUE
|
215
|
+
VALUE klass = acceptor(argc, argv);
|
216
|
+
VALUE rv = my_accept(io, klass, (struct sockaddr *)&addr, &addrlen, 1);
|
184
217
|
|
185
218
|
if (!NIL_P(rv))
|
186
219
|
in_addr_set(rv, &addr);
|
@@ -199,12 +232,18 @@ static VALUE tcp_tryaccept(VALUE io)
|
|
199
232
|
*
|
200
233
|
* On Ruby implementations using native threads, this can use a blocking
|
201
234
|
* accept(2) (or accept4(2)) system call to avoid thundering herds.
|
235
|
+
*
|
236
|
+
* An optional class argument may be specified to override the
|
237
|
+
* Kgio::Socket-class return value:
|
238
|
+
*
|
239
|
+
* server.kgio_accept(MySocket) -> MySocket
|
202
240
|
*/
|
203
|
-
static VALUE tcp_accept(VALUE io)
|
241
|
+
static VALUE tcp_accept(int argc, VALUE *argv, VALUE io)
|
204
242
|
{
|
205
243
|
struct sockaddr_in addr;
|
206
244
|
socklen_t addrlen = sizeof(struct sockaddr_in);
|
207
|
-
VALUE
|
245
|
+
VALUE klass = acceptor(argc, argv);
|
246
|
+
VALUE rv = my_accept(io, klass, (struct sockaddr *)&addr, &addrlen, 0);
|
208
247
|
|
209
248
|
in_addr_set(rv, &addr);
|
210
249
|
return rv;
|
@@ -221,10 +260,16 @@ static VALUE tcp_accept(VALUE io)
|
|
221
260
|
* Kgio::LOCALHOST) on success.
|
222
261
|
*
|
223
262
|
* Returns nil on EAGAIN, and raises on other errors.
|
263
|
+
*
|
264
|
+
* An optional class argument may be specified to override the
|
265
|
+
* Kgio::Socket-class return value:
|
266
|
+
*
|
267
|
+
* server.kgio_tryaccept(MySocket) -> MySocket
|
224
268
|
*/
|
225
|
-
static VALUE unix_tryaccept(VALUE io)
|
269
|
+
static VALUE unix_tryaccept(int argc, VALUE *argv, VALUE io)
|
226
270
|
{
|
227
|
-
VALUE
|
271
|
+
VALUE klass = acceptor(argc, argv);
|
272
|
+
VALUE rv = my_accept(io, klass, NULL, NULL, 1);
|
228
273
|
|
229
274
|
if (!NIL_P(rv))
|
230
275
|
rb_ivar_set(rv, iv_kgio_addr, localhost);
|
@@ -243,10 +288,16 @@ static VALUE unix_tryaccept(VALUE io)
|
|
243
288
|
*
|
244
289
|
* On Ruby implementations using native threads, this can use a blocking
|
245
290
|
* accept(2) (or accept4(2)) system call to avoid thundering herds.
|
291
|
+
*
|
292
|
+
* An optional class argument may be specified to override the
|
293
|
+
* Kgio::Socket-class return value:
|
294
|
+
*
|
295
|
+
* server.kgio_accept(MySocket) -> MySocket
|
246
296
|
*/
|
247
|
-
static VALUE unix_accept(VALUE io)
|
297
|
+
static VALUE unix_accept(int argc, VALUE *argv, VALUE io)
|
248
298
|
{
|
249
|
-
VALUE
|
299
|
+
VALUE klass = acceptor(argc, argv);
|
300
|
+
VALUE rv = my_accept(io, klass, NULL, NULL, 0);
|
250
301
|
|
251
302
|
rb_ivar_set(rv, iv_kgio_addr, localhost);
|
252
303
|
return rv;
|
@@ -360,13 +411,13 @@ void init_kgio_accept(void)
|
|
360
411
|
|
361
412
|
cUNIXServer = rb_const_get(rb_cObject, rb_intern("UNIXServer"));
|
362
413
|
cUNIXServer = rb_define_class_under(mKgio, "UNIXServer", cUNIXServer);
|
363
|
-
rb_define_method(cUNIXServer, "kgio_tryaccept", unix_tryaccept,
|
364
|
-
rb_define_method(cUNIXServer, "kgio_accept", unix_accept,
|
414
|
+
rb_define_method(cUNIXServer, "kgio_tryaccept", unix_tryaccept, -1);
|
415
|
+
rb_define_method(cUNIXServer, "kgio_accept", unix_accept, -1);
|
365
416
|
|
366
417
|
cTCPServer = rb_const_get(rb_cObject, rb_intern("TCPServer"));
|
367
418
|
cTCPServer = rb_define_class_under(mKgio, "TCPServer", cTCPServer);
|
368
|
-
rb_define_method(cTCPServer, "kgio_tryaccept", tcp_tryaccept,
|
369
|
-
rb_define_method(cTCPServer, "kgio_accept", tcp_accept,
|
419
|
+
rb_define_method(cTCPServer, "kgio_tryaccept", tcp_tryaccept, -1);
|
420
|
+
rb_define_method(cTCPServer, "kgio_accept", tcp_accept, -1);
|
370
421
|
init_sock_for_fd();
|
371
422
|
iv_kgio_addr = rb_intern("@kgio_addr");
|
372
423
|
}
|
data/ext/kgio/connect.c
CHANGED
@@ -119,7 +119,7 @@ static VALUE unix_connect(VALUE klass, VALUE path, int io_wait)
|
|
119
119
|
|
120
120
|
StringValue(path);
|
121
121
|
len = RSTRING_LEN(path);
|
122
|
-
if (sizeof(addr.sun_path) <= len)
|
122
|
+
if ((long)sizeof(addr.sun_path) <= len)
|
123
123
|
rb_raise(rb_eArgError,
|
124
124
|
"too long unix socket path (max: %dbytes)",
|
125
125
|
(int)sizeof(addr.sun_path)-1);
|
data/ext/kgio/missing/accept4.h
CHANGED
@@ -13,10 +13,11 @@
|
|
13
13
|
# define SOCK_NONBLOCK O_NONBLOCK
|
14
14
|
# endif
|
15
15
|
# endif
|
16
|
+
#endif /* !HAVE_ACCEPT4 */
|
16
17
|
|
17
18
|
/* accept4() is currently a Linux-only goodie */
|
18
19
|
static int
|
19
|
-
|
20
|
+
my_accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags)
|
20
21
|
{
|
21
22
|
int fd = accept(sockfd, addr, addrlen);
|
22
23
|
|
@@ -49,4 +50,10 @@ accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags)
|
|
49
50
|
}
|
50
51
|
return fd;
|
51
52
|
}
|
52
|
-
|
53
|
+
|
54
|
+
typedef int accept_fn_t(int, struct sockaddr *, socklen_t *, int);
|
55
|
+
#ifdef HAVE_ACCEPT4
|
56
|
+
static accept_fn_t *accept_fn = accept4;
|
57
|
+
#else
|
58
|
+
static accept_fn_t *accept_fn = my_accept4;
|
59
|
+
#endif
|
data/ext/kgio/sock_for_fd.h
CHANGED
data/ext/kgio/wait.c
CHANGED
@@ -11,7 +11,7 @@ static ID id_wait_rd, id_wait_wr;
|
|
11
11
|
|
12
12
|
|
13
13
|
/*
|
14
|
-
* Blocks the running Thread indefinitely until +self+ IO object is
|
14
|
+
* Blocks the running Thread indefinitely until +self+ IO object is readable.
|
15
15
|
* This method is automatically called by default whenever kgio_read needs
|
16
16
|
* to block on input.
|
17
17
|
*
|
@@ -29,9 +29,10 @@ static VALUE kgio_wait_readable(VALUE self)
|
|
29
29
|
}
|
30
30
|
|
31
31
|
/*
|
32
|
-
*
|
32
|
+
* Blocks the running Thread indefinitely until +self+ IO object is writable.
|
33
33
|
* This method is automatically called whenever kgio_write needs to
|
34
34
|
* block on output.
|
35
|
+
*
|
35
36
|
* Users of alternative threading/fiber libraries are
|
36
37
|
* encouraged to override this method in their subclasses or modules to
|
37
38
|
* work with their threading/blocking methods.
|
data/kgio.gemspec
CHANGED
@@ -1,36 +1,27 @@
|
|
1
1
|
ENV["VERSION"] or abort "VERSION= must be specified"
|
2
2
|
manifest = File.readlines('.manifest').map! { |x| x.chomp! }
|
3
|
-
|
4
|
-
|
3
|
+
require 'wrongdoc'
|
4
|
+
extend Wrongdoc::Gemspec
|
5
|
+
name, summary, title = readme_metadata
|
5
6
|
|
6
7
|
Gem::Specification.new do |s|
|
7
8
|
s.name = %q{kgio}
|
8
|
-
s.version = ENV["VERSION"]
|
9
|
-
|
10
|
-
s.
|
11
|
-
s.authors = ["kgio hackers"]
|
9
|
+
s.version = ENV["VERSION"].dup
|
10
|
+
s.homepage = Wrongdoc.config[:rdoc_url]
|
11
|
+
s.authors = ["#{name} hackers"]
|
12
12
|
s.date = Time.now.utc.strftime('%Y-%m-%d')
|
13
|
-
s.description =
|
13
|
+
s.description = readme_description
|
14
14
|
s.email = %q{kgio@bogomips.org}
|
15
|
-
|
16
|
-
s.extra_rdoc_files = File.readlines('.document').map! do |x|
|
17
|
-
x.chomp!
|
18
|
-
if File.directory?(x)
|
19
|
-
manifest.grep(%r{\A#{x}/})
|
20
|
-
elsif File.file?(x)
|
21
|
-
x
|
22
|
-
else
|
23
|
-
nil
|
24
|
-
end
|
25
|
-
end.flatten.compact
|
26
|
-
|
15
|
+
s.extra_rdoc_files = extra_rdoc_files(manifest)
|
27
16
|
s.files = manifest
|
28
|
-
s.rdoc_options =
|
17
|
+
s.rdoc_options = rdoc_options
|
29
18
|
s.require_paths = %w(lib ext)
|
30
19
|
s.rubyforge_project = %q{rainbows}
|
31
20
|
s.summary = summary
|
32
21
|
s.test_files = Dir['test/test_*.rb']
|
33
22
|
s.extensions = %w(ext/kgio/extconf.rb)
|
34
23
|
|
24
|
+
s.add_development_dependency('wrongdoc', '~> 1.0.1')
|
25
|
+
|
35
26
|
# s.license = %w(LGPL) # disabled for compatibility with older RubyGems
|
36
27
|
end
|
data/test/test_accept_class.rb
CHANGED
@@ -4,6 +4,9 @@ $-w = true
|
|
4
4
|
require 'kgio'
|
5
5
|
|
6
6
|
class TestAcceptClass < Test::Unit::TestCase
|
7
|
+
class FooSocket < Kgio::Socket
|
8
|
+
end
|
9
|
+
|
7
10
|
def setup
|
8
11
|
assert_equal Kgio::Socket, Kgio.accept_class
|
9
12
|
end
|
@@ -48,5 +51,12 @@ class TestAcceptClass < Test::Unit::TestCase
|
|
48
51
|
client = TCPSocket.new(@host, @port)
|
49
52
|
IO.select([@srv])
|
50
53
|
assert_instance_of Kgio::UNIXSocket, @srv.kgio_tryaccept
|
54
|
+
|
55
|
+
client = TCPSocket.new(@host, @port)
|
56
|
+
assert_instance_of FooSocket, @srv.kgio_accept(FooSocket)
|
57
|
+
|
58
|
+
client = TCPSocket.new(@host, @port)
|
59
|
+
IO.select([@srv])
|
60
|
+
assert_instance_of FooSocket, @srv.kgio_tryaccept(FooSocket)
|
51
61
|
end
|
52
62
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kgio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 11
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 2
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 2.0.0
|
10
|
+
version: 2.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- kgio hackers
|
@@ -15,10 +15,25 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-12-26 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
|
-
dependencies:
|
21
|
-
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: wrongdoc
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 21
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 0
|
33
|
+
- 1
|
34
|
+
version: 1.0.1
|
35
|
+
type: :development
|
36
|
+
version_requirements: *id001
|
22
37
|
description: |-
|
23
38
|
kgio provides non-blocking I/O methods for Ruby without raising
|
24
39
|
exceptions on EAGAIN and EINPROGRESS. It is intended for use with the
|
@@ -97,7 +112,9 @@ licenses: []
|
|
97
112
|
post_install_message:
|
98
113
|
rdoc_options:
|
99
114
|
- -t
|
100
|
-
- kinder, gentler I/O for Ruby
|
115
|
+
- kgio - kinder, gentler I/O for Ruby
|
116
|
+
- -W
|
117
|
+
- http://git.bogomips.org/cgit/kgio.git/tree/%s
|
101
118
|
require_paths:
|
102
119
|
- lib
|
103
120
|
- ext
|