class Selenium::WebDriver::Firefox::SocketLock

@api private

Public Class Methods

new(port, timeout) click to toggle source
# File lib/selenium/webdriver/firefox/socket_lock.rb, line 11
def initialize(port, timeout)
  @port    = port
  @timeout = timeout
end

Public Instance Methods

locked() { || ... } click to toggle source
# File lib/selenium/webdriver/firefox/socket_lock.rb, line 16
def locked(&blk)
  lock

  begin
    yield
  ensure
    release
  end
end

Private Instance Methods

can_lock?() click to toggle source
# File lib/selenium/webdriver/firefox/socket_lock.rb, line 44
def can_lock?
  @server = TCPServer.new(Platform.localhost, @port)
  ChildProcess.close_on_exec @server

  true
rescue SocketError, Errno::EADDRINUSE, Errno::EBADF => ex
  $stderr.puts "#{self}: #{ex.message}" if $DEBUG
  false
end
did_lock?() click to toggle source
# File lib/selenium/webdriver/firefox/socket_lock.rb, line 54
def did_lock?
  !!@server
end
lock() click to toggle source
# File lib/selenium/webdriver/firefox/socket_lock.rb, line 28
def lock
  max_time = Time.now + @timeout

  until can_lock? || Time.now >= max_time
    sleep 0.1
  end

  unless did_lock?
    raise Error::WebDriverError, "unable to bind to locking port #{@port} within #{@timeout} seconds"
  end
end
release() click to toggle source
# File lib/selenium/webdriver/firefox/socket_lock.rb, line 40
def release
  @server && @server.close
end