summaryrefslogtreecommitdiff
path: root/rts/ThreadLabels.c
diff options
context:
space:
mode:
Diffstat (limited to 'rts/ThreadLabels.c')
-rw-r--r--rts/ThreadLabels.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/rts/ThreadLabels.c b/rts/ThreadLabels.c
index 981a5d9771..7a06580efc 100644
--- a/rts/ThreadLabels.c
+++ b/rts/ThreadLabels.c
@@ -20,11 +20,19 @@
#if defined(DEBUG)
+#if defined(THREADED_RTS)
+static Mutex threadLabels_mutex;
+#endif /* THREADED_RTS */
+
static HashTable * threadLabels = NULL;
void
initThreadLabelTable(void)
{
+#if defined(THREADED_RTS)
+ initMutex(&threadLabels_mutex);
+#endif /* THREADED_RTS */
+
if (threadLabels == NULL) {
threadLabels = allocHashTable();
}
@@ -33,33 +41,53 @@ initThreadLabelTable(void)
void
freeThreadLabelTable(void)
{
+ ACQUIRE_LOCK(&threadLabels_mutex);
+
if (threadLabels != NULL) {
freeHashTable(threadLabels, stgFree);
threadLabels = NULL;
}
+
+ RELEASE_LOCK(&threadLabels_mutex);
}
static void
updateThreadLabel(StgWord key, void *data)
{
removeThreadLabel(key);
+
+ ACQUIRE_LOCK(&threadLabels_mutex);
+
insertHashTable(threadLabels,key,data);
+
+ RELEASE_LOCK(&threadLabels_mutex);
}
void *
lookupThreadLabel(StgWord key)
{
- return lookupHashTable(threadLabels,key);
+ void * result;
+ ACQUIRE_LOCK(&threadLabels_mutex);
+
+ result = lookupHashTable(threadLabels,key);
+
+ RELEASE_LOCK(&threadLabels_mutex);
+
+ return result;
}
void
removeThreadLabel(StgWord key)
{
+ ACQUIRE_LOCK(&threadLabels_mutex);
+
void * old = NULL;
if ((old = lookupHashTable(threadLabels,key))) {
removeHashTable(threadLabels,key,old);
stgFree(old);
}
+
+ RELEASE_LOCK(&threadLabels_mutex);
}
#endif /* DEBUG */