summaryrefslogtreecommitdiff
path: root/rts/Task.c
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2009-05-18 10:41:08 +0000
committerSimon Marlow <marlowsd@gmail.com>2009-05-18 10:41:08 +0000
commit8de62de730e07c23468ec8facd25aca557ad7c11 (patch)
treeea9a0ea1b0fea0835ccad917caf1cfd2c044287a /rts/Task.c
parent8a3ed3364fbc74b1f1b87b049737da2b251f92df (diff)
downloadhaskell-8de62de730e07c23468ec8facd25aca557ad7c11.tar.gz
Fix #3236: emit a helpful error message when the RTS has not been initialised
Diffstat (limited to 'rts/Task.c')
-rw-r--r--rts/Task.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/rts/Task.c b/rts/Task.c
index 9397789105..af94a8aabe 100644
--- a/rts/Task.c
+++ b/rts/Task.c
@@ -31,6 +31,7 @@ static Task *task_free_list = NULL; // singly-linked
static nat taskCount;
static nat tasksRunning;
static nat workerCount;
+static int tasksInitialized = 0;
/* -----------------------------------------------------------------------------
* Remembering the current thread's Task
@@ -51,13 +52,11 @@ Task *my_task;
void
initTaskManager (void)
{
- static int initialized = 0;
-
- if (!initialized) {
+ if (!tasksInitialized) {
taskCount = 0;
workerCount = 0;
tasksRunning = 0;
- initialized = 1;
+ tasksInitialized = 1;
#if defined(THREADED_RTS)
newThreadLocalKey(&currentTaskKey);
#endif
@@ -94,6 +93,8 @@ freeTaskManager (void)
freeThreadLocalKey(&currentTaskKey);
#endif
+ tasksInitialized = 0;
+
return tasksRunning;
}
@@ -150,7 +151,17 @@ newBoundTask (void)
{
Task *task;
- ASSERT_LOCK_HELD(&sched_mutex);
+ if (!tasksInitialized) {
+ errorBelch("newBoundTask: RTS is not initialised; call hs_init() first");
+ stg_exit(EXIT_FAILURE);
+ }
+
+ // ToDo: get rid of this lock in the common case. We could store
+ // a free Task in thread-local storage, for example. That would
+ // leave just one lock on the path into the RTS: cap->lock when
+ // acquiring the Capability.
+ ACQUIRE_LOCK(&sched_mutex);
+
if (task_free_list == NULL) {
task = newTask();
} else {
@@ -169,6 +180,8 @@ newBoundTask (void)
taskEnter(task);
+ RELEASE_LOCK(&sched_mutex);
+
debugTrace(DEBUG_sched, "new task (taskCount: %d)", taskCount);
return task;
}