[Support] Attempt to fix deadlock in ThreadGroup

This is an attempt to fix the situation described by https://reviews.llvm.org/D104207#2826290 and PR41508.
See sequence of operations leading to the bug in https://reviews.llvm.org/D104207#3004689

We ensure that the Latch is completely "free" before decrementing the number of TaskGroupInstances.

Differential revision: https://reviews.llvm.org/D109914

(cherry picked from commit 7b25fa8c7a)
This commit is contained in:
Alexandre Ganea 2021-09-18 12:00:17 -04:00 committed by Tom Stellard
parent d904698b53
commit 87ca22cba2
2 changed files with 10 additions and 2 deletions

View File

@ -40,7 +40,10 @@ class Latch {
public:
explicit Latch(uint32_t Count = 0) : Count(Count) {}
~Latch() { sync(); }
~Latch() {
// Ensure at least that sync() was called.
assert(Count == 0);
}
void inc() {
std::lock_guard<std::mutex> lock(Mutex);

View File

@ -151,7 +151,12 @@ static std::atomic<int> TaskGroupInstances;
// lock, only allow the first TaskGroup to run tasks parallelly. In the scenario
// of nested parallel_for_each(), only the outermost one runs parallelly.
TaskGroup::TaskGroup() : Parallel(TaskGroupInstances++ == 0) {}
TaskGroup::~TaskGroup() { --TaskGroupInstances; }
TaskGroup::~TaskGroup() {
// We must ensure that all the workloads have finished before decrementing the
// instances count.
L.sync();
--TaskGroupInstances;
}
void TaskGroup::spawn(std::function<void()> F) {
if (Parallel) {