summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2023-03-31 03:52:58 +0900
committerKoichi Sasada <ko1@atdot.net>2023-03-31 11:28:18 +0900
commit2093e4c2db1e19991e601bf5191eddb4652de35d (patch)
tree486cb12704655596fdec0227a37450da23d8b5f4
parent83667008b925c32b3ab70fb6ec70f7398e960d1e (diff)
`nt->serial` for `RUBY_DEBUG_LOG`
Show native thread's serial on `RUBY_DEBUG_LOG`. `nt->serial` is also stored into `ruby_nt_serial` if the compiler supports `RB_THREAD_LOCAL_SPECIFIER`.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/7630
-rw-r--r--debug.c40
-rw-r--r--thread_pthread.c18
-rw-r--r--thread_pthread.h20
-rw-r--r--vm.c3
4 files changed, 65 insertions, 16 deletions
diff --git a/debug.c b/debug.c
index f1b83714d8..60cd52ad13 100644
--- a/debug.c
+++ b/debug.c
@@ -533,7 +533,9 @@ ruby_debug_log(const char *file, int line, const char *func_name, const char *fm
len += r;
}
- if (rb_current_execution_context(false)) {
+ rb_execution_context_t *ec = rb_current_execution_context(false);
+
+ if (ec) {
// Ruby location
int ruby_line;
const char *ruby_file = rb_source_location_cstr(&ruby_line);
@@ -547,22 +549,46 @@ ruby_debug_log(const char *file, int line, const char *func_name, const char *fm
if (r < 0) rb_bug("ruby_debug_log returns %d\n", r);
len += r;
}
+ }
+
+#ifdef RUBY_NT_SERIAL
+ // native thread information
+ if (len < MAX_DEBUG_LOG_MESSAGE_LEN) {
+ r = snprintf(buff + len, MAX_DEBUG_LOG_MESSAGE_LEN - len, "\tnt:%d", ruby_nt_serial);
+ if (r < 0) rb_bug("ruby_debug_log returns %d\n", r);
+ len += r;
+ }
+#endif
+
+ if (ec) {
+ rb_thread_t *th = ec ? rb_ec_thread_ptr(ec) : NULL;
// ractor information
if (ruby_single_main_ractor == NULL) {
- rb_ractor_t *cr = GET_RACTOR();
+ rb_ractor_t *cr = th ? th->ractor : NULL;
+
if (r && len < MAX_DEBUG_LOG_MESSAGE_LEN) {
- r = snprintf(buff + len, MAX_DEBUG_LOG_MESSAGE_LEN - len, "\tr:#%u/%u",
- (unsigned int)rb_ractor_id(cr), GET_VM()->ractor.cnt);
+ r = snprintf(buff + len, MAX_DEBUG_LOG_MESSAGE_LEN - len, "\tr:#%d/%u",
+ cr ? (int)rb_ractor_id(cr) : -1, GET_VM()->ractor.cnt);
+
if (r < 0) rb_bug("ruby_debug_log returns %d\n", r);
len += r;
}
}
// thread information
- const rb_thread_t *th = GET_THREAD();
- if (r && len < MAX_DEBUG_LOG_MESSAGE_LEN) {
- r = snprintf(buff + len, MAX_DEBUG_LOG_MESSAGE_LEN - len, "\tth:%u", rb_th_serial(th));
+ if (th && r && len < MAX_DEBUG_LOG_MESSAGE_LEN) {
+ rb_execution_context_t *rec = th->ractor ? th->ractor->threads.running_ec : NULL;
+ const rb_thread_t *rth = rec ? rec->thread_ptr : NULL;
+ const rb_thread_t *sth = th->ractor ? th->ractor->threads.sched.running : NULL;
+
+ if (rth != th || sth != th) {
+ r = snprintf(buff + len, MAX_DEBUG_LOG_MESSAGE_LEN - len, "\tth:%u (rth:%d,sth:%d)",
+ rb_th_serial(th), rth ? (int)rb_th_serial(rth) : -1, sth ? (int)rb_th_serial(sth) : -1);
+ }
+ else {
+ r = snprintf(buff + len, MAX_DEBUG_LOG_MESSAGE_LEN - len, "\tth:%u", rb_th_serial(th));
+ }
if (r < 0) rb_bug("ruby_debug_log returns %d\n", r);
len += r;
}
diff --git a/thread_pthread.c b/thread_pthread.c
index d5a00ff84a..9fe561a789 100644
--- a/thread_pthread.c
+++ b/thread_pthread.c
@@ -1157,6 +1157,11 @@ static void *
thread_start_func_1(void *th_ptr)
{
rb_thread_t *th = th_ptr;
+
+#if USE_RUBY_DEBUG_LOG && defined(RUBY_NT_SERIAL)
+ ruby_nt_serial = th->nt->serial;
+#endif
+
RB_ALTSTACK_INIT(void *altstack, th->nt->altstack);
#if USE_THREAD_CACHE
thread_start:
@@ -1298,13 +1303,24 @@ clear_thread_cache_altstack(void)
}
#endif
+static struct rb_native_thread *
+native_thread_alloc(void)
+{
+ struct rb_native_thread *nt = ZALLOC(struct rb_native_thread);
+#if USE_RUBY_DEBUG_LOG
+ static rb_atomic_t nt_serial = 1;
+ nt->serial = RUBY_ATOMIC_FETCH_ADD(nt_serial, 1);
+#endif
+ return nt;
+}
+
static int
native_thread_create(rb_thread_t *th)
{
int err = 0;
VM_ASSERT(th->nt == 0);
- th->nt = ZALLOC(struct rb_native_thread);
+ th->nt = native_thread_alloc();
if (use_cached_thread(th)) {
RUBY_DEBUG_LOG("use cached nt. th:%u", rb_th_serial(th));
diff --git a/thread_pthread.h b/thread_pthread.h
index 0f8e4d6096..40d7a13aa0 100644
--- a/thread_pthread.h
+++ b/thread_pthread.h
@@ -26,7 +26,7 @@ struct rb_thread_sched_item {
};
struct rb_native_thread {
- int id;
+ rb_atomic_t serial;
rb_nativethread_id_t thread_id;
@@ -101,13 +101,17 @@ struct rb_thread_sched {
RUBY_SYMBOL_EXPORT_BEGIN
#ifdef RB_THREAD_LOCAL_SPECIFIER
-# ifdef __APPLE__
-// on Darwin, TLS can not be accessed across .so
-struct rb_execution_context_struct *rb_current_ec(void);
-void rb_current_ec_set(struct rb_execution_context_struct *);
-# else
-RUBY_EXTERN RB_THREAD_LOCAL_SPECIFIER struct rb_execution_context_struct *ruby_current_ec;
-# endif
+ # ifdef __APPLE__
+ // on Darwin, TLS can not be accessed across .so
+ struct rb_execution_context_struct *rb_current_ec(void);
+ void rb_current_ec_set(struct rb_execution_context_struct *);
+ # else
+ RUBY_EXTERN RB_THREAD_LOCAL_SPECIFIER struct rb_execution_context_struct *ruby_current_ec;
+
+ // for RUBY_DEBUG_LOG()
+ RUBY_EXTERN RB_THREAD_LOCAL_SPECIFIER rb_atomic_t ruby_nt_serial;
+ #define RUBY_NT_SERIAL 1
+ # endif
#else
typedef pthread_key_t native_tls_key_t;
diff --git a/vm.c b/vm.c
index 69d57913a4..eb60d3792d 100644
--- a/vm.c
+++ b/vm.c
@@ -440,6 +440,9 @@ bool ruby_vm_keep_script_lines;
#ifdef RB_THREAD_LOCAL_SPECIFIER
RB_THREAD_LOCAL_SPECIFIER rb_execution_context_t *ruby_current_ec;
+#ifdef RUBY_NT_SERIAL
+RB_THREAD_LOCAL_SPECIFIER rb_atomic_t ruby_nt_serial;
+#endif
#ifdef __APPLE__
rb_execution_context_t *