Revert "epoll: avoid EPOLL_CTL_MOD race condition"
[sleepy_penguin.git] / test / test_epoll_gc.rb
blobb0a1868c72e838d13fd11bab9ca4e4e253be57a7
1 require 'test/unit'
2 $-w = true
4 require 'sleepy_penguin'
6 class TestEpollGC < Test::Unit::TestCase
7   include SleepyPenguin
9   def setup
10     GC.stress = true if GC.respond_to?(:stress=)
11     @ep = Epoll.new
12   end
14   def teardown
15     GC.stress = false if GC.respond_to?(:stress=)
16   end
18   def add_pipe_no_tailcall(m, depth)
19     add_pipe(m, depth += 1)
20   end
22   def add_pipe(m, depth = 0)
23     if depth > 6000
24       _, 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
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 if ENV["GC_STRESS"].to_i != 0