17 PreventStarvation.store(
true);
22 llvm::Optional<Task>
Task;
24 std::unique_lock<std::mutex> Lock(Mu);
25 CV.wait(Lock, [&] {
return ShouldStop || !Queue.empty(); });
32 std::pop_heap(Queue.begin(), Queue.end());
33 Task = std::move(Queue.back());
37 if (Task->ThreadPri != llvm::ThreadPriority::Default &&
38 !PreventStarvation.load())
39 llvm::set_thread_priority(Task->ThreadPri);
41 if (Task->ThreadPri != llvm::ThreadPriority::Default)
42 llvm::set_thread_priority(llvm::ThreadPriority::Default);
45 std::unique_lock<std::mutex> Lock(Mu);
46 if (NumActiveTasks == 1 && Queue.empty() && OnIdle) {
52 assert(NumActiveTasks > 0 &&
"before decrementing");
61 std::lock_guard<std::mutex> QueueLock(Mu);
69 std::lock_guard<std::mutex> Lock(Mu);
71 Queue.push_back(std::move(T));
72 std::push_heap(Queue.begin(), Queue.end());
79 std::lock_guard<std::mutex> Lock(Mu);
81 T.QueuePri = std::max(T.QueuePri, Boosts.lookup(T.Tag));
82 std::move(Tasks.begin(), Tasks.end(), std::back_inserter(Queue));
83 std::make_heap(Queue.begin(), Queue.end());
89 std::lock_guard<std::mutex> Lock(Mu);
90 unsigned &Boost = Boosts[
Tag];
91 bool Increase = NewPriority > Boost;
98 if (Tag == T.Tag && NewPriority > T.QueuePri) {
99 T.QueuePri = NewPriority;
103 std::make_heap(Queue.begin(), Queue.end());
108 llvm::Optional<double> TimeoutSeconds) {
109 std::unique_lock<std::mutex> Lock(Mu);
111 [&] {
return Queue.empty() && NumActiveTasks == 0; });
static std::atomic< bool > PreventStarvation
void boost(llvm::StringRef Tag, unsigned NewPriority)
static void preventThreadStarvationInTests()
void wait(std::unique_lock< std::mutex > &Lock, std::condition_variable &CV, Deadline D)
Wait once on CV for the specified duration.
LLVM_NODISCARD bool blockUntilIdleForTest(llvm::Optional< double > TimeoutSeconds)
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
Deadline timeoutSeconds(llvm::Optional< double > Seconds)
Makes a deadline from a timeout in seconds. None means wait forever.
void append(std::vector< Task >)
A work item on the thread pool's queue.
void work(std::function< void()> OnIdle=nullptr)