sleepy_penguin 1.3.0 → 1.3.1
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/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
|