From 8846139a7c82feabb39d9d68d194178f649699cd Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Thu, 25 May 2006 09:00:35 +0000 Subject: [PATCH] performGC_(): don't use the existing Task, always grab a new one --- rts/Schedule.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/rts/Schedule.c b/rts/Schedule.c index 52fd4d5..c652e18 100644 --- a/rts/Schedule.c +++ b/rts/Schedule.c @@ -3016,17 +3016,15 @@ static void (*extra_roots)(evac_fn); static void performGC_(rtsBool force_major, void (*get_roots)(evac_fn)) { - Task *task = myTask(); - - if (task == NULL) { - ACQUIRE_LOCK(&sched_mutex); - task = newBoundTask(); - RELEASE_LOCK(&sched_mutex); - scheduleDoGC(NULL,task,force_major, get_roots); - boundTaskExiting(task); - } else { - scheduleDoGC(NULL,task,force_major, get_roots); - } + Task *task; + // We must grab a new Task here, because the existing Task may be + // associated with a particular Capability, and chained onto the + // suspended_ccalling_tasks queue. + ACQUIRE_LOCK(&sched_mutex); + task = newBoundTask(); + RELEASE_LOCK(&sched_mutex); + scheduleDoGC(NULL,task,force_major, get_roots); + boundTaskExiting(task); } void -- 1.7.10.4