summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--test/ruby/test_thread.rb33
-rw-r--r--thread.c6
3 files changed, 47 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index ab4662b0d4..8569d2ce6c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Sat Jan 19 03:46:42 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * thread.c (thread_create_core): prohibit thread creation in the
+ frozen thread group. a patch in [ruby-dev:33176] from sheepman
+ <sheepman AT sheepman.sakura.ne.jp>.
+
+ * thread.c (thread_create_core): should inherit ThreadGroup from
+ the current thread.
+
Sat Jan 19 00:37:19 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
* sprintf.c (rb_str_format): set result encoding for wider width.
diff --git a/test/ruby/test_thread.rb b/test/ruby/test_thread.rb
index 0d924eea57..b5db362df4 100644
--- a/test/ruby/test_thread.rb
+++ b/test/ruby/test_thread.rb
@@ -22,3 +22,36 @@ class TestThread < Test::Unit::TestCase
end
end
+class TestThreadGroup < Test::Unit::TestCase
+ def test_thread_init
+ thgrp = ThreadGroup.new
+ Thread.new{
+ thgrp.add(Thread.current)
+ assert_equal(thgrp, Thread.new{sleep 1}.group)
+ }.join
+ end
+
+ def test_frozen_thgroup
+ thgrp = ThreadGroup.new
+ Thread.new{
+ thgrp.add(Thread.current)
+ thgrp.freeze
+ assert_raise(ThreadError) do
+ Thread.new{1}.join
+ end
+ }.join
+ end
+
+ def test_enclosed_thgroup
+ thgrp = ThreadGroup.new
+ thgrp.enclose
+ Thread.new{
+ assert_raise(ThreadError) do
+ thgrp.add(Thread.current)
+ end
+ assert_nothing_raised do
+ Thread.new{1}.join
+ end
+ }.join
+ end
+end
diff --git a/thread.c b/thread.c
index ead451ccdd..c5bf767bcb 100644
--- a/thread.c
+++ b/thread.c
@@ -374,6 +374,10 @@ thread_create_core(VALUE thval, VALUE args, VALUE (*fn)(ANYARGS))
{
rb_thread_t *th;
+ if (OBJ_FROZEN(GET_THREAD()->thgroup)) {
+ rb_raise(rb_eThreadError,
+ "can't start a new thread (frozen ThreadGroup)");
+ }
GetThreadPtr(thval, th);
/* setup thread environment */
@@ -382,7 +386,7 @@ thread_create_core(VALUE thval, VALUE args, VALUE (*fn)(ANYARGS))
th->first_func = fn;
th->priority = GET_THREAD()->priority;
- th->thgroup = th->vm->thgroup_default;
+ th->thgroup = GET_THREAD()->thgroup;
native_mutex_initialize(&th->interrupt_lock);
/* kick thread */