[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]