Sha256: 029791980340481911f0be70290b1e4d86133b47d450edd5634dc0ebd3ed3917

Contents?: true

Size: 1.96 KB

Versions: 3

Compression:

Stored size: 1.96 KB

Contents

#!/usr/bin/env ruby

unless $:.include?(File.dirname(__FILE__) + '/../lib')
  $:.unshift(File.dirname(__FILE__) + '/../lib')
end

require 'socket'
require 'thread'
require 'tmpdir'

def show(s)
  return
  print s + "\n"
end

class Server

  attr_accessor :port

  def initialize
    @interface = '127.0.0.1'
    @port = 0
    @stopping = false
    @start_queue = Queue.new
    @stop_queue = Queue.new
  end

  def start
    show 's #start'
    @server_socket = make_server_socket
    @server_thread = make_server_thread
    show 's waiting for start'
    show "s #{@start_queue.deq}"
  end

  def stop
    show 's #stop'
    @stopping = true
    @server_socket.shutdown
#    @server_socket.close
    show 's joining on thread'
#    @thread.join
    # show 's waiting for stop'
    # show "s #{@stop_queue.deq}"
  end

  private

  def make_server_socket
    return TCPServer.new(@interface, @port)
  end

  def make_server_thread
    @thread = Thread.new do
      show 't started'
      Thread.abort_on_exception = false
      begin
        @start_queue.enq 'started'
        server_thread
      rescue Exception
        show 't exception'
        @stop_queue.enq 'stopping'
        raise
      else
        show 't no exception'
        @stop_queue.enq 'stopping'
      end
    end
  end

  def server_thread
    loop do
      begin
        begin
          show 't waiting for bind'
          @server_socket.accept
          show 't bound'
        rescue Errno::EBADF, Errno::EINVAL => e
          show "t #{e}"
          raise unless @stopping
          break
        end
      rescue IOError
        show 't IOError'
        break
      end
    end
    show 't done'
  end

  def accept
  end

end

Dir.mktmpdir do |temp_dir|
  i = 0
  loop do
    i += 1
    begin
      if i % 1000 == 0
        print '.'
        $stdout.flush
      end
      server = Server.new
      server.port = 10000
      server.start
      server.stop
    rescue Errno::EADDRINUSE
      puts i
      raise
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
ftpd-0.14.0 examples/foo.rb
ftpd-0.13.0 examples/foo.rb
ftpd-0.12.0 examples/foo.rb