Use snwprintf instead of swprintf in rts/Linker.c.
[ghc.git] / rts / ThreadLabels.c
index 9b9f172..981a5d9 100644 (file)
@@ -8,13 +8,18 @@
  * ---------------------------------------------------------------------------*/
 
 #include "PosixSource.h"
+#include "Rts.h"
+
 #include "ThreadLabels.h"
 #include "RtsUtils.h"
+#include "Hash.h"
+#include "Trace.h"
 
 #include <stdlib.h>
+#include <string.h>
 
 #if defined(DEBUG)
-/* to the end */
+
 static HashTable * threadLabels = NULL;
 
 void
@@ -26,6 +31,15 @@ initThreadLabelTable(void)
 }
 
 void
+freeThreadLabelTable(void)
+{
+    if (threadLabels != NULL) {
+        freeHashTable(threadLabels, stgFree);
+        threadLabels = NULL;
+    }
+}
+
+static void
 updateThreadLabel(StgWord key, void *data)
 {
   removeThreadLabel(key);
@@ -45,6 +59,26 @@ removeThreadLabel(StgWord key)
   if ((old = lookupHashTable(threadLabels,key))) {
     removeHashTable(threadLabels,key,old);
     stgFree(old);
-  }  
+  }
 }
+
 #endif /* DEBUG */
+
+void
+labelThread(Capability *cap   STG_UNUSED,
+            StgTSO     *tso   STG_UNUSED,
+            char       *label STG_UNUSED)
+{
+#if defined(DEBUG)
+  int len;
+  void *buf;
+
+  /* Caveat: Once set, you can only set the thread name to "" */
+  len = strlen(label)+1;
+  buf = stgMallocBytes(len * sizeof(char), "Schedule.c:labelThread()");
+  strncpy(buf,label,len);
+  /* Update will free the old memory for us */
+  updateThreadLabel(tso->id,buf);
+#endif
+  traceThreadLabel(cap, tso, label);
+}