7#ifndef PXR_BASE_WORK_SINGULAR_TASK_H
8#define PXR_BASE_WORK_SINGULAR_TASK_H
18PXR_NAMESPACE_OPEN_SCOPE
56 template <
class Callable,
class A1,
class A2, ...
class AN>
58 Callable &&c, A1 &&a1, A2 &&a2, ... AN &&aN);
62 template <
class Callable,
class... Args>
64 : _waker(_MakeWaker(d,
std::bind(
std::forward<Callable>(c),
65 std::forward<Args>(args)...)))
79 template <
class Dispatcher,
class Fn>
81 explicit _Waker(Dispatcher &d, Fn &&fn)
82 : _dispatcher(d), _fn(
std::move(fn)) {}
84 void operator()(std::atomic_size_t &count)
const {
94 std::size_t old = count;
96 !count.compare_exchange_strong(old, 0));
99 Dispatcher &_dispatcher;
103 template <
class Dispatcher,
class Fn>
104 static std::function<void (std::atomic_size_t &)>
105 _MakeWaker(Dispatcher &d, Fn &&fn) {
106 return std::function<void (std::atomic_size_t &)>(
107 _Waker<Dispatcher,
typename std::decay<Fn>::type>(
108 d, std::forward<Fn>(fn)));
111 std::function<void (std::atomic_size_t &)> _waker;
112 std::atomic_size_t _count;
115PXR_NAMESPACE_CLOSE_SCOPE
A work dispatcher runs concurrent tasks.
A WorkSingularTask runs a task in a WorkDispatcher, but never concurrently with itself.
void Wake()
Ensure that this task runs at least once after this call.
WorkSingularTask(WorkDispatcher &dispatcher, Callable &&c, A1 &&a1, A2 &&a2,... AN &&aN)
Create a singular task to be run in dispatcher.