File indexing completed on 2025-06-29 22:58:01
0001 #ifndef FWCore_Framework_WorkerT_h
0002 #define FWCore_Framework_WorkerT_h
0003
0004
0005
0006
0007
0008
0009
0010 #include "FWCore/Common/interface/FWCoreCommonFwd.h"
0011 #include "FWCore/Framework/interface/Frameworkfwd.h"
0012 #include "FWCore/Framework/interface/TransitionInfoTypes.h"
0013 #include "FWCore/Framework/interface/maker/Worker.h"
0014 #include "FWCore/Framework/interface/maker/WorkerParams.h"
0015 #include "FWCore/ServiceRegistry/interface/ServiceRegistryfwd.h"
0016 #include "FWCore/Utilities/interface/BranchType.h"
0017 #include "FWCore/Utilities/interface/propagate_const.h"
0018 #include "FWCore/Utilities/interface/Transition.h"
0019
0020 #include <array>
0021 #include <map>
0022 #include <memory>
0023 #include <string>
0024 #include <vector>
0025
0026 namespace edm {
0027
0028 class ProductResolverIndexAndSkipBit;
0029 class ThinnedAssociationsHelper;
0030
0031 namespace eventsetup {
0032 struct ComponentDescription;
0033 }
0034
0035 template <typename T>
0036 class WorkerT : public Worker {
0037 public:
0038 typedef T ModuleType;
0039 typedef WorkerT<T> WorkerType;
0040 WorkerT(std::shared_ptr<T>, ModuleDescription const&, ExceptionToActionTable const* actions);
0041
0042 ~WorkerT() override;
0043
0044 void setModule(std::shared_ptr<T> iModule) {
0045 module_ = iModule;
0046 resetModuleDescription(&(module_->moduleDescription()));
0047 }
0048
0049 Types moduleType() const override;
0050 ConcurrencyTypes moduleConcurrencyType() const override;
0051
0052 bool wantsProcessBlocks() const noexcept final;
0053 bool wantsInputProcessBlocks() const noexcept final;
0054 bool wantsGlobalRuns() const noexcept final;
0055 bool wantsGlobalLuminosityBlocks() const noexcept final;
0056 bool wantsStreamRuns() const noexcept final;
0057 bool wantsStreamLuminosityBlocks() const noexcept final;
0058
0059 SerialTaskQueue* globalRunsQueue() final;
0060 SerialTaskQueue* globalLuminosityBlocksQueue() final;
0061
0062 template <typename D>
0063 void callWorkerBeginStream(D, StreamID);
0064 template <typename D>
0065 void callWorkerEndStream(D, StreamID);
0066 template <typename D>
0067 void callWorkerStreamBegin(D, StreamID, RunTransitionInfo const&, ModuleCallingContext const*);
0068 template <typename D>
0069 void callWorkerStreamEnd(D, StreamID, RunTransitionInfo const&, ModuleCallingContext const*);
0070 template <typename D>
0071 void callWorkerStreamBegin(D, StreamID, LumiTransitionInfo const&, ModuleCallingContext const*);
0072 template <typename D>
0073 void callWorkerStreamEnd(D, StreamID, LumiTransitionInfo const&, ModuleCallingContext const*);
0074
0075 bool matchesBaseClassPointer(void const* iPtr) const noexcept final { return &(*module_) == iPtr; }
0076
0077 protected:
0078 T& module() { return *module_; }
0079 T const& module() const { return *module_; }
0080
0081 private:
0082 void doClearModule() override { get_underlying_safe(module_).reset(); }
0083
0084 bool implDo(EventTransitionInfo const&, ModuleCallingContext const*) override;
0085
0086 void itemsToGetForSelection(std::vector<ProductResolverIndexAndSkipBit>&) const final;
0087 bool implNeedToRunSelection() const noexcept final;
0088
0089 void implDoAcquire(EventTransitionInfo const&, ModuleCallingContext const*, WaitingTaskHolder&&) final;
0090
0091 size_t transformIndex(edm::ProductDescription const&) const noexcept final;
0092 void implDoTransformAsync(WaitingTaskHolder,
0093 size_t iTransformIndex,
0094 EventPrincipal const&,
0095 ParentContext const&,
0096 ServiceWeakToken const&) noexcept final;
0097 ProductResolverIndex itemToGetForTransform(size_t iTransformIndex) const noexcept final;
0098
0099 bool implDoPrePrefetchSelection(StreamID, EventPrincipal const&, ModuleCallingContext const*) override;
0100 bool implDoBeginProcessBlock(ProcessBlockPrincipal const&, ModuleCallingContext const*) override;
0101 bool implDoAccessInputProcessBlock(ProcessBlockPrincipal const&, ModuleCallingContext const*) override;
0102 bool implDoEndProcessBlock(ProcessBlockPrincipal const&, ModuleCallingContext const*) override;
0103 bool implDoBegin(RunTransitionInfo const&, ModuleCallingContext const*) override;
0104 bool implDoStreamBegin(StreamID, RunTransitionInfo const&, ModuleCallingContext const*) override;
0105 bool implDoStreamEnd(StreamID, RunTransitionInfo const&, ModuleCallingContext const*) override;
0106 bool implDoEnd(RunTransitionInfo const&, ModuleCallingContext const*) override;
0107 bool implDoBegin(LumiTransitionInfo const&, ModuleCallingContext const*) override;
0108 bool implDoStreamBegin(StreamID, LumiTransitionInfo const&, ModuleCallingContext const*) override;
0109 bool implDoStreamEnd(StreamID, LumiTransitionInfo const&, ModuleCallingContext const*) override;
0110 bool implDoEnd(LumiTransitionInfo const&, ModuleCallingContext const*) override;
0111 void implRespondToOpenInputFile(FileBlock const& fb) override;
0112 void implRespondToCloseInputFile(FileBlock const& fb) override;
0113 void implRespondToCloseOutputFile() override;
0114 TaskQueueAdaptor serializeRunModule() override;
0115
0116 std::vector<ModuleConsumesInfo> moduleConsumesInfos() const override;
0117 std::vector<ModuleConsumesMinimalESInfo> moduleConsumesMinimalESInfos() const final {
0118 return module_->moduleConsumesMinimalESInfos();
0119 }
0120
0121 void itemsToGet(BranchType branchType, std::vector<ProductResolverIndexAndSkipBit>& indexes) const override {
0122 module_->itemsToGet(branchType, indexes);
0123 }
0124
0125 void itemsMayGet(BranchType branchType, std::vector<ProductResolverIndexAndSkipBit>& indexes) const override {
0126 module_->itemsMayGet(branchType, indexes);
0127 }
0128
0129 std::vector<ProductResolverIndexAndSkipBit> const& itemsToGetFrom(BranchType iType) const final {
0130 return module_->itemsToGetFrom(iType);
0131 }
0132
0133 std::vector<ESResolverIndex> const& esItemsToGetFrom(Transition iTransition) const override {
0134 return module_->esGetTokenIndicesVector(iTransition);
0135 }
0136 std::vector<ESRecordIndex> const& esRecordsToGetFrom(Transition iTransition) const override {
0137 return module_->esGetTokenRecordIndicesVector(iTransition);
0138 }
0139
0140 void preActionBeforeRunEventAsync(WaitingTaskHolder iTask,
0141 ModuleCallingContext const& iModuleCallingContext,
0142 Principal const& iPrincipal) const noexcept override {
0143 module_->preActionBeforeRunEventAsync(iTask, iModuleCallingContext, iPrincipal);
0144 }
0145
0146 bool hasAcquire() const noexcept override { return module_->hasAcquire(); }
0147
0148 bool hasAccumulator() const noexcept override { return module_->hasAccumulator(); }
0149
0150 edm::propagate_const<std::shared_ptr<T>> module_;
0151 };
0152
0153 }
0154
0155 #endif