lib/oxblood/rsocket.rb in oxblood-0.1.0.dev7 vs lib/oxblood/rsocket.rb in oxblood-0.1.0.dev8

- old
+ new

@@ -6,10 +6,19 @@ # automatically recreated in case of any errors (including timeout errors) # in order to avoid inconsistent state. class RSocket TimeoutError = Class.new(RuntimeError) + # JRuby don't properly support SO_LINGER setting + # @see https://github.com/jruby/jruby/issues/4040 + LINGER_OPTION = if RUBY_ENGINE == 'jruby' + [Socket::SOL_SOCKET, :LINGER, 0].freeze + else + Socket::Option.linger(true, 0) + end + private_constant :LINGER_OPTION + # @!attribute [rw] timeout # @return [Numeric] timeout in seconds attr_accessor :timeout # Maintain socket @@ -75,19 +84,19 @@ # Close connection to server # @return [nil] always return nil def close @buffer.clear - socket.close + @socket && @socket.close rescue IOError ; ensure @socket = nil end - # True if connection is established - # @return [Boolean] connection status + # True if socket exists + # @return [Boolean] socket exists or not def connected? !!@socket end private @@ -122,9 +131,11 @@ end while true end def fail_with_timeout! + # In case of failure close socket ASAP + socket.setsockopt(*LINGER_OPTION) close raise TimeoutError end end end