summaryrefslogtreecommitdiff
path: root/rts/Capability.c
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2020-10-22 12:02:58 -0400
committerBen Gamari <ben@smart-cactus.org>2020-10-24 21:00:40 -0400
commit3416244b736b386f0bbf8369083f90110cd524a2 (patch)
tree2fba1c6e5ee086350dab52efd083c11e9ae3c96e /rts/Capability.c
parentdd175a926c0e9654cd6ac8d9d26b183540c87331 (diff)
downloadhaskell-3416244b736b386f0bbf8369083f90110cd524a2.tar.gz
Capabiliity: Properly fix data race on n_returning_tasks
There is a real data race but can be made safe by using proper atomic (but relaxed) accesses.
Diffstat (limited to 'rts/Capability.c')
-rw-r--r--rts/Capability.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/rts/Capability.c b/rts/Capability.c
index eb52505656..c0a06f21c9 100644
--- a/rts/Capability.c
+++ b/rts/Capability.c
@@ -211,7 +211,10 @@ newReturningTask (Capability *cap, Task *task)
cap->returning_tasks_hd = task;
}
cap->returning_tasks_tl = task;
- cap->n_returning_tasks++;
+
+ // See Note [Data race in shouldYieldCapability] in Schedule.c.
+ RELAXED_ADD(&cap->n_returning_tasks, 1);
+
ASSERT_RETURNING_TASKS(cap,task);
}
@@ -227,7 +230,10 @@ popReturningTask (Capability *cap)
cap->returning_tasks_tl = NULL;
}
task->next = NULL;
- cap->n_returning_tasks--;
+
+ // See Note [Data race in shouldYieldCapability] in Schedule.c.
+ RELAXED_ADD(&cap->n_returning_tasks, -1);
+
ASSERT_RETURNING_TASKS(cap,task);
return task;
}