class Selenium::WebDriver::SocketLock

def can_lock?

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

def did_lock?

def did_lock?
  !@server.nil?
end

def initialize(port, timeout)

def initialize(port, timeout)
  @port    = port
  @timeout = timeout
end

def lock

def lock
  max_time = Time.now + @timeout
  sleep 0.1 until can_lock? || Time.now >= max_time
  return if did_lock?
  raise Error::WebDriverError, "unable to bind to locking port #{@port} within #{@timeout} seconds"
end

def locked

def locked
  lock
  begin
    yield
  ensure
    release
  end
end

def release

def release
  @server && @server.close
end