File indexing completed on 2023-10-25 09:46:43
0001 #ifndef FWCore_Concurrency_WaitingTaskWithArenaHolder_h
0002 #define FWCore_Concurrency_WaitingTaskWithArenaHolder_h
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 #include <exception>
0023 #include <memory>
0024
0025 #include "oneapi/tbb/task_arena.h"
0026 #include "oneapi/tbb/task_group.h"
0027
0028 #include "FWCore/Utilities/interface/thread_safety_macros.h"
0029
0030 namespace edm {
0031 class WaitingTask;
0032 class WaitingTaskHolder;
0033
0034 class WaitingTaskWithArenaHolder {
0035 public:
0036 WaitingTaskWithArenaHolder();
0037
0038
0039
0040
0041 explicit WaitingTaskWithArenaHolder(oneapi::tbb::task_group&, WaitingTask* iTask);
0042
0043
0044
0045 explicit WaitingTaskWithArenaHolder(WaitingTaskHolder&& iTask);
0046
0047 ~WaitingTaskWithArenaHolder();
0048
0049 WaitingTaskWithArenaHolder(WaitingTaskWithArenaHolder const& iHolder);
0050
0051 WaitingTaskWithArenaHolder(WaitingTaskWithArenaHolder&& iOther);
0052
0053 WaitingTaskWithArenaHolder& operator=(const WaitingTaskWithArenaHolder& iRHS);
0054
0055 WaitingTaskWithArenaHolder& operator=(WaitingTaskWithArenaHolder&& iRHS);
0056
0057
0058
0059
0060
0061 void doneWaiting(std::exception_ptr iExcept);
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074 WaitingTaskHolder makeWaitingTaskHolderAndRelease();
0075
0076 bool taskHasFailed() const noexcept;
0077
0078 bool hasTask() const noexcept;
0079
0080
0081
0082
0083 CMS_SA_ALLOW oneapi::tbb::task_group* group() const { return m_group; }
0084
0085 private:
0086
0087 WaitingTask* m_task;
0088 oneapi::tbb::task_group* m_group;
0089 std::shared_ptr<oneapi::tbb::task_arena> m_arena;
0090 };
0091
0092 template <typename F>
0093 auto make_lambda_with_holder(WaitingTaskWithArenaHolder h, F&& f) {
0094 return [holder = std::move(h), func = std::forward<F>(f)]() mutable {
0095 try {
0096 func(holder);
0097 } catch (...) {
0098 holder.doneWaiting(std::current_exception());
0099 }
0100 };
0101 }
0102
0103 template <typename F>
0104 auto make_waiting_task_with_holder(WaitingTaskWithArenaHolder h, F&& f) {
0105 return make_waiting_task(
0106 [holder = h, func = make_lambda_with_holder(h, std::forward<F>(f))](std::exception_ptr const* excptr) mutable {
0107 if (excptr) {
0108 holder.doneWaiting(*excptr);
0109 return;
0110 }
0111 func();
0112 });
0113 }
0114 }
0115 #endif