7#ifndef PXR_BASE_WORK_TBB_TASK_GRAPH_IMPL_H
8#define PXR_BASE_WORK_TBB_TASK_GRAPH_IMPL_H
11#include "pxr/base/work/api.h"
12#include "pxr/base/work/workTBB/tbb_version.h"
14#if TBB_INTERFACE_VERSION_MAJOR < 12
20#define WORK_IMPL_HAS_TASK_GRAPH
24PXR_NAMESPACE_OPEN_SCOPE
26class WorkImpl_TaskGraph
29 WORK_API WorkImpl_TaskGraph();
30 WORK_API ~WorkImpl_TaskGraph() noexcept;
32 WorkImpl_TaskGraph(WorkImpl_TaskGraph const &) = delete;
33 WorkImpl_TaskGraph &operator=(WorkImpl_TaskGraph const &) = delete;
37 template <typename F, typename ... Args>
38 F * AllocateTask(Args&&... args);
41 inline
void RunTask(F * task) {
42 tbb::task::spawn(*task);
49 tbb::task_group_context _context;
53 tbb::empty_task *_rootTask;
56class WorkImpl_TaskGraph::BaseTask :
public tbb::task {
59 WORK_API
virtual ~BaseTask();
61 void AddChildReference() {
62 increment_ref_count();
65 int RemoveChildReference() {
66 return decrement_ref_count();
69 template <
typename F,
typename... Args>
70 F * AllocateChild(Args &&...args) {
71 return new (tbb::task::allocate_additional_child_of(*
this))
72 F{std::forward<Args>(args)...};
76 void _RecycleAsContinuation() {
77 recycle_as_safe_continuation();
82template <
typename F,
typename ... Args>
83F * WorkImpl_TaskGraph::AllocateTask(Args&&... args) {
84 return new (tbb::task::allocate_additional_child_of(*_rootTask))
85 F{std::forward<Args>(args)...};
88PXR_NAMESPACE_CLOSE_SCOPE