Class: IChannel::UNIXSocket

Inherits:
Object
  • Object
show all
Defined in:
lib/ichannel/unix_socket.rb

Instance Method Summary collapse

Constructor Details

#initialize(serializer = Marshal, adapter_options) ⇒ IChannel::UNIXSocket

Parameters:

  • serializer (#dump, #load) (defaults to: Marshal)

    Any object that implements dump, & load.



15
16
17
18
19
# File 'lib/ichannel/unix_socket.rb', line 15

def initialize(serializer = Marshal, adapter_options)
  @serializer = serializer
  @last_msg = nil
  @reader, @writer = ::UNIXSocket.pair :STREAM
end

Instance Method Details

#closeBoolean

Close the channel.

Returns:

  • (Boolean)

    Returns true when the channel has been closed.



35
36
37
38
39
40
41
# File 'lib/ichannel/unix_socket.rb', line 35

def close
  unless closed?
    @reader.close
    @writer.close
    true
  end
end

#closed?Boolean

Returns true when the channel is closed.

Returns:

  • (Boolean)

    Returns true when the channel is closed.



25
26
27
# File 'lib/ichannel/unix_socket.rb', line 25

def closed?
  @reader.closed? && @writer.closed?
end

#last_msgObject

Reads the last message written to the channel by reading until the channel is empty. The last message is cached and reset to nil on call to #close.

Returns:

  • (Object)

    Returns the last message to be written to the channel.



96
97
98
99
100
101
# File 'lib/ichannel/unix_socket.rb', line 96

def last_msg
  while readable?
    @last_msg = get
  end
  @last_msg
end

#readable?Boolean

Returns true when the channel is readable.

Returns:

  • (Boolean)

    Returns true when the channel is readable.



154
155
156
157
158
159
160
161
# File 'lib/ichannel/unix_socket.rb', line 154

def readable?
  if closed?
    false
  else
    readable, _ = IO.select [@reader], nil, nil, 0
    !! readable
  end
end

#recvObject Also known as: get

Receive an object from the channel.

Returns:

  • (Object)

    The object read from the channel.

Raises:

  • (IOError)

    When the channel is closed.



112
113
114
# File 'lib/ichannel/unix_socket.rb', line 112

def recv
  recv!(nil)
end

#recv!(timeout = 0.1) ⇒ Object Also known as: get!

Receive an object from the channel.

Unlike #recv, which waits indefinitely until the channel becomes readable, this method will raise an IOError when timeout seconds elapse and the channel remains unreadable.

Parameters:

  • timeout (Numeric) (defaults to: 0.1)

    The number of seconds to wait for the channel to become readable.

Returns:

  • (Object)

    The object read from the channel.

Raises:

  • (Timeout::Error)

    When timeout seconds elapse & the channel remains unreadable.



136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/ichannel/unix_socket.rb', line 136

def recv!(timeout = 0.1)
  if @reader.closed?
    raise IOError, 'The channel cannot be read from (closed).'
  end
  readable, _ = IO.select [@reader], nil, nil, timeout
  if readable
    msg = readable[0].readline(SEP).chomp SEP
    @last_msg = @serializer.load msg
  else
    raise Timeout::Error, 'Time out on read (waited for %s second(s))' % [timeout]
  end
end

#write(object) ⇒ Object Also known as: put

Add an object to the channel.

Parameters:

  • object (Object)

    An object to add to the channel.

Raises:

  • (IOError)

    When the channel is closed.



52
53
54
# File 'lib/ichannel/unix_socket.rb', line 52

def write(object)
  write!(object, nil)
end

#write!(object, timeout = 0.1) ⇒ Object Also known as: put!

Add an object to the channel.

Unlike #write, which waits indefinitely until the channel becomes writable, this method will raise an IOError when timeout seconds elapse and the channel remains unwritable.

Parameters:

  • timeout (Numeric) (defaults to: 0.1)

    The number of seconds to wait for the channel to become writable.

Raises:

  • (IOError)

    When timeout seconds elapse & the channel remains unwritable.



75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/ichannel/unix_socket.rb', line 75

def write!(object, timeout = 0.1)
  if @writer.closed?
    raise IOError, 'The channel cannot be written to (closed).'
  end
  _, writable, _ = IO.select nil, [@writer], nil, timeout
  if writable
    msg = @serializer.dump(object)
    writable[0].syswrite "#{msg}#{SEP}"
  else
    raise IOError, 'The channel cannot be written to.'
  end
end