Name worker threads using pthread_setname_np
authorSimon Marlow <marlowsd@gmail.com>
Fri, 10 Oct 2014 13:26:19 +0000 (14:26 +0100)
committerSimon Marlow <marlowsd@gmail.com>
Fri, 10 Oct 2014 13:31:59 +0000 (14:31 +0100)
This helps identify threads in gdb particularly in processes with a
lot of threads.

includes/rts/OSThreads.h
rts/Task.c
rts/posix/OSThreads.c
rts/sm/GC.c
rts/win32/OSThreads.c
testsuite/tests/rts/testwsdeque.c

index e99be8a..a3ed47c 100644 (file)
@@ -171,7 +171,7 @@ extern void yieldThread           ( void );
 
 typedef void OSThreadProcAttr OSThreadProc(void *);
 
-extern int  createOSThread        ( OSThreadId* tid,
+extern int  createOSThread        ( OSThreadId* tid, char *name,
                                     OSThreadProc *startProc, void *param);
 extern rtsBool osThreadIsAlive    ( OSThreadId id );
 extern void interruptOSThread (OSThreadId id);
index 0370711..42893fe 100644 (file)
@@ -462,7 +462,7 @@ startWorkerTask (Capability *cap)
   ASSERT_LOCK_HELD(&cap->lock);
   cap->running_task = task;
 
-  r = createOSThread(&tid, (OSThreadProc*)workerStart, task);
+  r = createOSThread(&tid, "ghc_worker", (OSThreadProc*)workerStart, task);
   if (r != 0) {
     sysErrorBelch("failed to create OS thread");
     stg_exit(EXIT_FAILURE);
index e627bab..e880b89 100644 (file)
@@ -129,11 +129,14 @@ shutdownThread(void)
 }
 
 int
-createOSThread (OSThreadId* pId, OSThreadProc *startProc, void *param)
+createOSThread (OSThreadId* pId, char *name,
+                OSThreadProc *startProc, void *param)
 {
   int result = pthread_create(pId, NULL, (void *(*)(void *))startProc, param);
-  if(!result)
+  if (!result) {
     pthread_detach(*pId);
+    pthread_setname_np(*pId, name);
+  }
   return result;
 }
 
index dabcd72..19d9ab2 100644 (file)
@@ -670,6 +670,15 @@ GarbageCollect (nat collect_gen,
   if (major_gc) { gcCAFs(); }
 #endif
 
+  // Update the stable pointer hash table.
+  updateStableTables(major_gc);
+
+  // unlock the StablePtr table.  Must be before scheduleFinalizers(),
+  // because a finalizer may call hs_free_fun_ptr() or
+  // hs_free_stable_ptr(), both of which access the StablePtr table.
+  stableUnlock();
+
+  // Must be after stableUnlock(), because it might free stable ptrs.
   if (major_gc) {
       checkUnload (gct->scavenged_static_objects);
   }
@@ -696,14 +705,6 @@ GarbageCollect (nat collect_gen,
       }
   }
 
-  // Update the stable pointer hash table.
-  updateStableTables(major_gc);
-
-  // unlock the StablePtr table.  Must be before scheduleFinalizers(),
-  // because a finalizer may call hs_free_fun_ptr() or
-  // hs_free_stable_ptr(), both of which access the StablePtr table.
-  stableUnlock();
-
   // Start any pending finalizers.  Must be after
   // updateStableTables() and stableUnlock() (see #4221).
   RELEASE_SM_LOCK;
index e336bd2..c3d3af6 100644 (file)
@@ -98,7 +98,8 @@ shutdownThread()
 }
 
 int
-createOSThread (OSThreadId* pId, OSThreadProc *startProc, void *param)
+createOSThread (OSThreadId* pId, char *name STG_UNUSED,
+                OSThreadProc *startProc, void *param)
 {
     HANDLE h;
     h = CreateThread ( NULL,  /* default security attributes */
index 51aeec1..e6f644c 100644 (file)
@@ -149,7 +149,7 @@ int main(int argc, char*argv[])
     }
 
     for (n=0; n < THREADS; n++) {
-        createOSThread(&ids[n], thief, (void*)(StgWord)n);
+        createOSThread(&ids[n], "thief", thief, (void*)(StgWord)n);
     }
 
     for (n=0; n < SCRATCH_SIZE; n++) {