Class: DTAS::UNIXAccepted
- Inherits:
-
Object
- Object
- DTAS::UNIXAccepted
- Defined in:
- lib/dtas/unix_accepted.rb
Overview
an accepted (client) socket in dtas-player server
Instance Attribute Summary collapse
-
#to_io ⇒ Object
readonly
:nodoc:.
Instance Method Summary collapse
- #close ⇒ Object
- #closed? ⇒ Boolean
-
#emit(msg) ⇒ Object
public API (for DTAS::Player) returns :wait_readable on success.
-
#initialize(sock) ⇒ UNIXAccepted
constructor
A new instance of UNIXAccepted.
- #readable_iter ⇒ Object
-
#writable_iter ⇒ Object
flushes pending data if it got buffered.
Constructor Details
#initialize(sock) ⇒ UNIXAccepted
Returns a new instance of UNIXAccepted.
10 11 12 13 |
# File 'lib/dtas/unix_accepted.rb', line 10 def initialize(sock) @to_io = sock @send_buf = [] end |
Instance Attribute Details
#to_io ⇒ Object (readonly)
:nodoc:
8 9 10 |
# File 'lib/dtas/unix_accepted.rb', line 8 def to_io @to_io end |
Instance Method Details
#close ⇒ Object
71 72 73 |
# File 'lib/dtas/unix_accepted.rb', line 71 def close @to_io.close end |
#closed? ⇒ Boolean
75 76 77 |
# File 'lib/dtas/unix_accepted.rb', line 75 def closed? @to_io.closed? end |
#emit(msg) ⇒ Object
public API (for DTAS::Player) returns :wait_readable on success
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/dtas/unix_accepted.rb', line 17 def emit(msg) buffered = @send_buf.size if buffered == 0 begin @to_io.sendmsg_nonblock(msg, Socket::MSG_EOR) return :wait_readable rescue Errno::EAGAIN @send_buf << msg return :wait_writable rescue => e return e end elsif buffered > 100 return RuntimeError.new("too many messages buffered") else # buffered > 0 @send_buf << msg return :wait_writable end end |
#readable_iter ⇒ Object
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/dtas/unix_accepted.rb', line 50 def readable_iter io = @to_io nread = io.nread # EOF, assume no spurious wakeups for SOCK_SEQPACKET return nil if nread == 0 begin begin msg, _, _ = io.recvmsg_nonblock(nread, 0, 0) rescue Errno::EAGAIN return :wait_readable rescue EOFError, SystemCallError return nil end yield(self, msg) # DTAS::Player deals with this nread = io.nread end while nread > 0 :wait_readable end |
#writable_iter ⇒ Object
flushes pending data if it got buffered
38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/dtas/unix_accepted.rb', line 38 def writable_iter begin msg = @send_buf.shift or return :wait_readable @to_io.send_nonblock(msg, Socket::MSG_EOR) rescue Errno::EAGAIN @send_buf.unshift(msg) return :wait_writable rescue => e return e end while true end |