[#104307] Float truncate — Eustáquio Rangel <eustaquiorangel@...>
Hi!
4 messages
2021/06/16
[ruby-core:104174] [Ruby master Feature#17853] Add Thread#thread_id
From:
nobu@...
Date:
2021-06-05 09:29:20 UTC
List:
ruby-core #104174
Issue #17853 has been updated by nobu (Nobuyoshi Nakada).
```diff
diff --git i/thread.c w/thread.c
index cbef44a9d4a..c627e5c8f2a 100644
--- i/thread.c
+++ w/thread.c
@@ -3456,6 +3456,14 @@ rb_thread_to_s(VALUE thread)
if (!NIL_P(target_th->name)) {
rb_str_catf(str, "@%"PRIsVALUE, target_th->name);
}
+#if USE_NATIVE_THREAD_NATIVE_THREAD_ID
+ if (!rb_threadptr_dead(target_th)) {
+ VALUE native_id = native_thread_native_thread_id(target_th);
+ if (!NIL_P(native_id)) {
+ rb_str_catf(str, "(%"PRIsVALUE")", native_id);
+ }
+ }
+#endif
if ((loc = threadptr_invoke_proc_location(target_th)) != Qnil) {
rb_str_catf(str, " %"PRIsVALUE":%"PRIsVALUE,
RARRAY_AREF(loc, 0), RARRAY_AREF(loc, 1));
```
----------------------------------------
Feature #17853: Add Thread#thread_id
https://bugs.ruby-lang.org/issues/17853#change-92351
* Author: komamitsu (Mitsunori Komatsu)
* Status: Closed
* Priority: Normal
----------------------------------------
# Abstract
New method `Thread#thread_id` to get associated native thread id (LWP.) It might return `nil` if OS doesn't support thread id or equivalent.
# Background
When I tried to investigate which Ruby thread of an application is busy, I did the following steps
- checked the CPU usage of the Ruby application's threads using `ps -eLf` or `top` (with H key) and got which thread is busy
- dumped all the threads of the application using https://github.com/frsyuki/sigdump
- tried to find a busy thread in the thread dump result, but the thread dump doesn't contain thread id...
`Thread` class itself has no method to get associated thread id. If the class has `#thread_id` or something, I can create a PR on `sigdump` project to add `thread id` in thread dump output to make investigations with thread dump much easier.
`Thread#name` may seem an alternative to `Thread#thread_id`, but `Thread#name` just returns a value that's set through `Thread#name=` while `Thread#thread_id` returns a thread id that OS or something has assigned.
In case of Java, thread dump created by `jcmd ${pid} Thread.print` contains `nid` field which is an associated native thread id
```
"http-bio-80-exec-77" daemon prio=6 tid=0x0000000026f29000 nid=0xbd0 runnable [0x0000000020c7f000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:516)
at org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:501)
at org.apache.coyote.http11.Http11Processor.setRequestLineReadTimeout(Http11Processor.java:167)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:946)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
- locked <0x00000007b16e3e88> (a org.apache.tomcat.util.net.SocketWrapper)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
```
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>