sleepy_penguin 3.5.2
[sleepy_penguin.git] / test / test_epoll_gc.rb
blobcebf24ecb648d2a14bf80c90726956d7c0c74e9d
1 require_relative 'helper'
3 class TestEpollGC < Test::Unit::TestCase
4   include SleepyPenguin
6   def setup
7     GC.stress = true if GC.respond_to?(:stress=)
8     @ep = Epoll.new
9   end
11   def teardown
12     GC.stress = false if GC.respond_to?(:stress=)
13   end
15   def add_pipe_no_tailcall(m, depth)
16     add_pipe(m, depth += 1)
17   end
19   def add_pipe(m, depth = 0)
20     if depth > 6000
21       _, wr = IO.pipe
22       warn "wr: #{wr.fileno}"
23       @ep.__send__(m, wr, Epoll::OUT)
24     else
25       add_pipe_no_tailcall(m, depth + 1)
26     end
27   end
29   def test_gc_safety
30     done = false
31     begin
32       if done
33         x = nil
34         @ep.wait(nil, 10) { |flags, obj| p [  flags, x = obj ] }
35         assert x, "#{x.inspect}"
36         break
37       else
38         add_pipe(:add)
39         2048.times { IO.pipe; File.open(__FILE__)}
40         done = true
41       end
42     rescue Errno::EMFILE, Errno::ENFILE
43       Thread.new { GC.start }.join
44     end while true
45   end
46 end if ENV["GC_STRESS"].to_i != 0