X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FTask.c;h=7366480094da1554c1f34b0c85700a56f542cb60;hb=3eacdc7faf0d0e87a7201253f9f12c1fb4db7249;hp=683c665d1a6fb05bd5d4f7fd7987c93457417c00;hpb=03a9ff01812afc81eb5236fd3063cbec44cf469e;p=ghc-hetmet.git diff --git a/ghc/rts/Task.c b/ghc/rts/Task.c index 683c665..7366480 100644 --- a/ghc/rts/Task.c +++ b/ghc/rts/Task.c @@ -77,7 +77,7 @@ static Task* newTask (void) { #if defined(THREADED_RTS) - long currentElapsedTime, currentUserTime, elapsedGCTime; + Ticks currentElapsedTime, currentUserTime; #endif Task *task; @@ -97,7 +97,8 @@ newTask (void) #endif #if defined(THREADED_RTS) - stat_getTimes(¤tElapsedTime, ¤tUserTime, &elapsedGCTime); + currentUserTime = getThreadCPUTime(); + currentElapsedTime = getProcessElapsedTime(); task->mut_time = 0.0; task->mut_etime = 0.0; task->gc_time = 0.0; @@ -170,17 +171,25 @@ boundTaskExiting (Task *task) IF_DEBUG(scheduler,sched_belch("task exiting")); } +#ifdef THREADED_RTS +#define TASK_ID(t) (t)->id +#else +#define TASK_ID(t) (t) +#endif + void discardTask (Task *task) { ASSERT_LOCK_HELD(&sched_mutex); -#if defined(THREADED_RTS) - closeCondition(&task->cond); -#endif - task->stopped = rtsTrue; - task->cap = NULL; - task->next = task_free_list; - task_free_list = task; + if (!task->stopped) { + IF_DEBUG(scheduler,sched_belch("discarding task %p", TASK_ID(task))); + task->cap = NULL; + task->tso = NULL; + task->stopped = rtsTrue; + tasksRunning--; + task->next = task_free_list; + task_free_list = task; + } } void @@ -188,13 +197,18 @@ taskStop (Task *task) { #if defined(THREADED_RTS) OSThreadId id; - long currentElapsedTime, currentUserTime, elapsedGCTime; + Ticks currentElapsedTime, currentUserTime, elapsedGCTime; id = osThreadId(); ASSERT(task->id == id); ASSERT(myTask() == task); - stat_getTimes(¤tElapsedTime, ¤tUserTime, &elapsedGCTime); + currentUserTime = getThreadCPUTime(); + currentElapsedTime = getProcessElapsedTime(); + + // XXX this is wrong; we want elapsed GC time since the + // Task started. + elapsedGCTime = stat_getElapsedGCTime(); task->mut_time = currentUserTime - task->muttimestart - task->gc_time;