[ruby-cvs:57403] normal:r50254 (trunk): connect_nonblock supports "exception: false"

normal at ruby-lang.org normal at ruby-lang.org
Sun Apr 12 10:41:53 JST 2015


normal	2015-04-12 10:41:51 +0900 (Sun, 12 Apr 2015)

  New Revision: 50254

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=50254

  Log:
    connect_nonblock supports "exception: false"
    
    This is for consistency with accept_nonblock arguments and gives a
    minor speedup from avoiding exceptions.
    [ruby-core:68838] [Feature #11024]
    
    * ext/openssl/ossl_ssl.c (ossl_ssl_connect_nonblock):
      support `exception: false'
    * (get_no_exception): move function location
    * ext/socket/socket.c (sock_connect_nonblock):
      support `exception: false'
    * test/openssl/test_pair.rb (test_connect_accept_nonblock_no_exception):
      test `exception: false' on connect,
      rename from `test_accept_nonblock_no_exception'
    * test/socket/test_nonblock.rb (test_connect_nonblock_no_exception):
      new test
    
    Benchmark results:
    
    default            0.050000   0.100000   0.150000 (  0.151307)
    exception: false   0.030000   0.080000   0.110000 (  0.108840)
    
    ----------------------------8<-----------------------
    require 'socket'
    require 'benchmark'
    require 'io/wait'
    require 'tmpdir'
    
    host = '127.0.0.1'
    serv = TCPServer.new(host, 0) # UNIX sockets may not hit EINPROGRESS
    
    nr = 5000 # few iterations to avoid running out of ports
    
    addr = serv.getsockname
    pid = fork do
      begin
        serv.accept.close
      rescue => e
        warn "#$$: #{e.message} (#{e.class})"
      end while true
    end
    at_exit { Process.kill(:TERM, pid) }
    serv.close
    
    Benchmark.bmbm do |x|
      x.report("default") do
        nr.times do
          s = Socket.new(:INET, :STREAM)
          s.setsockopt(:SOL_SOCKET, :SO_REUSEADDR, 1)
          begin
            s.connect_nonblock(addr)
          rescue IO::WaitWritable
            s.wait_writable
          end
          s.close
        end
      end
      x.report("exception: false") do
        nr.times do
          s = Socket.new(:INET, :STREAM)
          s.setsockopt(:SOL_SOCKET, :SO_REUSEADDR, 1)
          case s.connect_nonblock(addr, exception: false)
          when :wait_writable
            s.wait_writable
          end
          s.close
        end
      end
    end

  Modified files:
    trunk/ChangeLog
    trunk/NEWS
    trunk/ext/openssl/ossl_ssl.c
    trunk/ext/socket/socket.c
    trunk/test/openssl/test_pair.rb
    trunk/test/socket/test_nonblock.rb


More information about the ruby-cvs mailing list