3 #include "llvm/ADT/ScopeExit.h"
4 #include "llvm/Support/FormatVariadic.h"
5 #include "llvm/Support/Threading.h"
10 #elif defined(__APPLE__)
11 #include <sys/resource.h>
21 std::lock_guard<std::mutex> Lock(Mu);
30 std::unique_lock<std::mutex> Lock(Mu);
31 CV.wait(Lock, [
this] {
return Notified; });
37 std::unique_lock<std::mutex> Lock(Mutex);
50 std::unique_lock<std::mutex> Lock(Mutex);
51 SlotsChanged.wait(Lock, [&]() {
return FreeSlots > 0; });
57 std::unique_lock<std::mutex> Lock(Mutex);
61 SlotsChanged.notify_one();
67 std::unique_lock<std::mutex> Lock(Mutex);
69 [&] {
return InFlightTasks == 0; });
73 llvm::unique_function<
void()>
Action) {
75 std::lock_guard<std::mutex> Lock(Mutex);
79 auto CleanupTask = llvm::make_scope_exit([
this]() {
80 std::lock_guard<std::mutex> Lock(Mutex);
81 int NewTasksCnt = --InFlightTasks;
82 if (NewTasksCnt == 0) {
85 TasksReachedZero.notify_one();
90 Cleanup = std::move(CleanupTask)]()
mutable {
91 llvm::set_thread_name(
Name);
98 llvm::llvm_execute_on_thread_async(std::move(Task),
103 using namespace std::chrono;
106 return steady_clock::now() +
107 duration_cast<steady_clock::duration>(duration<double>(*Seconds));
110 void wait(std::unique_lock<std::mutex> &Lock, std::condition_variable &CV,
115 return CV.wait(Lock);
116 CV.wait_until(Lock, D.
time());