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);
121 template <
typename Generator>
123 scheduleBulkImpl(count, std::forward<Generator>(gen), &token_);
132 DISPENSO_DLL_ACCESS
bool wait();
148 DISPENSO_DLL_ACCESS
bool tryWait(
size_t maxToExecute);
156 TaskSetBase::cancel();
165 return TaskSetBase::canceled();
177 DISPENSO_DLL_ACCESS moodycamel::ProducerToken makeToken(
178 moodycamel::ConcurrentQueue<OnceFunction>& pool);
180 moodycamel::ProducerToken token_;
182 template <
typename Result>
183 friend class detail::FutureBase;
210 ParentCascadeCancel registerForParentCancel,
211 ssize_t stealingLoadMultiplier = kDefaultStealingMultiplier)
212 : TaskSetBase(pool, registerForParentCancel, stealingLoadMultiplier) {}
241 template <
typename F>
242 DISPENSO_REQUIRES(OnceCallableFunc<F>)
244 if (outstandingTaskCount_.load(std::memory_order_relaxed) > taskSetLoadFactor_ &&
245 DISPENSO_EXPECT(!
canceled(),
true)) {
247 }
else if (skipRecheck) {
248 pool_.schedule(packageTask(std::forward<F>(f)), ForceQueuingTag());
250 pool_.schedule(packageTask(std::forward<F>(f)));
266 template <
typename F>
267 DISPENSO_REQUIRES(OnceCallableFunc<F>)
269 pool_.schedule(packageTask(std::forward<F>(f)), fq);
284 template <
typename Generator>
286 scheduleBulkImpl(count, std::forward<Generator>(gen),
nullptr);
293 DISPENSO_DLL_ACCESS
bool wait();
308 DISPENSO_DLL_ACCESS
bool tryWait(
size_t maxToExecute);
317 TaskSetBase::cancel();
326 return TaskSetBase::canceled();
338 bool tryExecuteNext() {
339 return pool_.tryExecuteNext();
342 template <
typename Result>
343 friend class detail::FutureBase;
345 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)
void scheduleBulk(size_t count, Generator &&gen)
ConcurrentTaskSet(ThreadPool &p)
DISPENSO_DLL_ACCESS bool tryWait(size_t maxToExecute)
TaskSet(ThreadPool &p, ssize_t stealingLoadMultiplier)
void scheduleBulk(size_t count, Generator &&gen)
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()