File indexing completed on 2025-01-11 03:38:16
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 explicit WaitingTaskWithArenaHolder(WaitingTaskHolder iTask);
0045
0046 ~WaitingTaskWithArenaHolder();
0047
0048 WaitingTaskWithArenaHolder(WaitingTaskWithArenaHolder const& iHolder);
0049
0050 WaitingTaskWithArenaHolder(WaitingTaskWithArenaHolder&& iOther);
0051
0052 WaitingTaskWithArenaHolder& operator=(const WaitingTaskWithArenaHolder& iRHS);
0053
0054 WaitingTaskWithArenaHolder& operator=(WaitingTaskWithArenaHolder&& iRHS);
0055
0056
0057
0058
0059
0060 void doneWaiting(std::exception_ptr iExcept);
0061
0062
0063
0064
0065
0066 void presetTaskAsFailed(std::exception_ptr iExcept) noexcept;
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079 WaitingTaskHolder makeWaitingTaskHolderAndRelease();
0080
0081 bool taskHasFailed() const noexcept;
0082
0083 bool hasTask() const noexcept;
0084
0085
0086
0087
0088 CMS_SA_ALLOW oneapi::tbb::task_group* group() const { return m_group; }
0089
0090 private:
0091
0092 WaitingTask* m_task;
0093 oneapi::tbb::task_group* m_group;
0094 std::shared_ptr<oneapi::tbb::task_arena> m_arena;
0095 };
0096
0097 template <typename F>
0098 auto make_lambda_with_holder(WaitingTaskWithArenaHolder h, F&& f) {
0099 return [holder = std::move(h), func = std::forward<F>(f)]() mutable {
0100 try {
0101 func(holder);
0102 } catch (...) {
0103 holder.doneWaiting(std::current_exception());
0104 }
0105 };
0106 }
0107
0108 template <typename F>
0109 auto make_waiting_task_with_holder(WaitingTaskWithArenaHolder h, F&& f) {
0110 return make_waiting_task(
0111 [holder = h, func = make_lambda_with_holder(h, std::forward<F>(f))](std::exception_ptr const* excptr) mutable {
0112 if (excptr) {
0113 holder.doneWaiting(*excptr);
0114 return;
0115 }
0116 func();
0117 });
0118 }
0119 }
0120 #endif