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/