class GrpcKit::Session::SendBuffer

Public Class Methods

new() click to toggle source
# File lib/grpc_kit/session/send_buffer.rb, line 6
def initialize
  @buffer = ''.b
  @end_write = false
  @deferred_read = false
  @mutex = Mutex.new
end

Public Instance Methods

empty?() click to toggle source
# File lib/grpc_kit/session/send_buffer.rb, line 40
def empty?
  @mutex.synchronize { @buffer.empty? }
end
end_write() click to toggle source

@return [void]

# File lib/grpc_kit/session/send_buffer.rb, line 31
def end_write
  @end_write = true
end
end_write?() click to toggle source

@return [Boolean]

# File lib/grpc_kit/session/send_buffer.rb, line 36
def end_write?
  @end_write
end
eof?() click to toggle source
# File lib/grpc_kit/session/send_buffer.rb, line 68
def eof?
  end_write? && @mutex.synchronize { @buffer.empty? }
end
need_resume?() click to toggle source

@return [Boolean]

# File lib/grpc_kit/session/send_buffer.rb, line 22
def need_resume?
  @deferred_read
end
no_resume() click to toggle source
# File lib/grpc_kit/session/send_buffer.rb, line 26
def no_resume
  @deferred_read = false
end
read(size = nil) click to toggle source

@param size [Integer,nil] @return [nil,DS9::ERR_DEFERRED,String]

# File lib/grpc_kit/session/send_buffer.rb, line 46
def read(size = nil)
  buf = do_read(size)
  if buf
    @deferred_read = false
    return buf
  end

  if end_write?
    # Call again because #write invokes `@buffer << data` before calling #end_write
    if (buf = do_read(size))
      @deferred_read = false
      return buf
    end

    @deferred_read = false
    return nil # EOF
  end

  @deferred_read = true
  DS9::ERR_DEFERRED
end
write(data, last: false) click to toggle source

@param data [String] @param last [Boolean] @return [void]

# File lib/grpc_kit/session/send_buffer.rb, line 16
def write(data, last: false)
  @mutex.synchronize { @buffer << data }
  end_write if last
end

Private Instance Methods

do_read(size = nil) click to toggle source
# File lib/grpc_kit/session/send_buffer.rb, line 74
def do_read(size = nil)
  @mutex.synchronize do
    if @buffer.empty?
      nil
    elsif size.nil? || @buffer.bytesize < size
      buf = @buffer
      @buffer = ''.b
      buf
    else
      @buffer.freeze
      rbuf = @buffer.byteslice(0, size)
      @buffer = @buffer.byteslice(size, @buffer.bytesize)
      rbuf
    end
  end
end