summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEcho Nolan <echo@echonolan.net>2017-09-25 18:33:30 -0400
committerBen Gamari <ben@smart-cactus.org>2017-09-25 22:43:52 -0400
commitd07b8c7ae8bc22a7c36c96cb3fd800aecdde6eac (patch)
tree46a5cbf6659af1a8dd7890f8d0c8e5fbb65c5228
parent6de1a5a96cdaba080570e9f47ff8711796e2e83b (diff)
downloadhaskell-d07b8c7ae8bc22a7c36c96cb3fd800aecdde6eac.tar.gz
Include original process name in worker thread name (#14153)
Prior to this commit, worker OS thread were renamed to "ghc_worker" when spawned. This was annoying when reading debugging messages that print the process name because it doesn't tell you *which* Haskell program is generating the message. This commit changes it to "original_process_name:w", truncating the original name to fit in the kernel buffer if neccesary. Test Plan: ./validate Reviewers: austin, bgamari, erikd, simonmar Reviewed By: bgamari Subscribers: Phyx, rwbarton, thomie Differential Revision: https://phabricator.haskell.org/D4001
-rw-r--r--rts/Task.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/rts/Task.c b/rts/Task.c
index 4376148c7a..fc928d5e31 100644
--- a/rts/Task.c
+++ b/rts/Task.c
@@ -19,6 +19,8 @@
#include "Hash.h"
#include "Trace.h"
+#include <string.h>
+
#if HAVE_SIGNAL_H
#include <signal.h>
#endif
@@ -468,7 +470,26 @@ startWorkerTask (Capability *cap)
ASSERT_LOCK_HELD(&cap->lock);
cap->running_task = task;
- r = createOSThread(&tid, "ghc_worker", (OSThreadProc*)workerStart, task);
+ // Set the name of the worker thread to the original process name followed by
+ // ":w", but only if we're on Linux where the program_invocation_short_name
+ // global is available.
+#if defined(linux_HOST_OS)
+ size_t procname_len = strlen(program_invocation_short_name);
+ char worker_name[16];
+ // The kernel only allocates 16 bytes for thread names, so we truncate if the
+ // original name is too long. Process names go in another table that has more
+ // capacity.
+ if (procname_len >= 13) {
+ strncpy(worker_name, program_invocation_short_name, 13);
+ strcpy(worker_name + 13, ":w");
+ } else {
+ strcpy(worker_name, program_invocation_short_name);
+ strcpy(worker_name + procname_len, ":w");
+ }
+#else
+ char * worker_name = "ghc_worker";
+#endif
+ r = createOSThread(&tid, worker_name, (OSThreadProc*)workerStart, task);
if (r != 0) {
sysErrorBelch("failed to create OS thread");
stg_exit(EXIT_FAILURE);