Index: lib/Support/Parallel.cpp =================================================================== --- lib/Support/Parallel.cpp +++ lib/Support/Parallel.cpp @@ -23,7 +23,7 @@ class Executor { public: virtual ~Executor() = default; - virtual void add(std::function func) = 0; + virtual void add(std::function F, parallel::detail::Latch *L) = 0; static Executor *getDefaultExecutor(); }; @@ -91,9 +91,9 @@ // Wait for ~Latch. } - void add(std::function F) override { + void add(std::function F, parallel::detail::Latch *L) override { std::unique_lock Lock(Mutex); - WorkStack.push(F); + WorkStack.push({std::move(F), L}); Lock.unlock(); Cond.notify_one(); } @@ -105,16 +105,18 @@ Cond.wait(Lock, [&] { return Stop || !WorkStack.empty(); }); if (Stop) break; - auto Task = WorkStack.top(); + auto Task = std::move(WorkStack.top()); WorkStack.pop(); Lock.unlock(); - Task(); + Task.first(); + Task.second->dec(); } Done.dec(); } std::atomic Stop{false}; - std::stack> WorkStack; + std::stack, parallel::detail::Latch *>> + WorkStack; std::mutex Mutex; std::condition_variable Cond; parallel::detail::Latch Done; @@ -130,9 +132,6 @@ #if LLVM_ENABLE_THREADS void parallel::detail::TaskGroup::spawn(std::function F) { L.inc(); - Executor::getDefaultExecutor()->add([&, F] { - F(); - L.dec(); - }); + Executor::getDefaultExecutor()->add(std::move(F), &L); } #endif