Class: HTTPX::Selector
- Inherits:
-
Object
- Object
- HTTPX::Selector
- Defined in:
- lib/httpx/selector.rb
Defined Under Namespace
Classes: Monitor
Instance Method Summary collapse
-
#close ⇒ Object
Closes the selector.
-
#deregister(io) ⇒ Object
deregisters
io
from selectables. -
#initialize ⇒ Selector
constructor
A new instance of Selector.
-
#register(io, interests) ⇒ Object
register
io
forinterests
events. -
#select(interval) ⇒ Object
waits for read/write events for
interval
. -
#wakeup ⇒ Object
interrupts the select call.
Constructor Details
Instance Method Details
#close ⇒ Object
Closes the selector.
121 122 123 124 125 126 127 128 129 |
# File 'lib/httpx/selector.rb', line 121 def close return if @closed @__r__.close @__w__.close rescue IOError ensure @closed = true end |
#deregister(io) ⇒ Object
deregisters io
from selectables.
57 58 59 60 |
# File 'lib/httpx/selector.rb', line 57 def deregister(io) monitor = @selectables.delete(io) monitor.close(false) if monitor end |
#register(io, interests) ⇒ Object
register io
for interests
events.
63 64 65 66 67 68 69 70 71 72 |
# File 'lib/httpx/selector.rb', line 63 def register(io, interests) monitor = @selectables[io] if monitor monitor.interests = interests else monitor = Monitor.new(io, interests, self) @selectables[io] = monitor end monitor end |
#select(interval) ⇒ Object
waits for read/write events for interval
. Yields for monitors of selected IO objects.
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/httpx/selector.rb', line 77 def select(interval) begin r = [@__r__] w = [] @selectables.each do |io, monitor| r << io if monitor.interests == :r || monitor.interests == :rw w << io if monitor.interests == :w || monitor.interests == :rw monitor.readiness = nil end readers, writers = IO.select(r, w, nil, interval) raise HTTPX::TimeoutError.new(interval, "timed out while waiting on select") if readers.nil? && writers.nil? rescue IOError, SystemCallError @selectables.reject! { |io, _| io.closed? } retry end readers.each do |io| if io == @__r__ # clean up wakeups @__r__.read(@__r__.stat.size) else monitor = io.closed? ? @selectables.delete(io) : @selectables[io] next unless monitor monitor.readiness = writers.delete(io) ? :rw : :r yield monitor end end if readers writers.each do |io| monitor = io.closed? ? @selectables.delete(io) : @selectables[io] next unless monitor # don't double run this, the last iteration might have run this task already monitor.readiness = :w yield monitor end if writers end |
#wakeup ⇒ Object
interrupts the select call.
132 133 134 |
# File 'lib/httpx/selector.rb', line 132 def wakeup @__w__.write_nonblock("\0", exception: false) end |