3 #include "llvm/ADT/ScopeExit.h" 4 #include "llvm/Support/FormatVariadic.h" 5 #include "llvm/Support/Threading.h" 13 std::lock_guard<std::mutex> Lock(Mu);
20 std::unique_lock<std::mutex> Lock(Mu);
21 CV.wait(Lock, [
this] {
return Notified; });
31 std::unique_lock<std::mutex> Lock(Mutex);
32 SlotsChanged.wait(Lock, [&]() {
return FreeSlots > 0; });
38 std::unique_lock<std::mutex> Lock(Mutex);
42 SlotsChanged.notify_one();
48 std::unique_lock<std::mutex> Lock(Mutex);
50 [&] {
return InFlightTasks == 0; });
54 llvm::unique_function<
void()>
Action) {
56 std::lock_guard<std::mutex> Lock(Mutex);
60 auto CleanupTask = llvm::make_scope_exit([
this]() {
61 std::lock_guard<std::mutex> Lock(Mutex);
62 int NewTasksCnt = --InFlightTasks;
63 if (NewTasksCnt == 0) {
66 TasksReachedZero.notify_one();
71 [](std::string Name, decltype(
Action)
Action, decltype(CleanupTask)) {
72 llvm::set_thread_name(Name);
78 Name.str(), std::move(Action), std::move(CleanupTask))
83 using namespace std::chrono;
86 return steady_clock::now() +
87 duration_cast<steady_clock::duration>(duration<double>(*Seconds));
90 void wait(std::unique_lock<std::mutex> &Lock, std::condition_variable &CV,
96 CV.wait_until(Lock, D.
time());
~AsyncTaskRunner()
Destructor waits for all pending tasks to finish.
Semaphore(std::size_t MaxLocks)
void runAsync(const llvm::Twine &Name, llvm::unique_function< void()> Action)
static Deadline infinity()
llvm::unique_function< void()> Action
void wait(std::unique_lock< std::mutex > &Lock, std::condition_variable &CV, Deadline D)
Wait once on CV for the specified duration.
===– 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