12 #include "RConfigure.h"
18 #include "tbb/task_group.h"
19 #include "tbb/task_arena.h"
22 #include <type_traits>
39 tbb::task_group *CastToTG(
void* p) {
40 return (tbb::task_group *) p;
47 namespace Experimental {
49 using namespace ROOT::Internal;
55 TTaskGroup::TTaskGroup()
58 if (!ROOT::IsImplicitMTEnabled()) {
59 throw std::runtime_error(
"Implicit parallelism not enabled. Cannot instantiate a TTaskGroup.");
61 fTaskContainer = ((
void *)
new tbb::task_group());
65 TTaskGroup::TTaskGroup(TTaskGroup &&other)
67 *
this = std::move(other);
70 TTaskGroup &TTaskGroup::operator=(TTaskGroup &&other)
72 fTaskContainer = other.fTaskContainer;
73 other.fTaskContainer =
nullptr;
74 fCanRun.store(other.fCanRun);
78 TTaskGroup::~TTaskGroup()
84 delete CastToTG(fTaskContainer);
90 void TTaskGroup::Cancel()
94 CastToTG(fTaskContainer)->cancel();
107 void TTaskGroup::Run(
const std::function<
void(
void)> &closure)
113 CastToTG(fTaskContainer)->run(closure);
122 void TTaskGroup::Wait()
126 CastToTG(fTaskContainer)->wait();