18enum class ParentCascadeCancel { kOff, kOn };
21#include <dispenso/detail/task_set_impl.h>
25constexpr ssize_t kDefaultStealingMultiplier = 4;
50 ParentCascadeCancel registerForParentCancel,
51 ssize_t stealingLoadMultiplier = kDefaultStealingMultiplier)
52 : TaskSetBase(p, registerForParentCancel, stealingLoadMultiplier),
53 token_(makeToken(p.work_)) {}
60 :
TaskSet(p, ParentCascadeCancel::kOff, stealingLoadMultiplier) {}
79 DISPENSO_REQUIRES(OnceCallableFunc<F>)
81 if (DISPENSO_EXPECT(
canceled(),
false)) {
84 if (outstandingTaskCount_.load(std::memory_order_relaxed) > taskSetLoadFactor_) {
87 pool_.schedule(token_, packageTask(std::forward<F>(f)));
103 template <
typename F>
104 DISPENSO_REQUIRES(OnceCallableFunc<F>)
106 pool_.schedule(token_, packageTask(std::forward<F>(f)), fq);
115 DISPENSO_DLL_ACCESS
bool wait();
131 DISPENSO_DLL_ACCESS
bool tryWait(
size_t maxToExecute);
139 TaskSetBase::cancel();
148 return TaskSetBase::canceled();
160 DISPENSO_DLL_ACCESS moodycamel::ProducerToken makeToken(
161 moodycamel::ConcurrentQueue<OnceFunction>& pool);
163 moodycamel::ProducerToken token_;
165 template <
typename Result>
166 friend class detail::FutureBase;
193 ParentCascadeCancel registerForParentCancel,
194 ssize_t stealingLoadMultiplier = kDefaultStealingMultiplier)
195 : TaskSetBase(pool, registerForParentCancel, stealingLoadMultiplier) {}
224 template <
typename F>
225 DISPENSO_REQUIRES(OnceCallableFunc<F>)
227 if (outstandingTaskCount_.load(std::memory_order_relaxed) > taskSetLoadFactor_ &&
228 DISPENSO_EXPECT(!
canceled(),
true)) {
230 }
else if (skipRecheck) {
231 pool_.schedule(packageTask(std::forward<F>(f)), ForceQueuingTag());
233 pool_.schedule(packageTask(std::forward<F>(f)));
249 template <
typename F>
250 DISPENSO_REQUIRES(OnceCallableFunc<F>)
252 pool_.schedule(packageTask(std::forward<F>(f)), fq);
259 DISPENSO_DLL_ACCESS
bool wait();
274 DISPENSO_DLL_ACCESS
bool tryWait(
size_t maxToExecute);
283 TaskSetBase::cancel();
292 return TaskSetBase::canceled();
304 bool tryExecuteNext() {
305 return pool_.tryExecuteNext();
308 template <
typename Result>
309 friend class detail::FutureBase;
311 friend class detail::LimitGatedScheduler;
void schedule(F &&f, bool skipRecheck=false)
DISPENSO_DLL_ACCESS bool wait()
ConcurrentTaskSet(ThreadPool &p, ssize_t stealingLoadMultiplier)
ConcurrentTaskSet(ThreadPool &pool, ParentCascadeCancel registerForParentCancel, ssize_t stealingLoadMultiplier=kDefaultStealingMultiplier)
ConcurrentTaskSet(ThreadPool &p)
DISPENSO_DLL_ACCESS bool tryWait(size_t maxToExecute)
TaskSet(ThreadPool &p, ssize_t stealingLoadMultiplier)
DISPENSO_DLL_ACCESS bool tryWait(size_t maxToExecute)
TaskSet(ThreadPool &p, ParentCascadeCancel registerForParentCancel, ssize_t stealingLoadMultiplier=kDefaultStealingMultiplier)
DISPENSO_DLL_ACCESS bool wait()
DISPENSO_DLL_ACCESS TaskSetBase * parentTaskSet()