Class: Myxi::EventableSocket
- Inherits:
-
Object
- Object
- Myxi::EventableSocket
- Defined in:
- lib/myxi/eventable_socket.rb
Direct Known Subclasses
Instance Method Summary collapse
- #close ⇒ Object
- #close_after_write ⇒ Object
- #handle_w ⇒ Object
-
#initialize(event_loop, socket) ⇒ EventableSocket
constructor
A new instance of EventableSocket.
- #write(data) ⇒ Object
Constructor Details
#initialize(event_loop, socket) ⇒ EventableSocket
Returns a new instance of EventableSocket.
3 4 5 6 7 8 9 10 |
# File 'lib/myxi/eventable_socket.rb', line 3 def initialize(event_loop, socket) @event_loop = event_loop @socket = socket @monitor = @event_loop.selector.register(@socket, :r) @monitor.value = self @read_buffer = String.new.force_encoding('BINARY') @write_buffer = String.new.force_encoding('BINARY') end |
Instance Method Details
#close ⇒ Object
37 38 39 40 |
# File 'lib/myxi/eventable_socket.rb', line 37 def close @socket.close @event_loop.selector.deregister(@socket) end |
#close_after_write ⇒ Object
32 33 34 35 |
# File 'lib/myxi/eventable_socket.rb', line 32 def close_after_write @close_after_write = true @monitor.interests = :w end |
#handle_w ⇒ Object
12 13 14 15 16 17 18 19 20 21 22 23 24 |
# File 'lib/myxi/eventable_socket.rb', line 12 def handle_w bytes_sent = @socket.write_nonblock(@write_buffer) # Send as much data as possible if bytes_sent >= @write_buffer.bytesize @write_buffer = String.new.force_encoding('BINARY') @monitor.interests = :r close if @close_after_write else @write_buffer.slice!(0, bytes_sent) end rescue Errno::ECONNRESET, IOError close end |
#write(data) ⇒ Object
26 27 28 29 30 |
# File 'lib/myxi/eventable_socket.rb', line 26 def write(data) @event_loop.wakeup @write_buffer << data.force_encoding('BINARY') @monitor.interests = :rw end |