[ruby-cvs:57097] normal:r49948 (trunk): accept_nonblock supports "exception: false"

normal at ruby-lang.org normal at ruby-lang.org
Thu Mar 12 12:03:05 JST 2015


normal	2015-03-12 12:03:04 +0900 (Thu, 12 Mar 2015)

  New Revision: 49948

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

  Log:
    accept_nonblock supports "exception: false"
    
    This is analogous to functionality found in IO#read_nonblock and
    IO#wait_nonblock.  Raising exceptions for common failures on
    non-blocking servers is expensive and makes $DEBUG too noisy.
    
    Benchmark results:
                                        user     system      total        real
    default                         2.790000   0.870000   3.660000 (  3.671597)
    exception: false                1.120000   0.800000   1.920000 (  1.922032)
    exception: false (cached arg)   0.820000   0.770000   1.590000 (  1.589267)
    --------------------- benchmark script ------------------------
    require 'socket'
    require 'benchmark'
    require 'tmpdir'
    nr = 1000000
    Dir.mktmpdir('nb_bench') do |path|
      sock_path = "#{path}/test.sock"
      s = UNIXServer.new(sock_path)
      Benchmark.bmbm do |x|
        x.report("default") do
          nr.times do
            begin
              s.accept_nonblock
            rescue IO::WaitReadable
            end
          end
        end
        x.report("exception: false") do
          nr.times do
            begin
              s.accept_nonblock(exception: false)
            rescue IO::WaitReadable
              abort "should not raise"
            end
          end
        end
        x.report("exception: false (cached arg)") do
          arg = { exception: false }
          nr.times do
            begin
              s.accept_nonblock(arg)
            rescue IO::WaitReadable
              abort "should not raise"
            end
          end
        end
      end
    end
    
    * ext/socket/init.c (rsock_s_accept_nonblock):
      support exception: false
      [ruby-core:66385] [Feature #10532]
    * ext/socket/init.c (rsock_init_socket_init): define new symbols
    * ext/socket/rubysocket.h: adjust prototype
    * ext/socket/socket.c (sock_accept_nonblock): support exception: false
    * ext/openssl/ossl_ssl.c (ossl_ssl_accept_nonblock): ditto
    * ext/socket/socket.c (Init_socket): adjust accept_nonblock definition
    * ext/openssl/ossl_ssl.c (Init_ossl_ssl): ditto
    * ext/socket/tcpserver.c (rsock_init_tcpserver): ditto
    * ext/socket/unixserver.c (rsock_init_unixserver): ditto
    * ext/socket/tcpserver.c (tcp_accept_nonblock): adjust
      rsock_s_accept_nonblock call
    * ext/socket/unixserver.c (unix_accept_nonblock): ditto
    * ext/openssl/ossl_ssl.c (ossl_start_ssl): support no_exception
    * ext/openssl/ossl_ssl.c (ossl_ssl_connect): adjust ossl_start_ssl call
    * ext/openssl/ossl_ssl.c (ossl_ssl_connect_nonblock): ditto
    * ext/openssl/ossl_ssl.c (ossl_ssl_accept): ditto
    * test/socket/test_nonblock.rb (test_accept_nonblock): test for
      "exception :false"
    * test/socket/test_tcp.rb (test_accept_nonblock): new test
    * test/socket/test_unix.rb (test_accept_nonblock): ditto
    * test/openssl/test_pair.rb (test_accept_nonblock_no_exception): ditto

  Modified files:
    trunk/ChangeLog
    trunk/NEWS
    trunk/ext/openssl/ossl_ssl.c
    trunk/ext/socket/init.c
    trunk/ext/socket/rubysocket.h
    trunk/ext/socket/socket.c
    trunk/ext/socket/tcpserver.c
    trunk/ext/socket/unixserver.c
    trunk/test/openssl/test_pair.rb
    trunk/test/socket/test_nonblock.rb
    trunk/test/socket/test_tcp.rb
    trunk/test/socket/test_unix.rb


More information about the ruby-cvs mailing list