diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | thread.c | 35 | ||||
-rw-r--r-- | thread_pthread.c | 33 | ||||
-rw-r--r-- | thread_win32.c | 5 |
4 files changed, 72 insertions, 11 deletions
@@ -1,3 +1,13 @@ +Sun Sep 21 14:11:23 2014 Tanaka Akira <akr@fsij.org> + + * thread_pthread.c (native_set_thread_name): New function to + set thread name visible with ps command on GNU/Linux. + Ex. ps -o %c -L + + * thread.c (thread_start_func_2): Call native_set_thread_name at + beginning. + (rb_thread_inspect_msg): Extract from rb_thread_inspect. + Sun Sep 21 12:49:11 2014 Eric Wong <e@80x24.org> * iseq.c (rb_iseq_defined_string): trim redundant semi-colon @@ -571,6 +571,7 @@ thread_start_func_2(rb_thread_t *th, VALUE *stack_start, VALUE *register_stack_s TH_PUSH_TAG(th); if ((state = EXEC_TAG()) == 0) { SAVE_ROOT_JMPBUF(th, { + native_set_thread_name(th); if (!th->first_func) { GetProcPtr(th->first_proc, proc); th->errinfo = Qnil; @@ -2701,15 +2702,8 @@ rb_thread_safe_level(VALUE thread) return INT2NUM(th->safe_level); } -/* - * call-seq: - * thr.inspect -> string - * - * Dump the name, id, and status of _thr_ to a string. - */ - static VALUE -rb_thread_inspect(VALUE thread) +rb_thread_inspect_msg(VALUE thread, int show_enclosure, int show_location, int show_status) { VALUE cname = rb_class_path(rb_obj_class(thread)); rb_thread_t *th; @@ -2718,8 +2712,11 @@ rb_thread_inspect(VALUE thread) GetThreadPtr(thread, th); status = thread_status_name(th); - str = rb_sprintf("#<%"PRIsVALUE":%p", cname, (void *)thread); - if (!th->first_func && th->first_proc) { + if (show_enclosure) + str = rb_sprintf("#<%"PRIsVALUE":%p", cname, (void *)thread); + else + str = rb_str_new(NULL, 0); + if (show_location && !th->first_func && th->first_proc) { long i; VALUE v, loc = rb_proc_location(th->first_proc); if (!NIL_P(loc)) { @@ -2730,12 +2727,28 @@ rb_thread_inspect(VALUE thread) } } } - rb_str_catf(str, " %s>", status); + if (show_status || show_enclosure) + rb_str_catf(str, " %s%s", + show_status ? status : "", + show_enclosure ? ">" : ""); OBJ_INFECT(str, thread); return str; } +/* + * call-seq: + * thr.inspect -> string + * + * Dump the name, id, and status of _thr_ to a string. + */ + +static VALUE +rb_thread_inspect(VALUE thread) +{ + return rb_thread_inspect_msg(thread, 1, 1, 1); +} + static VALUE threadptr_local_aref(rb_thread_t *th, ID id) { diff --git a/thread_pthread.c b/thread_pthread.c index eee60f373a..7e4d36c479 100644 --- a/thread_pthread.c +++ b/thread_pthread.c @@ -1447,6 +1447,39 @@ 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'; + } + SET_THREAD_NAME(buf); +#endif +} + static void * thread_timer(void *p) { diff --git a/thread_win32.c b/thread_win32.c index a0b26e3d4a..c4ea6c8efd 100644 --- a/thread_win32.c +++ b/thread_win32.c @@ -794,4 +794,9 @@ rb_nativethread_self(void) return GetCurrentThread(); } +static void +native_set_thread_name(rb_thread_t *th) +{ +} + #endif /* THREAD_SYSTEM_DEPENDENT_IMPLEMENTATION */ |