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

ruby-changes:14534

From: usa <ko1@a...>
Date: Fri, 22 Jan 2010 01:30:04 +0900 (JST)
Subject: [ruby-changes:14534] Ruby:r26371 (ruby_1_8): * eval.c (thread_timer, rb_thread_stop_timer): check the timing of

usa	2010-01-22 01:29:51 +0900 (Fri, 22 Jan 2010)

  New Revision: 26371

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

  Log:
    * eval.c (thread_timer, rb_thread_stop_timer): check the timing of
      stopping timer.  patch from KOSAKI Motohiro <kosaki.motohiro _AT_
      jp.fujitsu.com>
    
    * eval.c (rb_thread_start_timer): NetBSD5 seems to be hung when calling
      pthread_create() from pthread_atfork()'s parent handler.
    
    * io.c (pipe_open): workaround for NetBSD5. stop timer thread before
      fork(), and start it if needed.
    
    * process.c (rb_f_fork, rb_f_system): ditto.
      fixed [ruby-dev:40074]

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/eval.c
    branches/ruby_1_8/io.c
    branches/ruby_1_8/process.c

Index: ruby_1_8/process.c
===================================================================
--- ruby_1_8/process.c	(revision 26370)
+++ ruby_1_8/process.c	(revision 26371)
@@ -1331,7 +1331,14 @@
     fflush(stderr);
 #endif
 
+#ifdef __NetBSD__
+    before_exec();
+    pid = fork();
+    after_exec();
+    switch (pid) {
+#else
     switch (pid = fork()) {
+#endif
       case 0:
 #ifdef linux
 	after_exec();
@@ -1571,6 +1578,9 @@
 
     chfunc = signal(SIGCHLD, SIG_DFL);
   retry:
+#ifdef __NetBSD__
+    before_exec();
+#endif
     pid = fork();
     if (pid == 0) {
 	/* child process */
@@ -1578,6 +1588,9 @@
 	rb_protect(proc_exec_args, (VALUE)&earg, NULL);
 	_exit(127);
     }
+#ifdef __NetBSD__
+    after_exec();
+#endif
     if (pid < 0) {
 	if (errno == EAGAIN) {
 	    rb_thread_sleep(1);
Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 26370)
+++ ruby_1_8/ChangeLog	(revision 26371)
@@ -1,3 +1,18 @@
+Fri Jan 22 01:22:27 2010  NAKAMURA Usaku  <usa@r...>
+
+	* eval.c (thread_timer, rb_thread_stop_timer): check the timing of
+	  stopping timer.  patch from KOSAKI Motohiro <kosaki.motohiro _AT_
+	  jp.fujitsu.com>
+
+	* eval.c (rb_thread_start_timer): NetBSD5 seems to be hung when calling
+	  pthread_create() from pthread_atfork()'s parent handler.
+
+	* io.c (pipe_open): workaround for NetBSD5. stop timer thread before
+	  fork(), and start it if needed.
+
+	* process.c (rb_f_fork, rb_f_system): ditto.
+	  fixed [ruby-dev:40074]
+
 Tue Jan 19 20:00:30 2010  Nobuyoshi Nakada  <nobu@r...>
 
 	* lib/resolv.rb (Resolv::Config.default_config_hash): return an
Index: ruby_1_8/io.c
===================================================================
--- ruby_1_8/io.c	(revision 26370)
+++ ruby_1_8/io.c	(revision 26371)
@@ -3267,6 +3267,9 @@
     }
 
   retry:
+#ifdef __NetBSD__
+    rb_thread_stop_timer();
+#endif
     switch ((pid = fork())) {
       case 0:			/* child */
 	if (modef & FMODE_READABLE) {
@@ -3294,11 +3297,17 @@
 		    ruby_sourcefile, ruby_sourceline, pname);
 	    _exit(127);
 	}
+#ifdef __NetBSD__
+	rb_thread_start_timer();
+#endif
 	rb_io_synchronized(RFILE(orig_stdout)->fptr);
 	rb_io_synchronized(RFILE(orig_stderr)->fptr);
 	return Qnil;
 
       case -1:			/* fork failed */
+#ifdef __NetBSD__
+	rb_thread_start_timer();
+#endif
 	if (errno == EAGAIN) {
 	    rb_thread_sleep(1);
 	    goto retry;
@@ -3319,6 +3328,9 @@
 	break;
 
       default:			/* parent */
+#ifdef __NetBSD__
+	rb_thread_start_timer();
+#endif
 	if (pid < 0) rb_sys_fail(pname);
 	else {
 	    VALUE port = io_alloc(rb_cIO);
Index: ruby_1_8/eval.c
===================================================================
--- ruby_1_8/eval.c	(revision 26370)
+++ ruby_1_8/eval.c	(revision 26371)
@@ -12464,6 +12464,8 @@
     pthread_t thread;
 } time_thread = {PTHREAD_COND_INITIALIZER, PTHREAD_MUTEX_INITIALIZER};
 
+static int timer_stopping;
+
 #define safe_mutex_lock(lock) \
     pthread_mutex_lock(lock); \
     pthread_cleanup_push((void (*)_((void *)))pthread_mutex_unlock, lock)
@@ -12488,6 +12490,9 @@
 #define WAIT_FOR_10MS() \
     pthread_cond_timedwait(&running->cond, &running->lock, get_ts(&to, PER_NANO/100))
     while ((err = WAIT_FOR_10MS()) == EINTR || err == ETIMEDOUT) {
+	if (timer_stopping)
+	    break;
+
 	if (!rb_thread_critical) {
 	    rb_thread_pending = 1;
 	    if (rb_trap_immediate) {
@@ -12515,7 +12520,9 @@
     safe_mutex_lock(&time_thread.lock);
     if (pthread_create(&time_thread.thread, 0, thread_timer, args) == 0) {
 	thread_init = 1;
+#ifndef __NetBSD__
 	pthread_atfork(0, 0, rb_thread_stop_timer);
+#endif
 	pthread_cond_wait(&start, &time_thread.lock);
     }
     pthread_cleanup_pop(1);
@@ -12526,10 +12533,12 @@
 {
     if (!thread_init) return;
     safe_mutex_lock(&time_thread.lock);
+    timer_stopping = 1;
     pthread_cond_signal(&time_thread.cond);
     thread_init = 0;
     pthread_cleanup_pop(1);
     pthread_join(time_thread.thread, NULL);
+    timer_stopping = 0;
 }
 #elif defined(HAVE_SETITIMER)
 static void

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

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