Back to home page

Project CMSSW displayed by LXR

 
 

    


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 WorkerT: Code common to all workers.
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   }  // namespace eventsetup
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 }  // namespace edm
0154 
0155 #endif