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