23 llvm::Optional<Task>
Task;
25 std::unique_lock<std::mutex> Lock(Mu);
26 CV.wait(Lock, [&] {
return ShouldStop || !Queue.empty(); });
33 std::pop_heap(Queue.begin(), Queue.end());
34 Task = std::move(Queue.back());
44 llvm::set_thread_priority(llvm::ThreadPriority::Default);
47 std::unique_lock<std::mutex> Lock(Mu);
49 if (Stat.
Active == 1 && Queue.empty()) {
59 assert(Stat.
Active > 0 &&
"before decrementing");
69 std::lock_guard<std::mutex> QueueLock(Mu);
77 std::lock_guard<std::mutex> Lock(Mu);
79 Queue.push_back(std::move(T));
80 std::push_heap(Queue.begin(), Queue.end());
89 std::lock_guard<std::mutex> Lock(Mu);
91 T.QueuePri = std::max(T.QueuePri, Boosts.lookup(T.Tag));
92 std::move(Tasks.begin(), Tasks.end(), std::back_inserter(Queue));
93 std::make_heap(Queue.begin(), Queue.end());
101 std::lock_guard<std::mutex> Lock(Mu);
102 unsigned &Boost = Boosts[
Tag];
103 bool Increase = NewPriority > Boost;
109 for (
Task &T : Queue)
110 if (
Tag == T.Tag && NewPriority > T.QueuePri) {
111 T.QueuePri = NewPriority;
115 std::make_heap(Queue.begin(), Queue.end());
120 llvm::Optional<double> TimeoutSeconds) {
121 std::unique_lock<std::mutex> Lock(Mu);
123 [&] {
return Queue.empty() && Stat.
Active == 0; });
126 void BackgroundQueue::notifyProgress()
const {
127 dlog(
"Queue: {0}/{1} ({2} active). Last idle at {3}", Stat.
Completed,