@@ -15,8 +15,7 @@ class Scheduler
1515 def initialize ( selector = nil )
1616 @fiber = Fiber . current
1717 @selector = selector || IO ::Event ::Selector . new ( @fiber )
18- @pending = [ ]
19- @waiting = { }
18+ @waiting = 0
2019
2120 unless @selector . respond_to? ( :io_close )
2221 instance_eval { undef io_close }
@@ -35,10 +34,10 @@ def unblock(blocker, fiber)
3534
3635 def io_wait ( io , events , timeout )
3736 fiber = Fiber . current
38- @waiting [ fiber ] = io
37+ @waiting += 1
3938 @selector . io_wait ( fiber , io , events )
4039 ensure
41- @waiting . delete ( fiber )
40+ @waiting -= 1
4241 end
4342
4443 def io_close ( io )
@@ -50,7 +49,7 @@ def kernel_sleep(duration)
5049 end
5150
5251 def close
53- while @selector . ready? || @waiting . any?
52+ while @selector . ready? || @waiting > 0
5453 begin
5554 @selector . select ( nil )
5655 rescue Errno ::EINTR
@@ -73,17 +72,17 @@ def fiber(&block)
7372class DirectScheduler < Scheduler
7473 def io_read ( io , buffer , length )
7574 fiber = Fiber . current
76- @waiting [ fiber ] = io
75+ @waiting += 1
7776 result = @selector . io_read ( fiber , io , buffer , length )
7877 ensure
79- @waiting . delete ( fiber )
78+ @waiting -= 1
8079 end
8180
8281 def io_write ( io , buffer , length )
8382 fiber = Fiber . current
84- @waiting [ fiber ] = io
83+ @waiting += 1
8584 @selector . io_write ( fiber , io , buffer , length )
8685 ensure
87- @waiting . delete ( fiber )
86+ @waiting -= 1
8887 end
8988end
0 commit comments