Class: IO::Event::Debug::Selector

Inherits:
Object
  • Object
show all
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

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

#closeObject



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_durationObject



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(message)
  return unless @log
  
  Fiber.blocking do
    @log.puts("T+%10.1f; %s" % [now, message])
  end
end

#nowObject



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

Returns:

  • (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

Returns:

  • (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

#transferObject

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

#wakeupObject



52
53
54
# File 'lib/io/event/debug/selector.rb', line 52

def wakeup
  @selector.wakeup
end

#yieldObject



78
79
80
81
# File 'lib/io/event/debug/selector.rb', line 78

def yield
  log("Yielding to event loop")
  @selector.yield
end