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

ruby-changes:4862

From: ko1@a...
Date: Sun, 11 May 2008 13:15:47 +0900 (JST)
Subject: [ruby-changes:4862] akr - Ruby:r16355 (trunk): * thread.c (thread_cleanup_func_before_exec): extracted from

akr	2008-05-11 13:15:29 +0900 (Sun, 11 May 2008)

  New Revision: 16355

  Modified files:
    trunk/ChangeLog
    trunk/include/ruby/intern.h
    trunk/io.c
    trunk/process.c
    trunk/thread.c

  Log:
    * thread.c (thread_cleanup_func_before_exec): extracted from
      thread_cleanup_func not to touch pthread data.
      pthread_cond_destroy in forked process may cause deadlock on
      Debian GNU/Linux Etch on x86, x86-64 and IA64.
      this doesn't cause resource leak because the process will exec soon.
      (terminate_atfork_before_exec_i): defined.
      (rb_thread_atfork_before_exec): defined.
    
    * include/ruby/intern.h (rb_thread_atfork_before_exec): declared.
    
    * process.c (rb_exec_atfork): call rb_thread_atfork_before_exec
      instead of rb_thread_atfork.
    
    * io.c (popen_exec): call rb_thread_atfork_before_exec instead of
      rb_thread_atfork.
    


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=16355&r2=16354&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/thread.c?r1=16355&r2=16354&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/io.c?r1=16355&r2=16354&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/process.c?r1=16355&r2=16354&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/include/ruby/intern.h?r1=16355&r2=16354&diff_format=u

Index: include/ruby/intern.h
===================================================================
--- include/ruby/intern.h	(revision 16354)
+++ include/ruby/intern.h	(revision 16355)
@@ -308,6 +308,7 @@
 VALUE rb_thread_local_aref(VALUE, ID);
 VALUE rb_thread_local_aset(VALUE, ID, VALUE);
 void rb_thread_atfork(void);
+void rb_thread_atfork_before_exec(void);
 VALUE rb_exec_recursive(VALUE(*)(VALUE, VALUE, int),VALUE,VALUE);
 /* file.c */
 VALUE rb_file_s_expand_path(int, VALUE *);
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 16354)
+++ ChangeLog	(revision 16355)
@@ -1,3 +1,21 @@
+Sun May 11 13:14:09 2008  Tanaka Akira  <akr@f...>
+
+	* thread.c (thread_cleanup_func_before_exec): extracted from
+	  thread_cleanup_func not to touch pthread data.
+	  pthread_cond_destroy in forked process may cause deadlock on
+	  Debian GNU/Linux Etch on x86, x86-64 and IA64.
+	  this doesn't cause resource leak because the process will exec soon.
+	  (terminate_atfork_before_exec_i): defined.
+	  (rb_thread_atfork_before_exec): defined.
+
+	* include/ruby/intern.h (rb_thread_atfork_before_exec): declared.
+
+	* process.c (rb_exec_atfork): call rb_thread_atfork_before_exec
+	  instead of rb_thread_atfork.
+
+	* io.c (popen_exec): call rb_thread_atfork_before_exec instead of
+	  rb_thread_atfork.
+
 Sat May 10 22:14:03 2008  Yukihiro Matsumoto  <matz@r...>
 
 	* string.c (tr_trans): single '^' does not mean negation.
Index: io.c
===================================================================
--- io.c	(revision 16354)
+++ io.c	(revision 16355)
@@ -3671,7 +3671,7 @@
 {
     struct popen_arg *p = (struct popen_arg*)pp;
 
-    rb_thread_atfork();
+    rb_thread_atfork_before_exec();
     return rb_exec(p->execp);
 }
 #endif
Index: thread.c
===================================================================
--- thread.c	(revision 16354)
+++ thread.c	(revision 16355)
@@ -273,7 +273,7 @@
 }
 
 static void
-thread_cleanup_func(void *th_ptr)
+thread_cleanup_func_before_exec(void *th_ptr)
 {
     rb_thread_t *th = th_ptr;
     th->status = THREAD_KILLED;
@@ -281,6 +281,13 @@
 #ifdef __ia64
     th->machine_register_stack_start = th->machine_register_stack_end = 0;
 #endif
+}
+
+static void
+thread_cleanup_func(void *th_ptr)
+{
+    rb_thread_t *th = th_ptr;
+    thread_cleanup_func_before_exec(th_ptr);
     native_thread_destroy(th);
 }
 
@@ -2064,6 +2071,32 @@
     st_insert(vm->living_threads, thval, (st_data_t) th->thread_id);
 }
 
+static int
+terminate_atfork_before_exec_i(st_data_t key, st_data_t val, rb_thread_t *current_th)
+{
+    VALUE thval = key;
+    rb_thread_t *th;
+    GetThreadPtr(thval, th);
+
+    if (th != current_th) {
+	thread_cleanup_func_before_exec(th);
+    }
+    return ST_CONTINUE;
+}
+
+void
+rb_thread_atfork_before_exec(void)
+{
+    rb_thread_t *th = GET_THREAD();
+    rb_vm_t *vm = th->vm;
+    VALUE thval = th->self;
+    vm->main_thread = th;
+
+    st_foreach(vm->living_threads, terminate_atfork_before_exec_i, (st_data_t)th);
+    st_clear(vm->living_threads);
+    st_insert(vm->living_threads, thval, (st_data_t) th->thread_id);
+}
+
 struct thgroup {
     int enclosed;
     VALUE group;
Index: process.c
===================================================================
--- process.c	(revision 16354)
+++ process.c	(revision 16355)
@@ -2103,7 +2103,7 @@
 static int
 rb_exec_atfork(void* arg)
 {
-    rb_thread_atfork();
+    rb_thread_atfork_before_exec();
     return rb_exec(arg);
 }
 #endif

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

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