зеркало из https://github.com/github/ruby.git
* vm_core.h (typedef struct rb_vm_struct): create a new
'inhibit_thread_createion' field. * thread.c (rb_thread_terminate_all): set inhibit_thread_creation. * thread.c (thread_s_new): don't permit to create new thread if the VM is under destruction. Otherwise evil finalizer code can make SEGV. [Bug #4992][ruby-core:37858] * bootstraptest/test_objectspace.rb: new test for this fix. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32492 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
04b182a4f8
Коммит
a119b9d146
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
|||
Sun Jul 10 16:41:32 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
|
||||
|
||||
* vm_core.h (typedef struct rb_vm_struct): create a new
|
||||
'inhibit_thread_createion' field.
|
||||
* thread.c (rb_thread_terminate_all): set inhibit_thread_creation.
|
||||
* thread.c (thread_s_new): don't permit to create new thread
|
||||
if the VM is under destruction. Otherwise evil finalizer code
|
||||
can make SEGV. [Bug #4992][ruby-core:37858]
|
||||
|
||||
* bootstraptest/test_objectspace.rb: new test for this fix.
|
||||
|
||||
Sun Jul 10 16:06:16 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
|
||||
|
||||
* signal.c (sigsegv): use abort() instead of exit() when nested
|
||||
|
|
|
@ -38,3 +38,9 @@ assert_normal_exit %q{
|
|||
Mutex.new.lock
|
||||
end
|
||||
}, '[ruby-dev:44049]'
|
||||
|
||||
assert_normal_exit %q{
|
||||
ObjectSpace.define_finalizer("") do
|
||||
Thread.new {}
|
||||
end
|
||||
}, '[ruby-core:37858]'
|
||||
|
|
5
thread.c
5
thread.c
|
@ -367,6 +367,7 @@ rb_thread_terminate_all(void)
|
|||
|
||||
thread_debug("rb_thread_terminate_all (main thread: %p)\n", (void *)th);
|
||||
st_foreach(vm->living_threads, terminate_i, (st_data_t)th);
|
||||
vm->inhibit_thread_creation = 1;
|
||||
|
||||
while (!rb_thread_alone()) {
|
||||
PUSH_TAG();
|
||||
|
@ -583,6 +584,10 @@ thread_s_new(int argc, VALUE *argv, VALUE klass)
|
|||
{
|
||||
rb_thread_t *th;
|
||||
VALUE thread = rb_thread_alloc(klass);
|
||||
|
||||
if (GET_VM()->inhibit_thread_creation)
|
||||
rb_raise(rb_eThreadError, "can't alloc thread");
|
||||
|
||||
rb_obj_call_init(thread, argc, argv);
|
||||
GetThreadPtr(thread, th);
|
||||
if (!th->first_args) {
|
||||
|
|
|
@ -285,6 +285,7 @@ typedef struct rb_vm_struct {
|
|||
VALUE thgroup_default;
|
||||
|
||||
int running;
|
||||
int inhibit_thread_creation;
|
||||
int thread_abort_on_exception;
|
||||
unsigned long trace_flag;
|
||||
volatile int sleeper;
|
||||
|
|
Загрузка…
Ссылка в новой задаче