X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FTask.c;h=ad05208d5e986a516579acbbe5195cf066fa2345;hb=73ef81cb72ebde9c2614000c0a306ba6405689ae;hp=bc701b0108790f727f31627ea1e3486fbadd3286;hpb=0cf466769fffa7d8cc5feeb908a641c40728796b;p=ghc-hetmet.git diff --git a/ghc/rts/Task.c b/ghc/rts/Task.c index bc701b0..ad05208 100644 --- a/ghc/rts/Task.c +++ b/ghc/rts/Task.c @@ -91,7 +91,7 @@ startTask ( void (*taskStart)(void) ) taskTable[taskCount].gc_etime = 0.0; taskTable[taskCount].elapsedtimestart = stat_getElapsedTime(); - IF_DEBUG(scheduler,fprintf(stderr,"scheduler: Started task: %ld\n",tid);); + IF_DEBUG(scheduler,debugBelch("scheduler: Started task: %ld\n",tid);); return; } @@ -113,7 +113,7 @@ stopTaskManager () /* Wait for all the tasks to terminate */ for (i = 0; i < maxCount; i++) { - IF_DEBUG(scheduler,fprintf(stderr,"scheduler: waiting for task %ld\n", + IF_DEBUG(scheduler,debugBelch("scheduler: waiting for task %ld\n", taskTable[i].id)); pthread_join(taskTable[i].id, NULL); } @@ -134,6 +134,12 @@ stopTaskManager () return; } +void +resetTaskManagerAfterFork () +{ + barf("resetTaskManagerAfterFork not implemented for SMP"); +} + #else /************ THREADS version *****************/ @@ -150,29 +156,28 @@ startTaskManager( nat maxCount, taskCount = 0; } -void +rtsBool startTask ( void (*taskStart)(void) ) { int r; OSThreadId tid; /* If more than one worker thread is known to be blocked waiting - on thread_ready_cond, signal it rather than creating a new one. + on thread_ready_cond, don't create a new one. */ if ( rts_n_waiting_tasks > 0) { - IF_DEBUG(scheduler,fprintf(stderr, + IF_DEBUG(scheduler,debugBelch( "scheduler: startTask: %d tasks waiting, not creating new one.\n", rts_n_waiting_tasks);); - signalCondition(&thread_ready_cond); - /* Not needed, but gives more 'interesting' thread schedules when testing */ - yieldThread(); - return; + // the task will run as soon as a capability is available, + // so there's no need to wake it. + return rtsFalse; } /* If the task limit has been reached, just return. */ if (maxTasks > 0 && taskCount == maxTasks) { - IF_DEBUG(scheduler,fprintf(stderr,"scheduler: startTask: task limit (%d) reached, not creating new one.\n",maxTasks)); - return; + IF_DEBUG(scheduler,debugBelch("scheduler: startTask: task limit (%d) reached, not creating new one.\n",maxTasks)); + return rtsFalse; } @@ -182,8 +187,8 @@ startTask ( void (*taskStart)(void) ) } taskCount++; - IF_DEBUG(scheduler,fprintf(stderr,"scheduler: startTask: new task %ld (total_count: %d; waiting: %d)\n", tid, taskCount, rts_n_waiting_tasks);); - return; + IF_DEBUG(scheduler,debugBelch("scheduler: startTask: new task %ld (total_count: %d; waiting: %d)\n", tid, taskCount, rts_n_waiting_tasks);); + return rtsTrue; } @@ -193,6 +198,13 @@ stopTaskManager () { } + +void +resetTaskManagerAfterFork ( void ) +{ + rts_n_waiting_tasks = 0; + taskCount = 0; +} #endif