diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-11-12 04:57:39 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-11-12 04:57:39 +0000 |
commit | 1d4183030db5824e745a901d625ad93af9ff2ec3 (patch) | |
tree | fdfccacfb2d122fd9ac04b486aef61664555d7b3 | |
parent | a360a8ce853ac66b822ceaf4453128891f7f2f62 (diff) |
* thread.c (thread_create_core): moved failure handling from
native_thread_core().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@25726 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | thread.c | 8 | ||||
-rw-r--r-- | thread_pthread.c | 5 | ||||
-rw-r--r-- | thread_win32.c | 3 |
4 files changed, 12 insertions, 9 deletions
@@ -1,4 +1,7 @@ -Thu Nov 12 13:31:00 2009 Nobuyoshi Nakada <nobu@ruby-lang.org> +Thu Nov 12 13:57:37 2009 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * thread.c (thread_create_core): moved failure handling from + native_thread_core(). * thread_pthread.c (native_thread_create): constified. @@ -512,6 +512,7 @@ static VALUE thread_create_core(VALUE thval, VALUE args, VALUE (*fn)(ANYARGS)) { rb_thread_t *th; + int err; if (OBJ_FROZEN(GET_THREAD()->thgroup)) { rb_raise(rb_eThreadError, @@ -530,7 +531,12 @@ thread_create_core(VALUE thval, VALUE args, VALUE (*fn)(ANYARGS)) native_mutex_initialize(&th->interrupt_lock); /* kick thread */ st_insert(th->vm->living_threads, thval, (st_data_t) th->thread_id); - native_thread_create(th); + err = native_thread_create(th); + if (err) { + st_delete_wrap(th->vm->living_threads, th->self); + th->status = THREAD_KILLED; + rb_raise(rb_eThreadError, "can't create Thread (%d)", err); + } return thval; } diff --git a/thread_pthread.c b/thread_pthread.c index 22db6d9f83..076fc2aaf8 100644 --- a/thread_pthread.c +++ b/thread_pthread.c @@ -509,11 +509,6 @@ native_thread_create(rb_thread_t *th) if (!err) { pthread_cond_init(&th->native_thread_data.sleep_cond, 0); } - else { - st_delete_wrap(th->vm->living_threads, th->self); - th->status = THREAD_KILLED; - rb_raise(rb_eThreadError, "can't create Thread (%d)", err); - } } return err; } diff --git a/thread_win32.c b/thread_win32.c index 139b94a94c..2baa60642b 100644 --- a/thread_win32.c +++ b/thread_win32.c @@ -479,8 +479,7 @@ native_thread_create(rb_thread_t *th) th->thread_id = w32_create_thread(stack_size, thread_start_func_1, th); if ((th->thread_id) == 0) { - st_delete_wrap(th->vm->living_threads, th->self); - rb_raise(rb_eThreadError, "can't create Thread (%d)", errno); + return errno ? errno : -1; } w32_resume_thread(th->thread_id); |