fix #3910
[ghc-hetmet.git] / rts / Task.c
index 8a289be..a15758c 100644 (file)
@@ -63,8 +63,10 @@ initTaskManager (void)
     if (!tasksInitialized) {
        taskCount = 0;
        tasksInitialized = 1;
-#if defined(THREADED_RTS) && !defined(MYTASK_USE_TLV)
+#if defined(THREADED_RTS)
+#if !defined(MYTASK_USE_TLV)
        newThreadLocalKey(&currentTaskKey);
+#endif
         initMutex(&all_tasks_mutex);
 #endif
     }
@@ -346,6 +348,19 @@ workerTaskStop (Task *task)
 
 #endif
 
+#ifdef DEBUG
+
+static void *taskId(Task *task)
+{
+#ifdef THREADED_RTS
+    return (void *)task->id;
+#else
+    return (void *)task;
+#endif
+}
+
+#endif
+
 #if defined(THREADED_RTS)
 
 static void OSThreadProcAttr
@@ -407,19 +422,19 @@ startWorkerTask (Capability *cap)
   RELEASE_LOCK(&task->lock);
 }
 
+void
+interruptWorkerTask (Task *task)
+{
+  ASSERT(osThreadId() != task->id);    // seppuku not allowed
+  ASSERT(task->incall->suspended_tso); // use this only for FFI calls
+  interruptOSThread(task->id);
+  debugTrace(DEBUG_sched, "interrupted worker task %p", taskId(task));
+}
+
 #endif /* THREADED_RTS */
 
 #ifdef DEBUG
 
-static void *taskId(Task *task)
-{
-#ifdef THREADED_RTS
-    return (void *)task->id;
-#else
-    return (void *)task;
-#endif
-}
-
 void printAllTasks(void);
 
 void