class ZChannel::UNIXSocket

Constants

SEP

Public Class Methods

new(serializer) click to toggle source

@param [#dump,#load] serializer

Any object that implements "dump" and "load" methods.

@return [ZChannel::UNIXSocket]

# File lib/zchannel/unix_socket.rb, line 11
def initialize(serializer)
  @serializer = serializer
  @last_msg = nil
  @reader, @writer = ::UNIXSocket.pair :STREAM
end

Public Instance Methods

close() click to toggle source

@raise [IOError]

Raises IOError when a channel is already closed.

@return [Boolean]

Returns true when a channel is closed successfully.
# File lib/zchannel/unix_socket.rb, line 32
def close
  if closed?
    raise IOError, 'closed channel'
  else
    @reader.close
    @writer.close
    true
  end
end
closed?() click to toggle source

@return [Boolean]

Returns true when a channel is closed.
# File lib/zchannel/unix_socket.rb, line 21
def closed?
  @reader.closed? and @writer.closed?
end
last_msg() click to toggle source

@return [Object]

Reads from a channel until there are no messages left, and
then returns the last read message.
# File lib/zchannel/unix_socket.rb, line 131
def last_msg
  @last_msg = recv while readable?
  @last_msg
end
read()
Alias for: recv
read!(timeout = 0.1)
Alias for: recv!
readable?() click to toggle source

@return [Boolean]

Returns true when a channel has messages waiting to be read.
# File lib/zchannel/unix_socket.rb, line 140
def readable?
  if closed?
    false
  else
    readable, _ = IO.select [@reader], nil, nil, 0
    !! readable
  end
end
recv() click to toggle source

Perform a blocking read.

@raise

(see ZChannel::UNIXSocket#recv!)

@return [Object]

# File lib/zchannel/unix_socket.rb, line 93
def recv
  recv!(nil)
end
Also aliased as: read
recv!(timeout = 0.1) click to toggle source

Perform a read with a timeout.

@param [Float, Fixnum] timeout

The number of seconds to wait before raising an exception.

@raise [IOError]

Raises an IOError when a channel is closed.

@raise [ZChannel::TimeoutError]

Raises ZChannel::TimeoutError when a read doesn't finish within the specified timeout.

@return [Object]

# File lib/zchannel/unix_socket.rb, line 112
def recv!(timeout = 0.1)
  if @reader.closed?
    raise IOError, 'closed channel'
  end
  readable, _ = IO.select [@reader], nil, nil, timeout
  if readable
    msg = readable[0].readline(SEP).chomp SEP
    @last_msg = @serializer.load msg
  else
    raise ZChannel::TimeoutError, "timeout, waited #{timeout} seconds"
  end
end
Also aliased as: read!
send(object) click to toggle source

Perform a blocking write.

@raise [IOError]

(see #send!)

@param [Object] object

An object to write to a channel.
# File lib/zchannel/unix_socket.rb, line 51
def send(object)
  send!(object, nil)
end
Also aliased as: write
send!(object, timeout = 0.1) click to toggle source

Perform a write with a timeout.

@param [Object] object

An object to write to a channel.

@param [Float, Fixnum] timeout

The number of seconds to wait before raising an exception.

@raise [IOError]

Raises an IOError when a channel is closed.

@raise [ZChannel::TimeoutError]

Raises a ZChannel::TimeoutError when a write doesn't finish within the specified timeout.
# File lib/zchannel/unix_socket.rb, line 71
def send!(object, timeout = 0.1)
  if @writer.closed?
    raise IOError, 'closed channel'
  end
  _, writable, _ = IO.select nil, [@writer], nil, timeout
  if writable
    msg = @serializer.dump(object)
    writable[0].syswrite "#{msg}#{SEP}"
  else
    raise ZChannel::TimeoutError, "timeout, waited #{timeout} seconds"
  end
end
Also aliased as: write!
write(object)
Alias for: send
write!(object, timeout = 0.1)
Alias for: send!