File indexing completed on 2025-01-11 03:38:16
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "FWCore/Concurrency/interface/WaitingTaskWithArenaHolder.h"
0010 #include "FWCore/Concurrency/interface/WaitingTask.h"
0011 #include "FWCore/Concurrency/interface/WaitingTaskHolder.h"
0012 #include "FWCore/Utilities/interface/Likely.h"
0013
0014 namespace edm {
0015
0016 WaitingTaskWithArenaHolder::WaitingTaskWithArenaHolder() : m_task(nullptr) {}
0017
0018
0019
0020
0021 WaitingTaskWithArenaHolder::WaitingTaskWithArenaHolder(oneapi::tbb::task_group& iGroup, WaitingTask* iTask)
0022 : m_task(iTask),
0023 m_group(&iGroup),
0024 m_arena(std::make_shared<oneapi::tbb::task_arena>(oneapi::tbb::task_arena::attach())) {
0025 m_task->increment_ref_count();
0026 }
0027
0028 WaitingTaskWithArenaHolder::WaitingTaskWithArenaHolder(WaitingTaskHolder iTask)
0029 : m_task(iTask.release_no_decrement()),
0030 m_group(iTask.group()),
0031 m_arena(std::make_shared<oneapi::tbb::task_arena>(oneapi::tbb::task_arena::attach())) {}
0032
0033 WaitingTaskWithArenaHolder::~WaitingTaskWithArenaHolder() {
0034 if (m_task) {
0035 doneWaiting(std::exception_ptr{});
0036 }
0037 }
0038
0039 WaitingTaskWithArenaHolder::WaitingTaskWithArenaHolder(WaitingTaskWithArenaHolder const& iHolder)
0040 : m_task(iHolder.m_task), m_group(iHolder.m_group), m_arena(iHolder.m_arena) {
0041 if (LIKELY(m_task != nullptr)) {
0042 m_task->increment_ref_count();
0043 }
0044 }
0045
0046 WaitingTaskWithArenaHolder::WaitingTaskWithArenaHolder(WaitingTaskWithArenaHolder&& iOther)
0047 : m_task(iOther.m_task), m_group(iOther.m_group), m_arena(std::move(iOther.m_arena)) {
0048 iOther.m_task = nullptr;
0049 }
0050
0051 WaitingTaskWithArenaHolder& WaitingTaskWithArenaHolder::operator=(const WaitingTaskWithArenaHolder& iRHS) {
0052 WaitingTaskWithArenaHolder tmp(iRHS);
0053 std::swap(m_task, tmp.m_task);
0054 std::swap(m_group, tmp.m_group);
0055 std::swap(m_arena, tmp.m_arena);
0056 return *this;
0057 }
0058
0059 WaitingTaskWithArenaHolder& WaitingTaskWithArenaHolder::operator=(WaitingTaskWithArenaHolder&& iRHS) {
0060 WaitingTaskWithArenaHolder tmp(std::move(iRHS));
0061 std::swap(m_task, tmp.m_task);
0062 std::swap(m_group, tmp.m_group);
0063 std::swap(m_arena, tmp.m_arena);
0064 return *this;
0065 }
0066
0067
0068
0069
0070
0071 void WaitingTaskWithArenaHolder::doneWaiting(std::exception_ptr iExcept) {
0072 if (iExcept) {
0073 m_task->dependentTaskFailed(iExcept);
0074 }
0075
0076
0077
0078
0079 auto task = m_task;
0080 m_task = nullptr;
0081 if (0 == task->decrement_ref_count()) {
0082
0083
0084 m_arena->enqueue([task = task, group = m_group]() {
0085 group->run([task]() {
0086 TaskSentry s(task);
0087 task->execute();
0088 });
0089 });
0090 }
0091 }
0092
0093 void WaitingTaskWithArenaHolder::presetTaskAsFailed(std::exception_ptr iExcept) noexcept {
0094 if (iExcept) {
0095 m_task->dependentTaskFailed(iExcept);
0096 }
0097 }
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111 WaitingTaskHolder WaitingTaskWithArenaHolder::makeWaitingTaskHolderAndRelease() {
0112 WaitingTaskHolder holder(*m_group, m_task);
0113 m_task->decrement_ref_count();
0114 m_task = nullptr;
0115 return holder;
0116 }
0117
0118 bool WaitingTaskWithArenaHolder::taskHasFailed() const noexcept { return static_cast<bool>(m_task->exceptionPtr()); }
0119
0120 bool WaitingTaskWithArenaHolder::hasTask() const noexcept { return m_task != nullptr; }
0121
0122 }