diff options
author | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-03-03 11:39:35 +0000 |
---|---|---|
committer | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-03-03 11:39:35 +0000 |
commit | e143b93c444f7a6f8856d33c7c78d930961dc253 (patch) | |
tree | 70c46277331bf4f837a9ce5e0f85b3f8cf96eb0a | |
parent | ce5bb2273645650493a3b045d4803d6bb04a72f3 (diff) |
merges r22577, r22578 and r22642 from trunk into ruby_1_9_1.
--
* thread.c (thread_cleanup_func): unlock all locked mutexes even when
forking. [ruby-core:22269]
--
* bootstraptest/test_thread.rb: fix for environment where fork is not
available.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_1@22733 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | bootstraptest/test_thread.rb | 16 | ||||
-rw-r--r-- | thread.c | 22 |
3 files changed, 37 insertions, 11 deletions
@@ -1,3 +1,13 @@ +Tue Feb 24 01:22:19 2009 Yusuke Endoh <mame@tsg.ne.jp> + + * bootstraptest/test_thread.rb: fix for environment where fork is not + available. + +Tue Feb 24 01:19:38 2009 Yusuke Endoh <mame@tsg.ne.jp> + + * thread.c (thread_cleanup_func): unlock all locked mutexes even when + forking. [ruby-core:22269] + Mon Feb 23 14:47:04 2009 Nobuyoshi Nakada <nobu@ruby-lang.org> * lib/fileutils.rb (mv): added description for the case of diff --git a/bootstraptest/test_thread.rb b/bootstraptest/test_thread.rb index ce90737ebf..54544df45e 100644 --- a/bootstraptest/test_thread.rb +++ b/bootstraptest/test_thread.rb @@ -216,6 +216,22 @@ assert_equal 'true', %{ end } +assert_equal 'ok', %{ + open("zzz.rb", "w") do |f| + f.puts <<-END + begin + Thread.new { fork { GC.start } }.join + pid, status = Process.wait2 + $result = status.success? ? :ok : :ng + rescue NotImplementedError + $result = :ok + end + END + end + require "zzz.rb" + $result +} + assert_finish 3, %{ th = Thread.new {sleep 2} th.join(1) @@ -291,7 +291,7 @@ typedef struct rb_mutex_struct struct rb_mutex_struct *next_mutex; } mutex_t; -static void rb_mutex_unlock_all(mutex_t *mutex); +static void rb_mutex_unlock_all(mutex_t *mutex, rb_thread_t *th); void rb_thread_terminate_all(void) @@ -305,7 +305,7 @@ rb_thread_terminate_all(void) /* unlock all locking mutexes */ if (th->keeping_mutexes) { - rb_mutex_unlock_all(th->keeping_mutexes); + rb_mutex_unlock_all(th->keeping_mutexes, GET_THREAD()); } thread_debug("rb_thread_terminate_all (main thread: %p)\n", (void *)th); @@ -339,6 +339,12 @@ static void thread_cleanup_func(void *th_ptr) { rb_thread_t *th = th_ptr; + + /* unlock all locking mutexes */ + if (th->keeping_mutexes) { + rb_mutex_unlock_all(th->keeping_mutexes, th); + th->keeping_mutexes = NULL; + } thread_cleanup_func_before_exec(th_ptr); native_thread_destroy(th); } @@ -434,12 +440,6 @@ thread_start_func_2(rb_thread_t *th, VALUE *stack_start, VALUE *register_stack_s (void *)th, th->locking_mutex); } - /* unlock all locking mutexes */ - if (th->keeping_mutexes) { - rb_mutex_unlock_all(th->keeping_mutexes); - th->keeping_mutexes = NULL; - } - /* delete self other than main thread from living_threads */ if (th != main_th) { st_delete_wrap(th->vm->living_threads, th->self); @@ -457,7 +457,6 @@ thread_start_func_2(rb_thread_t *th, VALUE *stack_start, VALUE *register_stack_s } join_th = join_th->join_list_next; } - if (th != main_th) rb_check_deadlock(th->vm); if (!th->root_fiber) { rb_thread_recycle_stack_release(th->stack); @@ -465,6 +464,7 @@ thread_start_func_2(rb_thread_t *th, VALUE *stack_start, VALUE *register_stack_s } } thread_cleanup_func(th); + if (th != main_th) rb_check_deadlock(th->vm); if (th->vm->main_thread == th) { ruby_cleanup(state); } @@ -3146,7 +3146,7 @@ rb_mutex_unlock(VALUE self) } static void -rb_mutex_unlock_all(mutex_t *mutexes) +rb_mutex_unlock_all(mutex_t *mutexes, rb_thread_t *th) { const char *err; mutex_t *mutex; @@ -3156,7 +3156,7 @@ rb_mutex_unlock_all(mutex_t *mutexes) /* rb_warn("mutex #<%p> remains to be locked by terminated thread", mutexes); */ mutexes = mutex->next_mutex; - err = mutex_unlock(mutex, GET_THREAD()); + err = mutex_unlock(mutex, th); if (err) rb_bug("invalid keeping_mutexes: %s", err); } } |