diff options
Diffstat (limited to 'thread_pthread.c')
-rw-r--r-- | thread_pthread.c | 49 |
1 files changed, 24 insertions, 25 deletions
diff --git a/thread_pthread.c b/thread_pthread.c index 7e4d36c479..3ef316c639 100644 --- a/thread_pthread.c +++ b/thread_pthread.c @@ -1447,36 +1447,35 @@ timer_thread_sleep(rb_global_vm_lock_t* unused) # define SET_THREAD_NAME(name) (void)0 #endif -static VALUE rb_thread_inspect_msg(VALUE thread, int show_enclosure, int show_location, int show_status); - static void native_set_thread_name(rb_thread_t *th) { #if defined(__linux__) && defined(PR_SET_NAME) - VALUE str; - char *name, *p; - char buf[16]; - size_t len; - - str = rb_thread_inspect_msg(th->self, 0, 1, 0); - name = StringValueCStr(str); - if (*name == '@') - name++; - p = strrchr(name, '/'); /* show only the basename of the path. */ - if (p && p[1]) - name = p + 1; - - len = strlen(name); - if (len < sizeof(buf)) { - memcpy(buf, name, len); - buf[len] = '\0'; - } - else { - memcpy(buf, name, sizeof(buf)-2); - buf[sizeof(buf)-2] = '*'; - buf[sizeof(buf)-1] = '\0'; + if (!th->first_func && th->first_proc) { + VALUE loc = rb_proc_location(th->first_proc); + if (!NIL_P(loc)) { + const VALUE *ptr = RARRAY_CONST_PTR(loc); /* [ String, Fixnum ] */ + char *name, *p; + char buf[16]; + size_t len; + int n; + + name = RSTRING_PTR(ptr[0]); + p = strrchr(name, '/'); /* show only the basename of the path. */ + if (p && p[1]) + name = p + 1; + + n = snprintf(buf, sizeof(buf), "%s:%d", name, NUM2INT(ptr[1])); + rb_gc_force_recycle(loc); /* acts as a GC guard, too */ + + len = (size_t)n; + if (len >= sizeof(buf)) { + buf[sizeof(buf)-2] = '*'; + buf[sizeof(buf)-1] = '\0'; + } + SET_THREAD_NAME(buf); + } } - SET_THREAD_NAME(buf); #endif } |