summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--thread.c10
-rw-r--r--thread_pthread.c11
-rw-r--r--thread_win32.c5
-rw-r--r--win32/win32.c42
4 files changed, 59 insertions, 9 deletions
diff --git a/thread.c b/thread.c
index ea5172129a..2e0713e54f 100644
--- a/thread.c
+++ b/thread.c
@@ -2932,9 +2932,6 @@ rb_thread_getname(VALUE thread)
static VALUE
rb_thread_setname(VALUE thread, VALUE name)
{
-#ifdef SET_ANOTHER_THREAD_NAME
- const char *s = "";
-#endif
rb_thread_t *target_th = rb_thread_ptr(thread);
if (!NIL_P(name)) {
@@ -2946,16 +2943,11 @@ rb_thread_setname(VALUE thread, VALUE name)
rb_enc_name(enc));
}
name = rb_str_new_frozen(name);
-#ifdef SET_ANOTHER_THREAD_NAME
- s = RSTRING_PTR(name);
-#endif
}
target_th->name = name;
-#if defined(SET_ANOTHER_THREAD_NAME)
if (threadptr_initialized(target_th)) {
- SET_ANOTHER_THREAD_NAME(target_th->thread_id, s);
+ native_set_another_thread_name(target_th->thread_id, name);
}
-#endif
return name;
}
diff --git a/thread_pthread.c b/thread_pthread.c
index 18170c8e16..242b48f15d 100644
--- a/thread_pthread.c
+++ b/thread_pthread.c
@@ -1540,6 +1540,17 @@ native_set_thread_name(rb_thread_t *th)
#endif
}
+static VALUE
+native_set_another_thread_name(rb_nativethread_id_t thread_id, VALUE name)
+{
+#ifdef SET_ANOTHER_THREAD_NAME
+ const char *s = "";
+ if (!NIL_P(name)) s = RSTRING_PTR(name);
+ SET_ANOTHER_THREAD_NAME(thread_id, s);
+#endif
+ return name;
+}
+
static void *
thread_timer(void *p)
{
diff --git a/thread_win32.c b/thread_win32.c
index d5a7ff4581..5b42310679 100644
--- a/thread_win32.c
+++ b/thread_win32.c
@@ -669,6 +669,10 @@ ubf_handle(void *ptr)
}
}
+int rb_w32_set_thread_description(HANDLE th, const WCHAR *name);
+int rb_w32_set_thread_description_str(HANDLE th, VALUE name);
+#define native_set_another_thread_name rb_w32_set_thread_description_str
+
static struct {
HANDLE id;
HANDLE lock;
@@ -679,6 +683,7 @@ static unsigned long __stdcall
timer_thread_func(void *dummy)
{
thread_debug("timer_thread\n");
+ rb_w32_set_thread_description(GetCurrentThread(), L"ruby-timer-thread");
while (WaitForSingleObject(timer_thread.lock, TIME_QUANTUM_USEC/1000) ==
WAIT_TIMEOUT) {
timer_thread_function(dummy);
diff --git a/win32/win32.c b/win32/win32.c
index d40f0a57b1..9243d6a293 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -7857,6 +7857,48 @@ rb_w32_pow(double x, double y)
}
#endif
+int
+rb_w32_set_thread_description(HANDLE th, const WCHAR *name)
+{
+ int result = FALSE;
+ typedef HRESULT (WINAPI *set_thread_description_func)(HANDLE, PCWSTR);
+ static set_thread_description_func set_thread_description =
+ (set_thread_description_func)-1;
+ if (set_thread_description == (set_thread_description_func)-1) {
+ set_thread_description = (set_thread_description_func)
+ get_proc_address("kernel32", "SetThreadDescription", NULL);
+ }
+ if (set_thread_description != (set_thread_description_func)-1) {
+ result = set_thread_description(th, name);
+ }
+ return result;
+}
+
+int
+rb_w32_set_thread_description_str(HANDLE th, VALUE name)
+{
+ int idx, result = FALSE;
+ WCHAR *s;
+
+ if (NIL_P(name)) {
+ rb_w32_set_thread_description(th, L"");
+ return;
+ }
+ s = (WCHAR *)StringValueCStr(name);
+ idx = rb_enc_get_index(name);
+ if (idx == ENCINDEX_UTF_16LE) {
+ result = rb_w32_set_thread_description(th, s);
+ }
+ else {
+ name = rb_str_conv_enc(name, rb_enc_from_index(idx), rb_utf8_encoding());
+ s = mbstr_to_wstr(CP_UTF8, RSTRING_PTR(name), RSTRING_LEN(name)+1, NULL);
+ result = rb_w32_set_thread_description(th, s);
+ free(s);
+ }
+ RB_GC_GUARD(name);
+ return result;
+}
+
VALUE (*const rb_f_notimplement_)(int, const VALUE *, VALUE) = rb_f_notimplement;
#if RUBY_MSVCRT_VERSION < 120