7#ifndef PXR_BASE_WORK_DISPATCHER_H
8#define PXR_BASE_WORK_DISPATCHER_H
13#include "pxr/base/work/api.h"
14#include "pxr/base/work/impl.h"
24PXR_NAMESPACE_OPEN_SCOPE
35 WORK_API Work_Dispatcher();
39 WORK_API ~Work_Dispatcher() noexcept;
41 Work_Dispatcher(Work_Dispatcher const &) = delete;
42 Work_Dispatcher &operator=(Work_Dispatcher const &) = delete;
56 template <
class Callable,
class A1,
class A2, ...
class AN>
57 void Run(Callable &&c, A1 &&a1, A2 &&a2, ... AN &&aN);
61 template <
class Callable>
62 inline void Run(Callable &&c) {
64 _InvokerTask<
typename std::remove_reference<Callable>::type>(
65 std::forward<Callable>(c), &_errors));
68 template <
class Callable,
class A0,
class ... Args>
69 inline void Run(Callable &&c, A0 &&a0, Args&&... args) {
70 Run(std::bind(std::forward<Callable>(c),
72 std::forward<Args>(args)...));
90 WORK_API
void Cancel();
94 WORK_API
bool IsCancelled()
const;
97 typedef tbb::concurrent_vector<TfErrorTransport> _ErrorTransports;
103 struct _InvokerTask {
104 explicit _InvokerTask(Fn &&fn, _ErrorTransports *err)
105 : _fn(
std::move(fn)), _errors(err) {}
107 explicit _InvokerTask(Fn
const &fn, _ErrorTransports *err)
108 : _fn(fn), _errors(err) {}
111 _InvokerTask(_InvokerTask &&other) =
default;
112 _InvokerTask(
const _InvokerTask &other) =
delete;
113 _InvokerTask &operator=(
const _InvokerTask &other) =
delete;
115 void operator()()
const {
119 Work_Dispatcher::_TransportErrors(m, _errors);
123 _ErrorTransports *_errors;
129 _TransportErrors(
const TfErrorMark &m, _ErrorTransports *errors);
133 std::atomic<bool> _isCancelled;
137 _ErrorTransports _errors;
140 std::atomic_flag _waitCleanupFlag;
175 :
public Work_Dispatcher<PXR_WORK_IMPL_NS::WorkImpl_Dispatcher>
180struct Work_DeprecatedMutableTask {
181 explicit Work_DeprecatedMutableTask(Fn &&fn)
182 : _fn(
std::move(fn)) {}
184 explicit Work_DeprecatedMutableTask(Fn
const &fn)
188 Work_DeprecatedMutableTask
189 (Work_DeprecatedMutableTask &&other) =
default;
190 Work_DeprecatedMutableTask
191 (
const Work_DeprecatedMutableTask &other) =
delete;
192 Work_DeprecatedMutableTask
193 &operator= (
const Work_DeprecatedMutableTask &other) =
delete;
195 void operator()()
const {
205template <
typename Fn>
206Work_DeprecatedMutableTask<typename std::remove_reference_t<Fn>>
207WorkMakeDeprecatedMutableTask(Fn &&fn) {
208 return Work_DeprecatedMutableTask<typename std::remove_reference_t<Fn>>
209 (std::forward<Fn>(fn));
214PXR_NAMESPACE_CLOSE_SCOPE
Class used to record the end of the error-list.
bool IsClean() const
Return true if no new errors were posted in this thread since the last call to SetMark(),...
A work dispatcher runs concurrent tasks.