sleepy_penguin 1.3.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/GIT-VERSION-GEN +1 -1
- data/ext/sleepy_penguin/epoll.c +6 -1
- data/ext/sleepy_penguin/sleepy_penguin.h +21 -2
- data/lib/sleepy_penguin.rb +2 -2
- data/test/test_epoll_optimizations.rb +24 -0
- metadata +4 -4
data/GIT-VERSION-GEN
CHANGED
data/ext/sleepy_penguin/epoll.c
CHANGED
@@ -289,11 +289,15 @@ fallback_add:
|
|
289
289
|
static VALUE delete(VALUE self, VALUE io)
|
290
290
|
{
|
291
291
|
struct rb_epoll *ep = ep_get(self);
|
292
|
-
int fd
|
292
|
+
int fd;
|
293
293
|
int rv;
|
294
294
|
VALUE cur_io;
|
295
295
|
|
296
296
|
ep_check(ep);
|
297
|
+
if (my_io_closed(io))
|
298
|
+
goto out;
|
299
|
+
|
300
|
+
fd = my_fileno(io);
|
297
301
|
cur_io = rb_ary_entry(ep->marks, fd);
|
298
302
|
if (NIL_P(cur_io) || my_io_closed(cur_io))
|
299
303
|
return Qnil;
|
@@ -308,6 +312,7 @@ static VALUE delete(VALUE self, VALUE io)
|
|
308
312
|
rb_sys_fail("epoll_ctl - del");
|
309
313
|
}
|
310
314
|
}
|
315
|
+
out:
|
311
316
|
rb_ary_store(ep->marks, fd, Qnil);
|
312
317
|
rb_ary_store(ep->flag_cache, fd, Qnil);
|
313
318
|
|
@@ -26,18 +26,37 @@
|
|
26
26
|
# endif
|
27
27
|
#endif
|
28
28
|
|
29
|
+
static int fixint_closed_p(VALUE io)
|
30
|
+
{
|
31
|
+
return (fcntl(FIX2INT(io), F_GETFD) == -1 && errno == EBADF);
|
32
|
+
}
|
33
|
+
|
29
34
|
#if defined(RFILE) && defined(HAVE_ST_FD)
|
30
|
-
static int
|
35
|
+
static int my_rb_io_closed(VALUE io)
|
31
36
|
{
|
32
37
|
return RFILE(io)->fptr->fd < 0;
|
33
38
|
}
|
34
39
|
#else
|
35
|
-
static int
|
40
|
+
static int my_rb_io_closed(VALUE io)
|
36
41
|
{
|
37
42
|
return rb_funcall(io, rb_intern("closed?"), 0) == Qtrue;
|
38
43
|
}
|
39
44
|
#endif
|
40
45
|
|
46
|
+
static int my_io_closed(VALUE io)
|
47
|
+
{
|
48
|
+
switch (TYPE(io)) {
|
49
|
+
case T_FIXNUM:
|
50
|
+
return fixint_closed_p(io);
|
51
|
+
case T_FILE:
|
52
|
+
break;
|
53
|
+
default:
|
54
|
+
io = rb_convert_type(io, T_FILE, "IO", "to_io");
|
55
|
+
}
|
56
|
+
|
57
|
+
return my_rb_io_closed(io);
|
58
|
+
}
|
59
|
+
|
41
60
|
static int my_fileno(VALUE io)
|
42
61
|
{
|
43
62
|
rb_io_t *fptr;
|
data/lib/sleepy_penguin.rb
CHANGED
@@ -83,6 +83,30 @@ class TestEpollOptimizations < Test::Unit::TestCase
|
|
83
83
|
assert_equal 0, lines.grep(/^epoll_ctl/).size
|
84
84
|
end
|
85
85
|
|
86
|
+
def test_delete_closed_proxy
|
87
|
+
obj = Struct.new(:to_io).new(@wr)
|
88
|
+
rv = nil
|
89
|
+
@ep.add(obj, Epoll::OUT)
|
90
|
+
@wr.close
|
91
|
+
io, err = Strace.me { rv = @ep.delete(obj) }
|
92
|
+
lines = io.readlines; io.close
|
93
|
+
assert_nil err
|
94
|
+
assert_equal obj, rv
|
95
|
+
assert_equal 0, lines.grep(/^epoll_ctl/).size
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_delete_closed_fileno
|
99
|
+
fileno = @wr.fileno
|
100
|
+
@ep.add(fileno, Epoll::OUT)
|
101
|
+
@wr.close
|
102
|
+
rv = nil
|
103
|
+
io, err = Strace.me { rv = @ep.delete(fileno) }
|
104
|
+
lines = io.readlines; io.close
|
105
|
+
assert_nil err
|
106
|
+
assert_equal fileno, rv
|
107
|
+
assert_equal 0, lines.grep(/^epoll_ctl/).size
|
108
|
+
end
|
109
|
+
|
86
110
|
def test_delete_aliased_a
|
87
111
|
tmp = IO.for_fd @wr.fileno
|
88
112
|
IO_PURGATORY << tmp
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sleepy_penguin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 1.3.
|
9
|
+
- 1
|
10
|
+
version: 1.3.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- sleepy_penguin hackers
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-01-
|
18
|
+
date: 2011-01-22 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|