Sha256: 45734268f9b772de3a28632333f76befd6edffe64aca4f7d55abbcd7f317cf0e

Contents?: true

Size: 1.13 KB

Versions: 42

Compression:

Stored size: 1.13 KB

Contents

require "bunny/cruby/socket"

module Bunny
  module JRuby
    # TCP socket extension that uses Socket#readpartial to avoid excessive CPU
    # burn after some time. See issue #165.
    # @private
    class Socket < Bunny::Socket

      # Reads given number of bytes with an optional timeout
      #
      # @param [Integer] count How many bytes to read
      # @param [Integer] timeout Timeout
      #
      # @return [String] Data read from the socket
      # @api public
      def read_fully(count, timeout = nil)
        return nil if @__bunny_socket_eof_flag__

        value = ''
        begin
          loop do
            value << readpartial(count - value.bytesize)
            break if value.bytesize >= count
          end
        rescue EOFError
          # @eof will break Rubinius' TCPSocket implementation. MK.
          @__bunny_socket_eof_flag__ = true
        rescue *READ_RETRY_EXCEPTION_CLASSES
          if IO.select([self], nil, nil, timeout)
            retry
          else
            raise Timeout::Error, "IO timeout when reading #{count} bytes"
          end
        end
        value
      end # read_fully
    end
  end
end

Version data entries

42 entries across 42 versions & 1 rubygems

Version Path
bunny-1.0.2 lib/bunny/jruby/socket.rb
bunny-1.0.1 lib/bunny/jruby/socket.rb