[前][次][番号順一覧][スレッド一覧]

ruby-changes:40520

From: normal <ko1@a...>
Date: Tue, 17 Nov 2015 08:40:22 +0900 (JST)
Subject: [ruby-changes:40520] normal:r52601 (trunk): socket: avoid arg parsing in rsock_s_accept_nonblock

normal	2015-11-17 08:40:15 +0900 (Tue, 17 Nov 2015)

  New Revision: 52601

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

  Log:
    socket: avoid arg parsing in rsock_s_accept_nonblock
    
    * ext/socket/init.c (rsock_s_accept_nonblock): avoid parsing args
      [ruby-core:71439] [Feature #11339]
    * ext/socket/rubysocket.h: adjust prototype
    * ext/socket/socket.c (sock_accept_nonblock): make private
    * ext/socket/tcpserver.c (tcp_accept_nonblock): ditto
    * ext/socket/unixserver.c (unix_accept_nonblock): ditto
    * ext/socket/lib/socket.rb (Socket#accept_nonblock):
      implement as wrapper, move RDoc
      (TCPServer#accept_nonblock): ditto
      (UNIXServer#accept_nonblock): ditto
    
    target 0: a (ruby 2.3.0dev (2015-11-12 trunk 52550) [x86_64-linux])
    target 1: b (ruby 2.3.0dev (2015-11-12 avoid-kwarg-capi 52550) [x86_64-linux]
    
    -----------------------------------------------------------
    accept_nonblock
    
    require 'tempfile'
    require 'socket'
    require 'io/wait'
    nr = 500000
    Tempfile.create(%w(accept_nonblock .sock)) do |tmp|
      path = tmp.path
      File.unlink(path)
      s = UNIXServer.new(path)
      addr = Socket.sockaddr_un(path).freeze
      nr.times do
        s.accept_nonblock(exception: false)
        c = UNIXSocket.new(path)
        s.wait_readable
        s.accept_nonblock(exception: false).close
        c.close
      end
    end
    
    -----------------------------------------------------------
    raw data:
    
    [["accept_nonblock",
      [[4.807877402752638,
        4.930681671947241,
        4.738454818725586,
        4.69268161803484,
        4.684675686061382],
       [4.253904823213816,
        4.255124930292368,
        4.295955188572407,
        4.248479191213846,
        4.213303029537201]]]]
    
    Elapsed time: 45.123040065 (sec)
    -----------------------------------------------------------
    benchmark results:
    minimum results in each 5 measurements.
    Execution time (sec)
    name            a       b
    accept_nonblock   4.685   4.213
    
    Speedup ratio: compare with the result of `a' (greater is better)
    name            b
    accept_nonblock   1.112

  Modified files:
    trunk/ChangeLog
    trunk/ext/socket/init.c
    trunk/ext/socket/lib/socket.rb
    trunk/ext/socket/rubysocket.h
    trunk/ext/socket/socket.c
    trunk/ext/socket/tcpserver.c
    trunk/ext/socket/unixserver.c
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 52600)
+++ ChangeLog	(revision 52601)
@@ -1,3 +1,16 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Tue Nov 17 08:36:34 2015  Eric Wong  <e@8...>
+
+	* ext/socket/init.c (rsock_s_accept_nonblock): avoid parsing args
+	  [ruby-core:71439] [Feature #11339]
+	* ext/socket/rubysocket.h: adjust prototype
+	* ext/socket/socket.c (sock_accept_nonblock): make private
+	* ext/socket/tcpserver.c (tcp_accept_nonblock): ditto
+	* ext/socket/unixserver.c (unix_accept_nonblock): ditto
+	* ext/socket/lib/socket.rb (Socket#accept_nonblock):
+	  implement as wrapper, move RDoc
+	  (TCPServer#accept_nonblock): ditto
+	  (UNIXServer#accept_nonblock): ditto
+
 Tue Nov 17 08:25:57 2015  Eric Wong  <e@8...>
 
 	* ext/socket/socket.c (sock_connect_nonblock):
Index: ext/socket/rubysocket.h
===================================================================
--- ext/socket/rubysocket.h	(revision 52600)
+++ ext/socket/rubysocket.h	(revision 52601)
@@ -354,7 +354,8 @@ VALUE rsock_s_recvfrom(VALUE sock, int a https://github.com/ruby/ruby/blob/trunk/ext/socket/rubysocket.h#L354
 int rsock_connect(int fd, const struct sockaddr *sockaddr, int len, int socks);
 
 VALUE rsock_s_accept(VALUE klass, int fd, struct sockaddr *sockaddr, socklen_t *len);
-VALUE rsock_s_accept_nonblock(int argc, VALUE *argv, VALUE klass, rb_io_t *fptr, struct sockaddr *sockaddr, socklen_t *len);
+VALUE rsock_s_accept_nonblock(VALUE klass, VALUE ex, rb_io_t *fptr,
+			      struct sockaddr *sockaddr, socklen_t *len);
 VALUE rsock_sock_listen(VALUE sock, VALUE log);
 
 VALUE rsock_sockopt_new(int family, int level, int optname, VALUE data);
Index: ext/socket/init.c
===================================================================
--- ext/socket/init.c	(revision 52600)
+++ ext/socket/init.c	(revision 52601)
@@ -29,7 +29,7 @@ VALUE rb_cSOCKSSocket; https://github.com/ruby/ruby/blob/trunk/ext/socket/init.c#L29
 #endif
 
 int rsock_do_not_reverse_lookup = 1;
-static VALUE sym_exception, sym_wait_readable;
+static VALUE sym_wait_readable;
 
 void
 rsock_raise_socket_error(const char *reason, int error)
@@ -544,13 +544,10 @@ cloexec_accept(int socket, struct sockad https://github.com/ruby/ruby/blob/trunk/ext/socket/init.c#L544
 }
 
 VALUE
-rsock_s_accept_nonblock(int argc, VALUE *argv, VALUE klass, rb_io_t *fptr,
+rsock_s_accept_nonblock(VALUE klass, VALUE ex, rb_io_t *fptr,
 			struct sockaddr *sockaddr, socklen_t *len)
 {
     int fd2;
-    VALUE opts = Qnil;
-
-    rb_scan_args(argc, argv, "0:", &opts);
 
     rb_io_set_nonblock(fptr);
     fd2 = cloexec_accept(fptr->fd, (struct sockaddr*)sockaddr, len, 1);
@@ -564,7 +561,7 @@ rsock_s_accept_nonblock(int argc, VALUE https://github.com/ruby/ruby/blob/trunk/ext/socket/init.c#L561
 #if defined EPROTO
 	  case EPROTO:
 #endif
-            if (rsock_opt_false_p(opts, sym_exception))
+            if (ex == Qfalse)
 		return sym_wait_readable;
             rb_readwrite_sys_fail(RB_IO_WAIT_READABLE, "accept(2) would block");
 	}
@@ -673,6 +670,5 @@ rsock_init_socket_init(void) https://github.com/ruby/ruby/blob/trunk/ext/socket/init.c#L670
     rsock_init_socket_constants();
 
 #undef rb_intern
-    sym_exception = ID2SYM(rb_intern("exception"));
     sym_wait_readable = ID2SYM(rb_intern("wait_readable"));
 }
Index: ext/socket/unixserver.c
===================================================================
--- ext/socket/unixserver.c	(revision 52600)
+++ ext/socket/unixserver.c	(revision 52601)
@@ -57,45 +57,9 @@ unix_accept(VALUE sock) https://github.com/ruby/ruby/blob/trunk/ext/socket/unixserver.c#L57
 		          (struct sockaddr*)&from, &fromlen);
 }
 
-/*
- * call-seq:
- *   unixserver.accept_nonblock([options]) => unixsocket
- *
- * Accepts an incoming connection using accept(2) after
- * O_NONBLOCK is set for the underlying file descriptor.
- * It returns an accepted UNIXSocket for the incoming connection.
- *
- * === Example
- * 	require 'socket'
- * 	serv = UNIXServer.new("/tmp/sock")
- * 	begin # emulate blocking accept
- * 	  sock = serv.accept_nonblock
- * 	rescue IO::WaitReadable, Errno::EINTR
- * 	  IO.select([serv])
- * 	  retry
- * 	end
- * 	# sock is an accepted socket.
- *
- * Refer to Socket#accept for the exceptions that may be thrown if the call
- * to UNIXServer#accept_nonblock fails.
- *
- * UNIXServer#accept_nonblock may raise any error corresponding to accept(2) failure,
- * including Errno::EWOULDBLOCK.
- *
- * If the exception is Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::ECONNABORTED or Errno::EPROTO,
- * it is extended by IO::WaitReadable.
- * So IO::WaitReadable can be used to rescue the exceptions for retrying accept_nonblock.
- *
- * By specifying `exception: false`, the options hash allows you to indicate
- * that accept_nonblock should not raise an IO::WaitReadable exception, but
- * return the symbol :wait_readable instead.
- *
- * === See
- * * UNIXServer#accept
- * * Socket#accept
- */
+/* :nodoc: */
 static VALUE
-unix_accept_nonblock(int argc, VALUE *argv, VALUE sock)
+unix_accept_nonblock(VALUE sock, VALUE ex)
 {
     rb_io_t *fptr;
     struct sockaddr_un from;
@@ -103,7 +67,7 @@ unix_accept_nonblock(int argc, VALUE *ar https://github.com/ruby/ruby/blob/trunk/ext/socket/unixserver.c#L67
 
     GetOpenFile(sock, fptr);
     fromlen = (socklen_t)sizeof(from);
-    return rsock_s_accept_nonblock(argc, argv, rb_cUNIXSocket, fptr,
+    return rsock_s_accept_nonblock(rb_cUNIXSocket, ex, fptr,
 			           (struct sockaddr *)&from, &fromlen);
 }
 
@@ -152,7 +116,10 @@ rsock_init_unixserver(void) https://github.com/ruby/ruby/blob/trunk/ext/socket/unixserver.c#L116
     rb_cUNIXServer = rb_define_class("UNIXServer", rb_cUNIXSocket);
     rb_define_method(rb_cUNIXServer, "initialize", unix_svr_init, 1);
     rb_define_method(rb_cUNIXServer, "accept", unix_accept, 0);
-    rb_define_method(rb_cUNIXServer, "accept_nonblock", unix_accept_nonblock, -1);
+
+    rb_define_private_method(rb_cUNIXServer,
+			     "__accept_nonblock", unix_accept_nonblock, 1);
+
     rb_define_method(rb_cUNIXServer, "sysaccept", unix_sysaccept, 0);
     rb_define_method(rb_cUNIXServer, "listen", rsock_sock_listen, 1); /* in socket.c */
 #endif
Index: ext/socket/tcpserver.c
===================================================================
--- ext/socket/tcpserver.c	(revision 52600)
+++ ext/socket/tcpserver.c	(revision 52601)
@@ -64,53 +64,16 @@ tcp_accept(VALUE sock) https://github.com/ruby/ruby/blob/trunk/ext/socket/tcpserver.c#L64
     return rsock_s_accept(rb_cTCPSocket, fptr->fd, &from.addr, &fromlen);
 }
 
-/*
- * call-seq:
- *   tcpserver.accept_nonblock([options]) => tcpsocket
- *
- * Accepts an incoming connection using accept(2) after
- * O_NONBLOCK is set for the underlying file descriptor.
- * It returns an accepted TCPSocket for the incoming connection.
- *
- * === Example
- * 	require 'socket'
- * 	serv = TCPServer.new(2202)
- * 	begin # emulate blocking accept
- * 	  sock = serv.accept_nonblock
- * 	rescue IO::WaitReadable, Errno::EINTR
- * 	  IO.select([serv])
- * 	  retry
- * 	end
- * 	# sock is an accepted socket.
- *
- * Refer to Socket#accept for the exceptions that may be thrown if the call
- * to TCPServer#accept_nonblock fails.
- *
- * TCPServer#accept_nonblock may raise any error corresponding to accept(2) failure,
- * including Errno::EWOULDBLOCK.
- *
- * If the exception is Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::ECONNABORTED, Errno::EPROTO,
- * it is extended by IO::WaitReadable.
- * So IO::WaitReadable can be used to rescue the exceptions for retrying accept_nonblock.
- *
- * By specifying `exception: false`, the options hash allows you to indicate
- * that accept_nonblock should not raise an IO::WaitReadable exception, but
- * return the symbol :wait_readable instead.
- *
- * === See
- * * TCPServer#accept
- * * Socket#accept
- */
+/* :nodoc: */
 static VALUE
-tcp_accept_nonblock(int argc, VALUE *argv, VALUE sock)
+tcp_accept_nonblock(VALUE sock, VALUE ex)
 {
     rb_io_t *fptr;
     union_sockaddr from;
-    socklen_t fromlen;
+    socklen_t len = (socklen_t)sizeof(from);
 
     GetOpenFile(sock, fptr);
-    fromlen = (socklen_t)sizeof(from);
-    return rsock_s_accept_nonblock(argc, argv, rb_cTCPSocket, fptr, &from.addr, &fromlen);
+    return rsock_s_accept_nonblock(rb_cTCPSocket, ex, fptr, &from.addr, &len);
 }
 
 /*
@@ -175,7 +138,8 @@ rsock_init_tcpserver(void) https://github.com/ruby/ruby/blob/trunk/ext/socket/tcpserver.c#L138
      */
     rb_cTCPServer = rb_define_class("TCPServer", rb_cTCPSocket);
     rb_define_method(rb_cTCPServer, "accept", tcp_accept, 0);
-    rb_define_method(rb_cTCPServer, "accept_nonblock", tcp_accept_nonblock, -1);
+    rb_define_private_method(rb_cTCPServer,
+			     "__accept_nonblock", tcp_accept_nonblock, 1);
     rb_define_method(rb_cTCPServer, "sysaccept", tcp_sysaccept, 0);
     rb_define_method(rb_cTCPServer, "initialize", tcp_svr_init, -1);
     rb_define_method(rb_cTCPServer, "listen", rsock_sock_listen, 1); /* in socket.c */
Index: ext/socket/lib/socket.rb
===================================================================
--- ext/socket/lib/socket.rb	(revision 52600)
+++ ext/socket/lib/socket.rb	(revision 52601)
@@ -398,6 +398,63 @@ class Socket < BasicSocket https://github.com/ruby/ruby/blob/trunk/ext/socket/lib/socket.rb#L398
     __recvfrom_nonblock(len, flag, str, exception)
   end
 
+  # call-seq:
+  #   socket.accept_nonblock([options]) => [client_socket, client_addrinfo]
+  #
+  # Accepts an incoming connection using accept(2) after
+  # O_NONBLOCK is set for the underlying file descriptor.
+  # It returns an array containing the accepted socket
+  # for the incoming connection, _client_socket_,
+  # and an Addrinfo, _client_addrinfo_.
+  #
+  # === Example
+  #   # In one script, start this first
+  #   require 'socket'
+  #   include Socket::Constants
+  #   socket = Socket.new(AF_INET, SOCK_STREAM, 0)
+  #   sockaddr = Socket.sockaddr_in(2200, 'localhost')
+  #   socket.bind(sockaddr)
+  #   socket.listen(5)
+  #   begin # emulate blocking accept
+  #     client_socket, client_addrinfo = socket.accept_nonblock
+  #   rescue IO::WaitReadable, Errno::EINTR
+  #     IO.select([socket])
+  #     retry
+  #   end
+  #   puts "The client said, '#{client_socket.readline.chomp}'"
+  #   client_socket.puts "Hello from script one!"
+  #   socket.close
+  #
+  #   # In another script, start this second
+  #   require 'socket'
+  #   include Socket::Constants
+  #   socket = Socket.new(AF_INET, SOCK_STREAM, 0)
+  #   sockaddr = Socket.sockaddr_in(2200, 'localhost')
+  #   socket.connect(sockaddr)
+  #   socket.puts "Hello from script 2."
+  #   puts "The server said, '#{socket.readline.chomp}'"
+  #   socket.close
+  #
+  # Refer to Socket#accept for the exceptions that may be thrown if the call
+  # to _accept_nonblock_ fails.
+  #
+  # Socket#accept_nonblock may raise any error corresponding to accept(2) failure,
+  # including Errno::EWOULDBLOCK.
+  #
+  # If the exception is Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::ECONNABORTED or Errno::EPROTO,
+  # it is extended by IO::WaitReadable.
+  # So IO::WaitReadable can be used to rescue the exceptions for retrying accept_nonblock.
+  #
+  # By specifying `exception: false`, the options hash allows you to indicate
+  # that accept_nonblock should not raise an IO::WaitReadable exception, but
+  # return the symbol :wait_readable instead.
+  #
+  # === See
+  # * Socket#accept
+  def accept_nonblock(exception: true)
+    __accept_nonblock(exception)
+  end
+
   # :call-seq:
   #   Socket.tcp(host, port, local_host=nil, local_port=nil, [opts]) {|socket| ... }
   #   Socket.tcp(host, port, local_host=nil, local_port=nil, [opts])
@@ -1086,3 +1143,86 @@ class UDPSocket < IPSocket https://github.com/ruby/ruby/blob/trunk/ext/socket/lib/socket.rb#L1143
     __recvfrom_nonblock(len, flag, str, exception)
   end
 end
+
+class TCPServer < TCPSocket
+
+  # call-seq:
+  #   tcpserver.accept_nonblock([options]) => tcpsocket
+  #
+  # Accepts an incoming connection using accept(2) after
+  # O_NONBLOCK is set for the underlying file descriptor.
+  # It returns an accepted TCPSocket for the incoming connection.
+  #
+  # === Example
+  # 	require 'socket'
+  # 	serv = TCPServer.new(2202)
+  # 	begin # emulate blocking accept
+  # 	  sock = serv.accept_nonblock
+  # 	rescue IO::WaitReadable, Errno::EINTR
+  # 	  IO.select([serv])
+  # 	  retry
+  # 	end
+  # 	# sock is an accepted socket.
+  #
+  # Refer to Socket#accept for the exceptions that may be thrown if the call
+  # to TCPServer#accept_nonblock fails.
+  #
+  # TCPServer#accept_nonblock may raise any error corresponding to accept(2) failure,
+  # including Errno::EWOULDBLOCK.
+  #
+  # If the exception is Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::ECONNABORTED, Errno::EPROTO,
+  # it is extended by IO::WaitReadable.
+  # So IO::WaitReadable can be used to rescue the exceptions for retrying accept_nonblock.
+  #
+  # By specifying `exception: false`, the options hash allows you to indicate
+  # that accept_nonblock should not raise an IO::WaitReadable exception, but
+  # return the symbol :wait_readable instead.
+  #
+  # === See
+  # * TCPServer#accept
+  # * Socket#accept
+  def accept_nonblock(exception: true)
+    __accept_nonblock(exception)
+  end
+end
+
+class UNIXServer < UNIXSocket
+  # call-seq:
+  #   unixserver.accept_nonblock([options]) => unixsocket
+  #
+  # Accepts an incoming connection using accept(2) after
+  # O_NONBLOCK is set for the underlying file descriptor.
+  # It returns an accepted UNIXSocket for the incoming connection.
+  #
+  # === Example
+  # 	require 'socket'
+  # 	serv = UNIXServer.new("/tmp/sock")
+  # 	begin # emulate blocking accept
+  # 	  sock = serv.accept_nonblock
+  # 	rescue IO::WaitReadable, Errno::EINTR
+  # 	  IO.select([serv])
+  # 	  retry
+  # 	end
+  # 	# sock is an accepted socket.
+  #
+  # Refer to Socket#accept for the exceptions that may be thrown if the call
+  # to UNIXServer#accept_nonblock fails.
+  #
+  # UNIXServer#accept_nonblock may raise any error corresponding to accept(2) failure,
+  # including Errno::EWOULDBLOCK.
+  #
+  # If the exception is Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::ECONNABORTED or Errno::EPROTO,
+  # it is extended by IO::WaitReadable.
+  # So IO::WaitReadable can be used to rescue the exceptions for retrying accept_nonblock.
+  #
+  # By specifying `exception: false`, the options hash allows you to indicate
+  # that accept_nonblock should not raise an IO::WaitReadable exception, but
+  # return the symbol :wait_readable instead.
+  #
+  # === See
+  # * UNIXServer#accept
+  # * Socket#accept
+  def accept_nonblock(exception: true)
+    __accept_nonblock(exception)
+  end
+end
Index: ext/socket/socket.c
===================================================================
--- ext/socket/socket.c	(revision 52600)
+++ ext/socket/socket.c	(revision 52601)
@@ -800,63 +800,9 @@ sock_accept(VALUE sock) https://github.com/ruby/ruby/blob/trunk/ext/socket/socket.c#L800
     return rb_assoc_new(sock2, rsock_io_socket_addrinfo(sock2, &buf.addr, len));
 }
 
-/*
- * call-seq:
- *   socket.accept_nonblock([options]) => [client_socket, client_addrinfo]
- *
- * Accepts an incoming connection using accept(2) after
- * O_NONBLOCK is set for the underlying file descriptor.
- * It returns an array containing the accepted socket
- * for the incoming connection, _client_socket_,
- * and an Addrinfo, _client_addrinfo_.
- *
- * === Example
- *   # In one script, start this first
- *   require 'socket'
- *   include Socket::Constants
- *   socket = Socket.new(AF_INET, SOCK_STREAM, 0)
- *   sockaddr = Socket.sockaddr_in(2200, 'localhost')
- *   socket.bind(sockaddr)
- *   socket.listen(5)
- *   begin # emulate blocking accept
- *     client_socket, client_addrinfo = socket.accept_nonblock
- *   rescue IO::WaitReadable, Errno::EINTR
- *     IO.select([socket])
- *     retry
- *   end
- *   puts "The client said, '#{client_socket.readline.chomp}'"
- *   client_socket.puts "Hello from script one!"
- *   socket.close
- *
- *   # In another script, start this second
- *   require 'socket'
- *   include Socket::Constants
- *   socket = Socket.new(AF_INET, SOCK_STREAM, 0)
- *   sockaddr = Socket.sockaddr_in(2200, 'localhost')
- *   socket.connect(sockaddr)
- *   socket.puts "Hello from script 2."
- *   puts "The server said, '#{socket.readline.chomp}'"
- *   socket.close
- *
- * Refer to Socket#accept for the exceptions that may be thrown if the call
- * to _accept_nonblock_ fails.
- *
- * Socket#accept_nonblock may raise any error corresponding to accept(2) failure,
- * including Errno::EWOULDBLOCK.
- *
- * If the exception is Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::ECONNABORTED or Errno::EPROTO,
- * it is extended by IO::WaitReadable.
- * So IO::WaitReadable can be used to rescue the exceptions for retrying accept_nonblock.
- *
- * By specifying `exception: false`, the options hash allows you to indicate
- * that accept_nonblock should not raise an IO::WaitReadable exception, but
- * return the symbol :wait_readable instead.
- *
- * === See
- * * Socket#accept
- */
+/* :nodoc: */
 static VALUE
-sock_accept_nonblock(int argc, VALUE *argv, VALUE sock)
+sock_accept_nonblock(VALUE sock, VALUE ex)
 {
     rb_io_t *fptr;
     VALUE sock2;
@@ -865,7 +811,7 @@ sock_accept_nonblock(int argc, VALUE *ar https://github.com/ruby/ruby/blob/trunk/ext/socket/socket.c#L811
     socklen_t len = (socklen_t)sizeof buf;
 
     GetOpenFile(sock, fptr);
-    sock2 = rsock_s_accept_nonblock(argc, argv, rb_cSocket, fptr, addr, &len);
+    sock2 = rsock_s_accept_nonblock(rb_cSocket, ex, fptr, addr, &len);
 
     if (SYMBOL_P(sock2)) /* :wait_readable */
 	return sock2;
@@ -2073,7 +2019,11 @@ Init_socket(void) https://github.com/ruby/ruby/blob/trunk/ext/socket/socket.c#L2019
     rb_define_method(rb_cSocket, "bind", sock_bind, 1);
     rb_define_method(rb_cSocket, "listen", rsock_sock_listen, 1);
     rb_define_method(rb_cSocket, "accept", sock_accept, 0);
-    rb_define_method(rb_cSocket, "accept_nonblock", sock_accept_nonblock, -1);
+
+    /* for ext/socket/lib/socket.rb use only: */
+    rb_define_private_method(rb_cSocket,
+			     "__accept_nonblock", sock_accept_nonblock, 1);
+
     rb_define_method(rb_cSocket, "sysaccept", sock_sysaccept, 0);
 
     rb_define_method(rb_cSocket, "recvfrom", sock_recvfrom, -1);

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]