ruby-changes:38782
From: naruse <ko1@a...>
Date: Sat, 13 Jun 2015 17:39:48 +0900 (JST)
Subject: [ruby-changes:38782] naruse:r50863 (trunk): * vm_core.h (rb_thread_t): add th->name.
naruse 2015-06-13 17:39:30 +0900 (Sat, 13 Jun 2015) New Revision: 50863 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=50863 Log: * vm_core.h (rb_thread_t): add th->name. * vm.c (th_init): initialize th->name. * thread.c (Init_Thread): add Thread.name and Thread.name=. * thread.c (rb_thread_inspect): show thread's name if set. * thread.c (rb_thread_getname): defined. * thread.c (rb_thread_setname): ditto. Modified files: trunk/ChangeLog trunk/test/ruby/test_thread.rb trunk/thread.c trunk/vm.c trunk/vm_core.h Index: ChangeLog =================================================================== --- ChangeLog (revision 50862) +++ ChangeLog (revision 50863) @@ -1,3 +1,17 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Sat Jun 13 17:35:11 2015 NARUSE, Yui <naruse@r...> + + * vm_core.h (rb_thread_t): add th->name. + + * vm.c (th_init): initialize th->name. + + * thread.c (Init_Thread): add Thread.name and Thread.name=. + + * thread.c (rb_thread_inspect): show thread's name if set. + + * thread.c (rb_thread_getname): defined. + + * thread.c (rb_thread_setname): ditto. + Sat Jun 13 11:39:43 2015 SHIBATA Hiroshi <hsbt@r...> * lib/tempfile.rb: Fix typo. [fix GH-933] Patch by @Zorbash Index: vm_core.h =================================================================== --- vm_core.h (revision 50862) +++ vm_core.h (revision 50863) @@ -745,6 +745,7 @@ typedef struct rb_thread_struct { https://github.com/ruby/ruby/blob/trunk/vm_core.h#L745 void *altstack; #endif unsigned long running_time_us; + VALUE name; } rb_thread_t; typedef enum { Index: thread.c =================================================================== --- thread.c (revision 50862) +++ thread.c (revision 50863) @@ -2717,6 +2717,58 @@ rb_thread_safe_level(VALUE thread) https://github.com/ruby/ruby/blob/trunk/thread.c#L2717 /* * call-seq: + * thr.name -> string + * + * Dump the name, id, and status of _thr_ to a string. + */ + +static VALUE +rb_thread_getname(VALUE thread) +{ + rb_thread_t *th; + GetThreadPtr(thread, th); + return th->name; +} + +/* + * call-seq: + * thr.name=(name) -> string + * + * Dump the name, id, and status of _thr_ to a string. + */ + +static VALUE +rb_thread_setname(VALUE thread, VALUE name) +{ + rb_thread_t *th; + GetThreadPtr(thread, th); + th->name = rb_str_new_frozen(name); +#if defined(HAVE_PTHREAD_SETNAME_NP) +# if defined(__linux__) + pthread_setname_np(th->thread_id, RSTRING_PTR(name)); +# elif defined(__NetBSD__) + pthread_setname_np(th->thread_id, RSTRING_PTR(name), "%s"); +#elif defined(__APPLE__) + { + int mib[2] = {CTL_KERN, KERN_THREADNAME}; + int r; +# ifndef MAXTHREADNAMESIZE +# define MAXTHREADNAMESIZE 64 +# endif + int size_t len = RSTRING_LEN(name); + if (len > MAXTHREADNAMESIZE-1) len = MAXTHREADNAMESIZE-1; + r = sysctl(mib, 2, NULL, 0, RSTRING_PTR(name), len); + if (!r) rb_sys_fail("sysctl([CTL_KERN, KERN_THREADNAME],..)"); + } +# endif +#elif defined(HAVE_PTHREAD_SET_NAME_NP) /* FreeBSD */ + pthread_set_name_np(th->thread_id, RSTRING_PTR(name)); +#endif + return name; +} + +/* + * call-seq: * thr.inspect -> string * * Dump the name, id, and status of _thr_ to a string. @@ -2733,6 +2785,9 @@ rb_thread_inspect(VALUE thread) https://github.com/ruby/ruby/blob/trunk/thread.c#L2785 GetThreadPtr(thread, th); status = thread_status_name(th); str = rb_sprintf("#<%"PRIsVALUE":%p", cname, (void *)thread); + if (!NIL_P(th->name)) { + rb_str_catf(str, "@%"PRIsVALUE, th->name); + } if (!th->first_func && th->first_proc) { VALUE loc = rb_proc_location(th->first_proc); if (!NIL_P(loc)) { @@ -5039,6 +5094,8 @@ Init_Thread(void) https://github.com/ruby/ruby/blob/trunk/thread.c#L5094 rb_define_method(rb_cThread, "backtrace", rb_thread_backtrace_m, -1); rb_define_method(rb_cThread, "backtrace_locations", rb_thread_backtrace_locations_m, -1); + rb_define_method(rb_cThread, "name", rb_thread_getname, 0); + rb_define_method(rb_cThread, "name=", rb_thread_setname, 1); rb_define_method(rb_cThread, "inspect", rb_thread_inspect, 0); rb_vm_register_special_exception(ruby_error_closed_stream, rb_eIOError, "stream closed"); Index: vm.c =================================================================== --- vm.c (revision 50862) +++ vm.c (revision 50863) @@ -2262,6 +2262,7 @@ th_init(rb_thread_t *th, VALUE self) https://github.com/ruby/ruby/blob/trunk/vm.c#L2262 #if OPT_CALL_THREADED_CODE th->retval = Qundef; #endif + th->name = Qnil; } static VALUE Index: test/ruby/test_thread.rb =================================================================== --- test/ruby/test_thread.rb (revision 50862) +++ test/ruby/test_thread.rb (revision 50863) @@ -1046,4 +1046,11 @@ q.pop https://github.com/ruby/ruby/blob/trunk/test/ruby/test_thread.rb#L1046 t.new {} end end + + def test_thread_name + t = Thread.start { } + t.name = 'foo' + assert_equal 'foo', t.name + t.join + end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/