7#ifndef PXR_BASE_WORK_TBB_DISPATCHER_IMPL_H
8#define PXR_BASE_WORK_TBB_DISPATCHER_IMPL_H
11#include "pxr/base/work/api.h"
15#include <tbb/blocked_range.h>
16#include <tbb/concurrent_vector.h>
17#if TBB_INTERFACE_VERSION_MAJOR >= 12
18#include <tbb/task_group.h>
27PXR_NAMESPACE_OPEN_SCOPE
29class WorkImpl_Dispatcher
33 WORK_API WorkImpl_Dispatcher();
36 WORK_API ~WorkImpl_Dispatcher() noexcept;
38 WorkImpl_Dispatcher(WorkImpl_Dispatcher const &) = delete;
39 WorkImpl_Dispatcher &operator=(WorkImpl_Dispatcher const &) = delete;
41 template <class Callable>
42 inline
void Run(Callable &&c) {
43#if TBB_INTERFACE_VERSION_MAJOR >= 12
44 _taskGroup.run(std::forward<Callable>(c));
47 *
new(_rootTask->allocate_additional_child_of(*_rootTask))
48 _InvokerTaskWrapper<
typename std::remove_reference<Callable>::type>(
49 std::forward<Callable>(c)));
54 WORK_API
void Reset();
69 WORK_API
void Cancel();
71#if TBB_INTERFACE_VERSION_MAJOR < 12
73 struct _InvokerTaskWrapper :
public tbb::task {
74 explicit _InvokerTaskWrapper(Fn &&fn)
75 : _fn(
std::move(fn)) {}
77 explicit _InvokerTaskWrapper(Fn
const &fn)
80 virtual tbb::task* execute() {
83 const_cast<_InvokerTaskWrapper
const *
>(
this)->_fn();
91 tbb::task_group_context _context;
92#if TBB_INTERFACE_VERSION_MAJOR >= 12
94 class _TaskGroup :
public tbb::task_group {
96 _TaskGroup(tbb::task_group_context& ctx) : tbb::task_group(ctx) {}
97 inline tbb::detail::d1::wait_context& _GetInternalWaitContext();
100 _TaskGroup _taskGroup;
104 tbb::empty_task* _rootTask;
109PXR_NAMESPACE_CLOSE_SCOPE