Class: DTAS::UNIXAccepted

Inherits:
Object
  • Object
show all
Defined in:
lib/dtas/unix_accepted.rb

Overview

an accepted (client) socket in dtas-player server

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(sock) ⇒ 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_ioObject (readonly)

:nodoc:



8
9
10
# File 'lib/dtas/unix_accepted.rb', line 8

def to_io
  @to_io
end

Instance Method Details

#closeObject



64
65
66
# File 'lib/dtas/unix_accepted.rb', line 64

def close
  @to_io.close
end

#closed?Boolean



68
69
70
# File 'lib/dtas/unix_accepted.rb', line 68

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
# File 'lib/dtas/unix_accepted.rb', line 17

def emit(msg)
  buffered = @send_buf.size
  if buffered == 0
    case rv = sendmsg_nonblock(msg)
    when :wait_writable
      @send_buf << msg
      rv
    else
      :wait_readable
    end
  else # buffered > 0
    @send_buf << msg
    :wait_writable
  end
rescue => e
  e
end

#readable_iterObject



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/dtas/unix_accepted.rb', line 47

def readable_iter
  nread = @to_io.nread

  # EOF, assume no spurious wakeups for SOCK_SEQPACKET
  return nil if nread == 0

  case msg = recv_nonblock(nread)
  when :wait_readable then return msg
  when '', nil then return nil # EOF
  else
    yield(self, msg) # DTAS::Player deals with this
  end
  @send_buf.empty? ? :wait_readable : :wait_writable
rescue SystemCallError
  nil
end

#recv_nonblock(len) ⇒ Object



77
78
79
# File 'lib/dtas/unix_accepted.rb', line 77

def recv_nonblock(len)
  @to_io.recv_nonblock(len, exception: false)
end

#sendmsg_nonblock(msg) ⇒ Object



73
74
75
# File 'lib/dtas/unix_accepted.rb', line 73

def sendmsg_nonblock(msg)
  @to_io.sendmsg_nonblock(msg, Socket::MSG_EOR, exception: false)
end

#writable_iterObject

flushes pending data if it got buffered



36
37
38
39
40
41
42
43
44
45
# File 'lib/dtas/unix_accepted.rb', line 36

def writable_iter
  case sendmsg_nonblock(@send_buf[0])
  when :wait_writable then return :wait_writable
  else
    @send_buf.shift
    @send_buf.empty? ? :wait_readable : :wait_writable
  end
rescue => e
  e
end