78 DISPENSO_REQUIRES(OnceCallableFunc<F>)
80 schedule(std::forward<F>(f), ForceQueuingTag());
90 DISPENSO_REQUIRES(OnceCallableFunc<F>)
92 auto* waiter = getWaiter();
94 std::thread thread([f = std::move(f), waiter]() {
99 RemoveGuard guard{waiter};
134 struct ThreadWaiter {
137 std::condition_variable cond_;
139 void add() DISPENSO_NO_THREAD_SAFETY_ANALYSIS {
140 std::lock_guard<std::mutex> lk(mtx_);
144 void remove() DISPENSO_NO_THREAD_SAFETY_ANALYSIS {
145 std::lock_guard<std::mutex> lk(mtx_);
146 assert(count_ > 0 &&
"remove() called without matching add()");
153 std::unique_lock<std::mutex> lk(mtx_);
157 cond_.wait_for(lk, std::chrono::seconds(2), [
this]() {
return count_ == 0; });
168 DISPENSO_DLL_ACCESS
static ThreadWaiter* getWaiter();