37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
# File 'lib/evt/backends/bundled.rb', line 37
def run
while @readable.any? or @writable.any? or @waiting.any? or @iovs.any? or @blocking.positive?
readable, writable, iovs = self.wait
readable&.each do |io|
fiber = @readable.delete(io)
fiber&.resume
end
writable&.each do |io|
fiber = @writable.delete(io)
fiber&.resume
end
unless iovs.nil?
iovs&.each do |v|
io, ret = v
fiber = @iovs.delete(io)
fiber&.resume(ret)
end
end
collect
if @waiting.any?
time = current_time
waiting, @waiting = @waiting, {}
waiting.each do |fiber, timeout|
if timeout <= time
fiber.resume if fiber.is_a? Fiber and fiber.alive?
else
@waiting[fiber] = timeout
end
end
end
if @ready.any?
ready = nil
@lock.synchronize do
ready, @ready = @ready, []
end
ready.each do |fiber|
fiber.resume if fiber.is_a? Fiber and fiber.alive?
end
end
end
end
|