3 #include "llvm/ADT/ScopeExit.h" 4 #include "llvm/Support/FormatVariadic.h" 5 #include "llvm/Support/Threading.h" 17 std::lock_guard<std::mutex> Lock(Mu);
24 std::unique_lock<std::mutex> Lock(Mu);
25 CV.wait(Lock, [
this] {
return Notified; });
31 std::unique_lock<std::mutex> Lock(Mutex);
44 std::unique_lock<std::mutex> Lock(Mutex);
45 SlotsChanged.wait(Lock, [&]() {
return FreeSlots > 0; });
51 std::unique_lock<std::mutex> Lock(Mutex);
55 SlotsChanged.notify_one();
61 std::unique_lock<std::mutex> Lock(Mutex);
63 [&] {
return InFlightTasks == 0; });
67 llvm::unique_function<
void()>
Action) {
69 std::lock_guard<std::mutex> Lock(Mutex);
73 auto CleanupTask = llvm::make_scope_exit([
this]() {
74 std::lock_guard<std::mutex> Lock(Mutex);
75 int NewTasksCnt = --InFlightTasks;
76 if (NewTasksCnt == 0) {
79 TasksReachedZero.notify_one();
84 [](std::string Name, decltype(
Action)
Action, decltype(CleanupTask)) {
85 llvm::set_thread_name(Name);
91 Name.str(), std::move(Action), std::move(CleanupTask))
96 using namespace std::chrono;
99 return steady_clock::now() +
100 duration_cast<steady_clock::duration>(duration<double>(*Seconds));
103 void wait(std::unique_lock<std::mutex> &Lock, std::condition_variable &CV,
108 return CV.wait(Lock);
109 CV.wait_until(Lock, D.
time());
116 #if defined(__linux__) && defined(SCHED_IDLE) 117 sched_param priority;
118 priority.sched_priority = 0;
119 pthread_setschedparam(
~AsyncTaskRunner()
Destructor waits for all pending tasks to finish.
void preventThreadStarvationInTests()
static std::atomic< bool > AvoidThreadStarvation
Semaphore(std::size_t MaxLocks)
void runAsync(const llvm::Twine &Name, llvm::unique_function< void()> Action)
static Deadline infinity()
llvm::unique_function< void()> Action
static constexpr llvm::StringLiteral Name
void wait(std::unique_lock< std::mutex > &Lock, std::condition_variable &CV, Deadline D)
Wait once on CV for the specified duration.
void setCurrentThreadPriority(ThreadPriority Priority)
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
Deadline timeoutSeconds(llvm::Optional< double > Seconds)
Makes a deadline from a timeout in seconds. None means wait forever.
A point in time we can wait for.
Records an event whose duration is the lifetime of the Span object.
std::chrono::steady_clock::time_point time() const