diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-08-30 13:37:59 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-08-30 13:37:59 +0000 |
commit | 93024c637776dfff344deeb80fa4dd15b0409614 (patch) | |
tree | dc61d724c0292e5546b818856378963211a02c98 | |
parent | b59b1b9bd9ceb7e83e4de44859ad2b1a1c3103a0 (diff) |
thread_pthread.c: fill stack info by creator thread
* thread_pthread.c (native_thread_init_stack): wait the creator thread
to fill machine stack info, if get_stack_of() is available.
* thread_pthread.c (native_thread_create): fill the created thread
stack info after starting, if get_stack_of() is available.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42732 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | thread_pthread.c | 16 |
2 files changed, 23 insertions, 1 deletions
@@ -1,4 +1,10 @@ -Fri Aug 30 22:37:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org> +Fri Aug 30 22:37:57 2013 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * thread_pthread.c (native_thread_init_stack): wait the creator thread + to fill machine stack info, if get_stack_of() is available. + + * thread_pthread.c (native_thread_create): fill the created thread + stack info after starting, if get_stack_of() is available. * thread_pthread.c (native_thread_create): define attr only if it is used, and merge pthread_create() calls. diff --git a/thread_pthread.c b/thread_pthread.c index c08ad02ffc..9d1395910e 100644 --- a/thread_pthread.c +++ b/thread_pthread.c @@ -754,6 +754,11 @@ native_thread_init_stack(rb_thread_t *th) th->machine_stack_start = start; th->machine_stack_maxsize = size; } +#elif defined get_stack_of + if (!th->machine_stack_maxsize) { + native_mutex_lock(&th->interrupt_lock); + native_mutex_unlock(&th->interrupt_lock); + } #else rb_raise(rb_eNotImpError, "ruby engine can initialize only in the main thread"); #endif @@ -929,7 +934,18 @@ native_thread_create(rb_thread_t *th) # endif CHECK_ERR(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED)); #endif +#ifdef get_stack_of + native_mutex_lock(&th->interrupt_lock); +#endif err = pthread_create(&th->thread_id, attrp, thread_start_func_1, th); +#ifdef get_stack_of + if (!err) { + get_stack_of(th->thread_id, + &th->machine_stack_start, + &th->machine_stack_maxsize); + } + native_mutex_unlock(&th->interrupt_lock); +#endif thread_debug("create: %p (%d)\n", (void *)th, err); #ifdef HAVE_PTHREAD_ATTR_INIT CHECK_ERR(pthread_attr_destroy(&attr)); |