class Selenium::WebDriver::SocketLock

@api private

Public Class Methods

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

Public Instance Methods

locked() { || ... } click to toggle source

Attempt to acquire a lock on the given port. Control is yielded to an execution block if the lock could be successfully obtained.

# File lib/selenium/webdriver/common/socket_lock.rb, line 38
def locked(&blk)
  lock

  begin
    yield
  ensure
    release
  end
end

Private Instance Methods

can_lock?() click to toggle source
# File lib/selenium/webdriver/common/socket_lock.rb, line 66
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/common/socket_lock.rb, line 76
def did_lock?
  !!@server
end
lock() click to toggle source
# File lib/selenium/webdriver/common/socket_lock.rb, line 50
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/common/socket_lock.rb, line 62
def release
  @server && @server.close
end