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

ruby-changes:35281

From: akr <ko1@a...>
Date: Wed, 3 Sep 2014 12:06:26 +0900 (JST)
Subject: [ruby-changes:35281] akr:r47363 (trunk): * process.c (retry_fork_async_signal_safe): Use vfork() if available.

akr	2014-09-03 12:06:17 +0900 (Wed, 03 Sep 2014)

  New Revision: 47363

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

  Log:
    * process.c (retry_fork_async_signal_safe): Use vfork() if available.
    
      vfork() is still faster than fork() especially when the parent
      process uses big memory.
    
      ruby -rbenchmark -e 'a = "a" * 1_000_000_000; puts Benchmark.measure { system("true") }'
      fork:   0.000000   0.010000   0.010000 (  0.014968)
      vfork:  0.000000   0.000000   0.000000 (  0.000912)
      on Debian sid.

  Modified files:
    trunk/ChangeLog
    trunk/process.c
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 47362)
+++ ChangeLog	(revision 47363)
@@ -1,3 +1,14 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Wed Sep  3 12:05:17 2014  Tanaka Akira  <akr@f...>
+
+	* process.c (retry_fork_async_signal_safe): Use vfork() if available.
+	  vfork() is still faster than fork() especially when the parent
+	  process uses big memory.
+
+	  ruby -rbenchmark -e 'a = "a" * 1_000_000_000; puts Benchmark.measure { system("true") }'
+	  fork:   0.000000   0.010000   0.010000 (  0.014968)
+	  vfork:  0.000000   0.000000   0.000000 (  0.000912)
+	  on Debian sid.
+
 Wed Sep  3 11:33:08 2014  SHIBATA Hiroshi  <shibata.hiroshi@g...>
 
 	* test/openssl/test_pkey_rsa.rb (OpenSSL#test_sign_verify_memory_leak):
Index: process.c
===================================================================
--- process.c	(revision 47362)
+++ process.c	(revision 47363)
@@ -50,6 +50,9 @@ https://github.com/ruby/ruby/blob/trunk/process.c#L50
 #ifdef HAVE_SYS_RESOURCE_H
 # include <sys/resource.h>
 #endif
+#ifdef HAVE_VFORK_H
+# include <vfork.h>
+#endif
 #ifdef HAVE_SYS_PARAM_H
 # include <sys/param.h>
 #endif
@@ -3291,7 +3294,11 @@ retry_fork_async_signal_safe(int *status https://github.com/ruby/ruby/blob/trunk/process.c#L3294
 
     while (1) {
         prefork();
+#ifdef HAVE_WORKING_VFORK
+        pid = vfork();
+#else
         pid = fork();
+#endif
         if (pid == 0) {/* fork succeed, child process */
             int ret;
             forked_child = 1;
@@ -3305,6 +3312,7 @@ retry_fork_async_signal_safe(int *status https://github.com/ruby/ruby/blob/trunk/process.c#L3312
             _exit(127);
 #endif
         }
+        forked_child = 0; /* for vfork(). */
         if (0 < pid) /* fork succeed, parent process */
             return pid;
         /* fork failed */

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

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