24 #ifndef PXR_BASE_WORK_SINGULAR_TASK_H
25 #define PXR_BASE_WORK_SINGULAR_TASK_H
33 #include <type_traits>
35 PXR_NAMESPACE_OPEN_SCOPE
73 template <
class Callable,
class A1,
class A2, ...
class AN>
75 Callable &&c, A1 &&a1, A2 &&a2, ... AN &&aN);
79 template <
class Callable,
class... Args>
81 : _waker(_MakeWaker(d, std::bind(std::forward<Callable>(c),
82 std::forward<Args>(args)...)))
96 template <
class Dispatcher,
class Fn>
98 explicit _Waker(Dispatcher &d, Fn &&fn)
99 : _dispatcher(d), _fn(std::move(fn)) {}
101 void operator()(std::atomic_size_t &count)
const {
112 do { _fn(); }
while (
113 !count.compare_exchange_strong(old, 0));
116 Dispatcher &_dispatcher;
120 template <
class Dispatcher,
class Fn>
121 static std::function<void (std::atomic_size_t &)>
122 _MakeWaker(Dispatcher &d, Fn &&fn) {
123 return std::function<void (std::atomic_size_t &)>(
124 _Waker<Dispatcher, typename std::decay<Fn>::type>(
125 d, std::forward<Fn>(fn)));
128 std::function<void (std::atomic_size_t &)> _waker;
129 std::atomic_size_t _count;
132 PXR_NAMESPACE_CLOSE_SCOPE
134 #endif // PXR_BASE_WORK_SINGULAR_TASK_H
void Wake()
Ensure that this task runs at least once after this call.
A work dispatcher runs concurrent tasks.
A WorkSingularTask runs a task in a WorkDispatcher, but never concurrently with itself.