Class: IO::Event::Debug::Selector
- Inherits:
-
Object
- Object
- IO::Event::Debug::Selector
- Defined in:
- lib/io/event/debug/selector.rb
Overview
Enforces the selector interface and delegates operations to a wrapped selector instance.
Class Method Summary collapse
Instance Method Summary collapse
- #close ⇒ Object
- #idle_duration ⇒ Object
-
#initialize(selector, log: nil) ⇒ Selector
constructor
A new instance of Selector.
- #io_read(fiber, io, buffer, length, offset = 0) ⇒ Object
- #io_wait(fiber, io, events) ⇒ Object
- #io_write(fiber, io, buffer, length, offset = 0) ⇒ Object
- #log(message) ⇒ Object
- #now ⇒ Object
- #process_wait(*arguments) ⇒ Object
- #push(fiber) ⇒ Object
- #raise(fiber, *arguments) ⇒ Object
- #ready? ⇒ Boolean
- #respond_to?(name, include_private = false) ⇒ Boolean
- #resume(*arguments) ⇒ Object
- #select(duration = nil) ⇒ Object
-
#transfer ⇒ Object
Transfer from the calling fiber to the event loop.
- #wakeup ⇒ Object
- #yield ⇒ Object
Constructor Details
#initialize(selector, log: nil) ⇒ Selector
Returns a new instance of Selector.
22 23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'lib/io/event/debug/selector.rb', line 22 def initialize(selector, log: nil) @selector = selector @readable = {} @writable = {} @priority = {} unless Fiber.current == selector.loop Kernel::raise "Selector must be initialized on event loop fiber!" end @log = log end |
Class Method Details
.wrap(selector, env = ENV) ⇒ Object
12 13 14 15 16 17 18 19 20 |
# File 'lib/io/event/debug/selector.rb', line 12 def self.wrap(selector, env = ENV) log = nil if log_path = env['IO_EVENT_DEBUG_SELECTOR_LOG'] log = File.open(log_path, 'w') end return self.new(selector, log: log) end |
Instance Method Details
#close ⇒ Object
56 57 58 59 60 61 62 63 64 65 |
# File 'lib/io/event/debug/selector.rb', line 56 def close log("Closing selector") if @selector.nil? Kernel::raise "Selector already closed!" end @selector.close @selector = nil end |
#idle_duration ⇒ Object
36 37 38 |
# File 'lib/io/event/debug/selector.rb', line 36 def idle_duration @selector.idle_duration end |
#io_read(fiber, io, buffer, length, offset = 0) ⇒ Object
107 108 109 110 |
# File 'lib/io/event/debug/selector.rb', line 107 def io_read(fiber, io, buffer, length, offset = 0) log("Reading from IO #{io.inspect} with buffer #{buffer}; length #{length} offset #{offset}") @selector.io_read(fiber, io, buffer, length, offset) end |
#io_wait(fiber, io, events) ⇒ Object
102 103 104 105 |
# File 'lib/io/event/debug/selector.rb', line 102 def io_wait(fiber, io, events) log("Waiting for IO #{io.inspect} for events #{events.inspect}") @selector.io_wait(fiber, io, events) end |
#io_write(fiber, io, buffer, length, offset = 0) ⇒ Object
112 113 114 115 |
# File 'lib/io/event/debug/selector.rb', line 112 def io_write(fiber, io, buffer, length, offset = 0) log("Writing to IO #{io.inspect} with buffer #{buffer}; length #{length} offset #{offset}") @selector.io_write(fiber, io, buffer, length, offset) end |
#log(message) ⇒ Object
44 45 46 47 48 49 50 |
# File 'lib/io/event/debug/selector.rb', line 44 def log() return unless @log Fiber.blocking do @log.puts("T+%10.1f; %s" % [now, ]) end end |
#now ⇒ Object
40 41 42 |
# File 'lib/io/event/debug/selector.rb', line 40 def now Process.clock_gettime(Process::CLOCK_MONOTONIC) end |
#process_wait(*arguments) ⇒ Object
97 98 99 100 |
# File 'lib/io/event/debug/selector.rb', line 97 def process_wait(*arguments) log("Waiting for process with #{arguments.inspect}") @selector.process_wait(*arguments) end |
#push(fiber) ⇒ Object
83 84 85 86 |
# File 'lib/io/event/debug/selector.rb', line 83 def push(fiber) log("Pushing fiber #{fiber.inspect} to ready list") @selector.push(fiber) end |
#raise(fiber, *arguments) ⇒ Object
88 89 90 91 |
# File 'lib/io/event/debug/selector.rb', line 88 def raise(fiber, *arguments) log("Raising exception on fiber #{fiber.inspect} with #{arguments.inspect}") @selector.raise(fiber, *arguments) end |
#ready? ⇒ Boolean
93 94 95 |
# File 'lib/io/event/debug/selector.rb', line 93 def ready? @selector.ready? end |
#respond_to?(name, include_private = false) ⇒ Boolean
117 118 119 |
# File 'lib/io/event/debug/selector.rb', line 117 def respond_to?(name, include_private = false) @selector.respond_to?(name, include_private) end |
#resume(*arguments) ⇒ Object
73 74 75 76 |
# File 'lib/io/event/debug/selector.rb', line 73 def resume(*arguments) log("Resuming fiber with #{arguments.inspect}") @selector.resume(*arguments) end |
#select(duration = nil) ⇒ Object
121 122 123 124 125 126 127 128 |
# File 'lib/io/event/debug/selector.rb', line 121 def select(duration = nil) log("Selecting for #{duration.inspect}") unless Fiber.current == @selector.loop Kernel::raise "Selector must be run on event loop fiber!" end @selector.select(duration) end |
#transfer ⇒ Object
Transfer from the calling fiber to the event loop.
68 69 70 71 |
# File 'lib/io/event/debug/selector.rb', line 68 def transfer log("Transfering to event loop") @selector.transfer end |
#wakeup ⇒ Object
52 53 54 |
# File 'lib/io/event/debug/selector.rb', line 52 def wakeup @selector.wakeup end |
#yield ⇒ Object
78 79 80 81 |
# File 'lib/io/event/debug/selector.rb', line 78 def yield log("Yielding to event loop") @selector.yield end |