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"
12#include "pxr/base/work/workTBB/tbb_version.h"
14#include <tbb/concurrent_vector.h>
15#if TBB_INTERFACE_VERSION_MAJOR >= 12
16#include <tbb/task_group.h>
25PXR_NAMESPACE_OPEN_SCOPE
27class WorkImpl_Dispatcher
31 WORK_API WorkImpl_Dispatcher();
34 WORK_API ~WorkImpl_Dispatcher() noexcept;
36 WorkImpl_Dispatcher(WorkImpl_Dispatcher const &) = delete;
37 WorkImpl_Dispatcher &operator=(WorkImpl_Dispatcher const &) = delete;
39 template <class Callable>
40 inline
void Run(Callable &&c) {
41#if TBB_INTERFACE_VERSION_MAJOR >= 12
42 _taskGroup.run(std::forward<Callable>(c));
45 *
new(_rootTask->allocate_additional_child_of(*_rootTask))
46 _InvokerTaskWrapper<
typename std::remove_reference<Callable>::type>(
47 std::forward<Callable>(c)));
52 WORK_API
void Reset();
67 WORK_API
void Cancel();
69#if TBB_INTERFACE_VERSION_MAJOR < 12
71 struct _InvokerTaskWrapper :
public tbb::task {
72 explicit _InvokerTaskWrapper(Fn &&fn)
73 : _fn(
std::move(fn)) {}
75 explicit _InvokerTaskWrapper(Fn
const &fn)
78 virtual tbb::task* execute() {
81 const_cast<_InvokerTaskWrapper
const *
>(
this)->_fn();
89 tbb::task_group_context _context;
90#if TBB_INTERFACE_VERSION_MAJOR >= 12
92 class _TaskGroup :
public tbb::task_group {
94 _TaskGroup(tbb::task_group_context& ctx) : tbb::task_group(ctx) {}
95 inline tbb::detail::d1::wait_context& _GetInternalWaitContext();
98 _TaskGroup _taskGroup;
102 tbb::empty_task* _rootTask;
107PXR_NAMESPACE_CLOSE_SCOPE