CMS 3D CMS Logo

WaitingTaskHolder.h
Go to the documentation of this file.
1 #ifndef FWCore_Concurrency_WaitingTaskHolder_h
2 #define FWCore_Concurrency_WaitingTaskHolder_h
3 // -*- C++ -*-
4 //
5 // Package: FWCore/Concurrency
6 // Class : WaitingTaskHolder
7 //
16 //
17 // Original Author: FWCore
18 // Created: Fri, 18 Nov 2016 20:30:42 GMT
19 //
20 
21 // system include files
22 #include <cassert>
23 #include "tbb/task_group.h"
24 
25 // user include files
28 
29 // forward declarations
30 
31 namespace edm {
33  public:
34  friend class WaitingTaskList;
36 
37  WaitingTaskHolder() : m_task(nullptr), m_group(nullptr) {}
38 
39  explicit WaitingTaskHolder(tbb::task_group& iGroup, edm::WaitingTask* iTask) : m_task(iTask), m_group(&iGroup) {
41  }
43  if (m_task) {
44  doneWaiting(std::exception_ptr{});
45  }
46  }
47 
48  WaitingTaskHolder(const WaitingTaskHolder& iHolder) : m_task(iHolder.m_task), m_group(iHolder.m_group) {
50  }
51 
53  iOther.m_task = nullptr;
54  }
55 
57  WaitingTaskHolder tmp(iRHS);
58  std::swap(m_task, tmp.m_task);
59  std::swap(m_group, tmp.m_group);
60  return *this;
61  }
62 
65  std::swap(m_task, tmp.m_task);
66  std::swap(m_group, tmp.m_group);
67  return *this;
68  }
69 
70  // ---------- const member functions ---------------------
71  bool taskHasFailed() const noexcept { return m_task->exceptionPtr() != nullptr; }
72 
73  bool hasTask() const noexcept { return m_task != nullptr; }
77  CMS_SA_ALLOW tbb::task_group* group() const noexcept { return m_group; }
78  // ---------- static member functions --------------------
79 
80  // ---------- member functions ---------------------------
81 
87  void presetTaskAsFailed(std::exception_ptr iExcept) {
88  if (iExcept) {
89  m_task->dependentTaskFailed(iExcept);
90  }
91  }
92 
93  void doneWaiting(std::exception_ptr iExcept) {
94  if (iExcept) {
95  m_task->dependentTaskFailed(iExcept);
96  }
97  //task_group::run can run the task before we finish
98  // doneWaiting and some other thread might
99  // try to reuse this object. Resetting
100  // before spawn avoids problems
101  auto task = m_task;
102  m_task = nullptr;
103  if (0 == task->decrement_ref_count()) {
104  m_group->run([task]() {
105  TaskSentry s{task};
106  task->execute();
107  });
108  }
109  }
110 
111  private:
113  auto t = m_task;
114  m_task = nullptr;
115  return t;
116  }
117  // ---------- member data --------------------------------
119  tbb::task_group* m_group;
120  };
121 } // namespace edm
122 
123 #endif
edm
HLT enums.
Definition: AlignableModifier.h:19
edm::WaitingTaskHolder::WaitingTaskHolder
WaitingTaskHolder(WaitingTaskHolder &&iOther)
Definition: WaitingTaskHolder.h:52
edm::WaitingTaskHolder::operator=
WaitingTaskHolder & operator=(WaitingTaskHolder &&iRHS)
Definition: WaitingTaskHolder.h:63
edm::WaitingTaskHolder::m_task
WaitingTask * m_task
Definition: WaitingTaskHolder.h:118
edm::WaitingTaskHolder::doneWaiting
void doneWaiting(std::exception_ptr iExcept)
Definition: WaitingTaskHolder.h:93
edm::TaskSentry
Definition: TaskBase.h:50
createJobs.tmp
tmp
align.sh
Definition: createJobs.py:716
watchdog.const
const
Definition: watchdog.py:83
CMS_SA_ALLOW
#define CMS_SA_ALLOW
Definition: thread_safety_macros.h:5
edm::WaitingTaskHolder::taskHasFailed
bool taskHasFailed() const noexcept
Definition: WaitingTaskHolder.h:71
edm::WaitingTaskHolder::~WaitingTaskHolder
~WaitingTaskHolder()
Definition: WaitingTaskHolder.h:42
edm::WaitingTaskList
Definition: WaitingTaskList.h:84
edm::WaitingTaskWithArenaHolder
Definition: WaitingTaskWithArenaHolder.h:34
alignCSCRings.s
s
Definition: alignCSCRings.py:92
edm::WaitingTaskHolder::m_group
tbb::task_group * m_group
Definition: WaitingTaskHolder.h:119
edm::WaitingTaskHolder::presetTaskAsFailed
void presetTaskAsFailed(std::exception_ptr iExcept)
Definition: WaitingTaskHolder.h:87
edm::WaitingTask::exceptionPtr
std::exception_ptr const * exceptionPtr() const
Returns exception thrown by dependent task.
Definition: WaitingTask.h:51
std::swap
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
Definition: DataFrameContainer.h:209
TrackValidation_cff.task
task
Definition: TrackValidation_cff.py:252
edm::WaitingTaskHolder::release_no_decrement
WaitingTask * release_no_decrement() noexcept
Definition: WaitingTaskHolder.h:112
edm::WaitingTask::dependentTaskFailed
void dependentTaskFailed(std::exception_ptr iPtr)
Called if waited for task failed.
Definition: WaitingTask.h:59
edm::WaitingTaskHolder::operator=
WaitingTaskHolder & operator=(const WaitingTaskHolder &iRHS)
Definition: WaitingTaskHolder.h:56
edm::WaitingTaskHolder
Definition: WaitingTaskHolder.h:32
thread_safety_macros.h
edm::TaskBase::increment_ref_count
void increment_ref_count()
Definition: TaskBase.h:41
edm::WaitingTaskHolder::WaitingTaskHolder
WaitingTaskHolder(tbb::task_group &iGroup, edm::WaitingTask *iTask)
Definition: WaitingTaskHolder.h:39
WaitingTask.h
edm::WaitingTask
Definition: WaitingTask.h:36
eostools.move
def move(src, dest)
Definition: eostools.py:511
edm::WaitingTaskHolder::WaitingTaskHolder
WaitingTaskHolder(const WaitingTaskHolder &iHolder)
Definition: WaitingTaskHolder.h:48
edm::WaitingTaskHolder::hasTask
bool hasTask() const noexcept
Definition: WaitingTaskHolder.h:73
submitPVValidationJobs.t
string t
Definition: submitPVValidationJobs.py:644
edm::WaitingTaskHolder::WaitingTaskHolder
WaitingTaskHolder()
Definition: WaitingTaskHolder.h:37
edm::WaitingTaskHolder::group
tbb::task_group * group() const noexcept
Definition: WaitingTaskHolder.h:77