sleepy_penguin 1.1.1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/.manifest CHANGED
@@ -25,5 +25,6 @@ lib/sleepy_penguin.rb
25
25
  setup.rb
26
26
  sleepy_penguin.gemspec
27
27
  test/test_epoll.rb
28
+ test/test_epoll_gc.rb
28
29
  test/test_eventfd.rb
29
30
  test/test_timerfd.rb
data/ChangeLog CHANGED
@@ -1,5 +1,41 @@
1
1
  ChangeLog from http://git.bogomips.org/cgit/sleepy_penguin.git
2
2
 
3
+ commit 743560f8af768a65e6f286fecf80b6ebd91be812
4
+ Author: Eric Wong <e@yhbt.net>
5
+ Date: Sat Jan 15 11:54:15 2011 +0000
6
+
7
+ sleepy_penguin 1.2.0 - epoll GC help
8
+
9
+ One convenience fix:
10
+
11
+ epoll: prevent IO objects from getting GC-ed
12
+
13
+ Users of our code may forget to keep references for their IO
14
+ objects at all, and since it's not possible for GC to mark
15
+ kernel memory, we just hold on to the IO objects for them.
16
+
17
+ We can't unmark close()d file descriptors, ever, so we don't
18
+ bother with the EPOLL_CTL_DEL case, either. Just storing IO
19
+ objects in an array using the raw descriptor as a key will allow
20
+ bounded space usage just like the in-kernel FD tables as long
21
+ as the user remembers to close descriptors themselves.
22
+
23
+ commit 681c7b02f1e1d9ca70a5748ef986361840746c3d
24
+ Author: Eric Wong <e@yhbt.net>
25
+ Date: Sat Jan 15 11:46:13 2011 +0000
26
+
27
+ epoll: prevent IO objects from getting GC-ed
28
+
29
+ Users of our code may forget to keep references for their IO
30
+ objects at all, and since it's not possible for GC to mark
31
+ kernel memory, we just hold on to the IO objects for them.
32
+
33
+ We can't unmark close()d file descriptors, ever, so we don't
34
+ bother with the EPOLL_CTL_DEL case, either. Just storing IO
35
+ objects in an array using the raw descriptor as a key will allow
36
+ bounded space usage just like the in-kernel FD tables as long
37
+ as the user remembers to close descriptors themselves.
38
+
3
39
  commit ab4f1a27e5d2c1688a33870b6d070aaa510ccdbc
4
40
  Author: Eric Wong <normalperson@yhbt.net>
5
41
  Date: Thu Jan 13 14:26:58 2011 -0800
data/GIT-VERSION-FILE CHANGED
@@ -1 +1 @@
1
- GIT_VERSION = 1.1.1
1
+ GIT_VERSION = 1.2.0
data/GIT-VERSION-GEN CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/bin/sh
2
2
 
3
3
  GVF=GIT-VERSION-FILE
4
- DEF_VER=v1.1.1.GIT
4
+ DEF_VER=v1.2.0.GIT
5
5
 
6
6
  LF='
7
7
  '
data/LATEST CHANGED
@@ -1,8 +1,16 @@
1
- === sleepy_penguin 1.1.1 - soft feathers, soft delete / 2011-01-13 22:41 UTC
1
+ === sleepy_penguin 1.2.0 - epoll GC help / 2011-01-15 12:06 UTC
2
2
 
3
- SleepyPenguin::Epoll#delete method added for "soft" failures
4
- Documentation updates and cleanups, the website is now
5
- JavaScript-free!
3
+ One convenience fix:
6
4
 
7
- (Ignore the 1.1.0 "release", it was a lie)
5
+ epoll: prevent IO objects from getting GC-ed
6
+
7
+ Users of our code may forget to keep references for their IO
8
+ objects at all, and since it's not possible for GC to mark
9
+ kernel memory, we just hold on to the IO objects for them.
10
+
11
+ We can't unmark close()d file descriptors, ever, so we don't
12
+ bother with the EPOLL_CTL_DEL case, either. Just storing IO
13
+ objects in an array using the raw descriptor as a key will allow
14
+ bounded space usage just like the in-kernel FD tables as long
15
+ as the user remembers to close descriptors themselves.
8
16
 
data/NEWS CHANGED
@@ -1,3 +1,19 @@
1
+ === sleepy_penguin 1.2.0 - epoll GC help / 2011-01-15 12:06 UTC
2
+
3
+ One convenience fix:
4
+
5
+ epoll: prevent IO objects from getting GC-ed
6
+
7
+ Users of our code may forget to keep references for their IO
8
+ objects at all, and since it's not possible for GC to mark
9
+ kernel memory, we just hold on to the IO objects for them.
10
+
11
+ We can't unmark close()d file descriptors, ever, so we don't
12
+ bother with the EPOLL_CTL_DEL case, either. Just storing IO
13
+ objects in an array using the raw descriptor as a key will allow
14
+ bounded space usage just like the in-kernel FD tables as long
15
+ as the user remembers to close descriptors themselves.
16
+
1
17
  === sleepy_penguin 1.1.1 - soft feathers, soft delete / 2011-01-13 22:41 UTC
2
18
 
3
19
  SleepyPenguin::Epoll#delete method added for "soft" failures
@@ -50,6 +50,7 @@ struct rb_epoll {
50
50
  int capa;
51
51
  struct epoll_event *events;
52
52
  VALUE io;
53
+ VALUE marks;
53
54
  int flags;
54
55
  };
55
56
 
@@ -93,6 +94,7 @@ static void gcmark(void *ptr)
93
94
  struct rb_epoll *ep = ptr;
94
95
 
95
96
  rb_gc_mark(ep->io);
97
+ rb_gc_mark(ep->marks);
96
98
  }
97
99
 
98
100
  static void gcfree(void *ptr)
@@ -122,6 +124,7 @@ static VALUE alloc(VALUE klass)
122
124
  self = Data_Make_Struct(klass, struct rb_epoll, gcmark, gcfree, ep);
123
125
  ep->fd = -1;
124
126
  ep->io = Qnil;
127
+ ep->marks = rb_ary_new();
125
128
  ep->capa = step;
126
129
  ep->flags = EPOLL_CLOEXEC;
127
130
  ep->events = xmalloc(sizeof(struct epoll_event) * ep->capa);
@@ -201,6 +204,8 @@ static VALUE ctl(VALUE self, VALUE io, VALUE flags, int op)
201
204
  if (rv == -1)
202
205
  rb_sys_fail("epoll_ctl");
203
206
  }
207
+ if (op == EPOLL_CTL_ADD)
208
+ rb_ary_store(ep->marks, fd, io);
204
209
 
205
210
  return INT2NUM(rv);
206
211
  }
@@ -226,6 +231,8 @@ static VALUE set(VALUE self, VALUE io, VALUE flags)
226
231
  rv = epoll_ctl(ep->fd, EPOLL_CTL_ADD, fd, &event);
227
232
  if (rv == -1)
228
233
  rb_sys_fail("epoll_ctl - add");
234
+
235
+ rb_ary_store(ep->marks, fd, io);
229
236
  return INT2NUM(rv);
230
237
  }
231
238
  rb_sys_fail("epoll_ctl - mod");
@@ -514,6 +521,7 @@ static VALUE init_copy(VALUE copy, VALUE orig)
514
521
  NIL_P(b->io) && "Ruby broken?");
515
522
 
516
523
  ep_check(a);
524
+ b->marks = a->marks;
517
525
  b->flags = a->flags;
518
526
  b->fd = cloexec_dup(a);
519
527
  if (b->fd == -1) {
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: binary -*-
2
2
  module SleepyPenguin
3
3
 
4
- # the version of sleepy_penguin, currently 1.1.1
5
- SLEEPY_PENGUIN_VERSION = '1.1.1'
4
+ # the version of sleepy_penguin, currently 1.2.0
5
+ SLEEPY_PENGUIN_VERSION = '1.2.0'
6
6
  end
7
7
  require 'sleepy_penguin_ext'
@@ -0,0 +1,47 @@
1
+ require 'test/unit'
2
+ $-w = true
3
+
4
+ require 'sleepy_penguin'
5
+
6
+ class TestEpollGC < Test::Unit::TestCase
7
+ include SleepyPenguin
8
+
9
+ def setup
10
+ GC.stress = true if GC.respond_to?(:stress=)
11
+ @ep = Epoll.new
12
+ end
13
+
14
+ def teardown
15
+ GC.stress = false if GC.respond_to?(:stress=)
16
+ end
17
+
18
+ def add_pipe_no_tailcall(m, depth)
19
+ add_pipe(m, depth += 1)
20
+ end
21
+
22
+ def add_pipe(m, depth = 0)
23
+ if depth > 6000
24
+ rd, wr = IO.pipe
25
+ warn "wr: #{wr.fileno}"
26
+ @ep.__send__(m, wr, Epoll::OUT)
27
+ else
28
+ add_pipe_no_tailcall(m, depth + 1)
29
+ end
30
+ end
31
+
32
+ def test_gc_safety
33
+ done = false
34
+ begin
35
+ if done
36
+ x = nil
37
+ @ep.wait(nil, 10) { |flags, obj| p [ flags, x = obj ] }
38
+ assert x, "#{x.inspect}"
39
+ break
40
+ else
41
+ add_pipe(:add)
42
+ 2048.times { IO.pipe; File.open(__FILE__)}
43
+ done = true
44
+ end
45
+ end while true
46
+ end
47
+ end
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: 17
4
+ hash: 31
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
- - 1
9
- - 1
10
- version: 1.1.1
8
+ - 2
9
+ - 0
10
+ version: 1.2.0
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-13 00:00:00 +00:00
18
+ date: 2011-01-15 00:00:00 +00:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -81,6 +81,7 @@ files:
81
81
  - setup.rb
82
82
  - sleepy_penguin.gemspec
83
83
  - test/test_epoll.rb
84
+ - test/test_epoll_gc.rb
84
85
  - test/test_eventfd.rb
85
86
  - test/test_timerfd.rb
86
87
  has_rdoc: true
@@ -124,4 +125,5 @@ summary: Linux I/O events for Ruby
124
125
  test_files:
125
126
  - test/test_epoll.rb
126
127
  - test/test_eventfd.rb
128
+ - test/test_epoll_gc.rb
127
129
  - test/test_timerfd.rb