Changeset 619

Show
Ignore:
Timestamp:
12/19/07 09:34:35 (1 year ago)
Author:
blackhedd
Message:

Modified several things to co-exist with Windows, which doesn't make it easy to set descriptors non-blocking. The loopbreaker is rewritten to use localhost UDP, and there is extra code to detect when a nonsocket is being used.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • version_0/lib/pr_eventmachine.rb

    r611 r619  
    375375 
    376376  def open_loopbreaker 
    377     @loopbreak_writer.close if @loopbreak_writer 
    378     rd,@loopbreak_writer = IO.pipe 
    379     LoopbreakReader.new rd 
     377          # Can't use an IO.pipe because they can't be set nonselectable in Windows. 
     378          # Pick a random localhost UDP port. 
     379    #@loopbreak_writer.close if @loopbreak_writer 
     380    #rd,@loopbreak_writer = IO.pipe 
     381        @loopbreak_reader = UDPSocket.new 
     382        @loopbreak_writer = UDPSocket.new 
     383        bound = false 
     384        100.times { 
     385                @loopbreak_port = rand(10000) + 40000 
     386                begin 
     387                        @loopbreak_reader.bind "localhost", @loopbreak_port 
     388                        bound = true 
     389                        break 
     390                rescue 
     391                end 
     392        } 
     393        raise "Unable to bind Loopbreaker" unless bound 
     394        LoopbreakReader.new(@loopbreak_reader) 
    380395  end 
    381396 
     
    386401 
    387402  def signal_loopbreak 
    388     @loopbreak_writer.write '+' if @loopbreak_writer 
     403    #@loopbreak_writer.write '+' if @loopbreak_writer 
     404        @loopbreak_writer.send('+',0,"localhost",@loopbreak_port) if @loopbreak_writer 
    389405  end 
    390406 
     
    429445      @last_activity = Reactor.instance.current_loop_time 
    430446 
    431       m = @io.fcntl(Fcntl::F_GETFL, 0) 
    432       @io.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK | m) 
     447      if defined?(Fcntl::F_GETFL) 
     448        m = @io.fcntl(Fcntl::F_GETFL, 0) 
     449        @io.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK | m) 
     450      else 
     451              # Windows doesn't define F_GETFL. 
     452              # It's not very reliable about setting descriptors nonblocking either. 
     453              begin 
     454                s = Socket.for_fd(@io.fileno) 
     455                s.fcntl( Fcntl::F_SETFL, Fcntl::O_NONBLOCK ) 
     456              rescue Errno::EINVAL, Errno::EBADF 
     457                      STDERR.puts "Serious error: unable to set descriptor non-blocking" 
     458              end 
     459      end 
    433460      # TODO, should set CLOEXEC on Unix? 
    434461 
     
    518545          EventMachine::event_callback uuid, ConnectionData, data 
    519546        end 
    520       rescue Errno::EAGAIN 
     547      rescue Errno::EAGAIN, Errno::EWOULDBLOCK 
    521548        # no-op 
    522549      rescue Errno::ECONNRESET, Errno::ECONNREFUSED, EOFError