aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--thread_pthread.c16
2 files changed, 23 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index a727d9b632..f60fccf074 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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));