Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-06-29 22:58:00

0001 #ifndef FWCore_Framework_ModuleHolder_h
0002 #define FWCore_Framework_ModuleHolder_h
0003 // -*- C++ -*-
0004 //
0005 // Package:     FWCore/Framework
0006 // Class  :     ModuleHolder
0007 //
0008 /**\class edm::maker::ModuleHolder ModuleHolder.h "FWCore/Framework/interface/maker/ModuleHolder.h"
0009 
0010  Description: Base class used to own a module for the framework
0011 
0012  Usage:
0013     <usage>
0014 
0015 */
0016 //
0017 // Original Author:  Chris Jones
0018 //         Created:  Fri, 23 Aug 2013 17:47:04 GMT
0019 //
0020 
0021 // system include files
0022 #include <memory>
0023 
0024 // user include files
0025 #include "FWCore/Framework/interface/maker/WorkerT.h"
0026 #include "FWCore/Framework/interface/SignallingProductRegistryFiller.h"
0027 #include "FWCore/Framework/interface/OutputModuleCommunicator.h"
0028 
0029 #include "FWCore/Utilities/interface/BranchType.h"
0030 #include "FWCore/Utilities/interface/ProductResolverIndex.h"
0031 
0032 #include <unordered_map>
0033 #include <string>
0034 // forward declarations
0035 namespace edm {
0036   class ModuleDescription;
0037   class SignallingProductRegistryFiller;
0038   class ExceptionToActionTable;
0039   class PreallocationConfiguration;
0040   class ProductResolverIndexHelper;
0041   class ProductResolverIndexAndSkipBit;
0042   class ProductRegistry;
0043   class ThinnedAssociationsHelper;
0044 
0045   namespace maker {
0046     class ModuleHolder {
0047     public:
0048       ModuleHolder() = default;
0049       virtual ~ModuleHolder() {}
0050       virtual std::unique_ptr<Worker> makeWorker(ExceptionToActionTable const* actions) const = 0;
0051 
0052       virtual ModuleDescription const& moduleDescription() const = 0;
0053       virtual void finishModuleInitialization(ModuleDescription const& iDesc,
0054                                               PreallocationConfiguration const& iPrealloc,
0055                                               SignallingProductRegistryFiller* iReg) = 0;
0056       virtual void replaceModuleFor(Worker*) const = 0;
0057 
0058       virtual void beginJob() = 0;
0059       virtual void endJob() = 0;
0060       virtual void beginStream(StreamID) = 0;
0061       virtual void endStream(StreamID) = 0;
0062 
0063       virtual std::unique_ptr<OutputModuleCommunicator> createOutputModuleCommunicator() = 0;
0064 
0065       void registerThinnedAssociations(ProductRegistry const& registry, ThinnedAssociationsHelper& helper);
0066       //Used to make EDGetToken work
0067       virtual void updateLookup(BranchType iBranchType, ProductResolverIndexHelper const&) = 0;
0068       virtual void updateLookup(eventsetup::ESRecordsToProductResolverIndices const&) = 0;
0069       virtual void releaseMemoryPostLookupSignal() = 0;
0070       virtual void selectInputProcessBlocks(ProductRegistry const&, ProcessBlockHelperBase const&) = 0;
0071       virtual void resolvePutIndicies(
0072           BranchType iBranchType,
0073           std::unordered_multimap<std::string, std::tuple<TypeID const*, const char*, edm::ProductResolverIndex>> const&
0074               iIndicies) = 0;
0075       virtual void convertCurrentProcessAlias(std::string const& processName) = 0;
0076 
0077     private:
0078       virtual void implRegisterThinnedAssociations(ProductRegistry const& registry,
0079                                                    ThinnedAssociationsHelper& helper) = 0;
0080     };
0081 
0082     template <typename T>
0083     class ModuleHolderT : public ModuleHolder {
0084     public:
0085       ModuleHolderT(std::shared_ptr<T> iModule) : m_mod(iModule) {}
0086       ~ModuleHolderT() override {}
0087       std::shared_ptr<T> module() const { return m_mod; }
0088       void replaceModuleFor(Worker* iWorker) const override {
0089         auto w = dynamic_cast<WorkerT<T>*>(iWorker);
0090         assert(nullptr != w);
0091         w->setModule(m_mod);
0092       }
0093       std::unique_ptr<Worker> makeWorker(ExceptionToActionTable const* actions) const final {
0094         return std::make_unique<edm::WorkerT<T>>(module(), moduleDescription(), actions);
0095       }
0096 
0097       static void finishModuleInitialization(T& iModule,
0098                                              ModuleDescription const& iDesc,
0099                                              PreallocationConfiguration const& iPrealloc,
0100                                              SignallingProductRegistryFiller* iReg) {
0101         iModule.setModuleDescription(iDesc);
0102         iModule.doPreallocate(iPrealloc);
0103         if (iReg) {
0104           iModule.registerProductsAndCallbacks(&iModule, iReg);
0105         }
0106       };
0107       ModuleDescription const& moduleDescription() const final { return m_mod->moduleDescription(); }
0108 
0109       void finishModuleInitialization(ModuleDescription const& iDesc,
0110                                       PreallocationConfiguration const& iPrealloc,
0111                                       SignallingProductRegistryFiller* iReg) override {
0112         finishModuleInitialization(*m_mod, iDesc, iPrealloc, iReg);
0113       }
0114       std::unique_ptr<OutputModuleCommunicator> createOutputModuleCommunicator() final;
0115 
0116       void beginJob() final;
0117       void endJob() final;
0118       void beginStream(StreamID) final;
0119       void endStream(StreamID) final;
0120 
0121       void updateLookup(BranchType iBranchType, ProductResolverIndexHelper const&) final;
0122       void updateLookup(eventsetup::ESRecordsToProductResolverIndices const&) final;
0123       void releaseMemoryPostLookupSignal() final;
0124       void selectInputProcessBlocks(ProductRegistry const&, ProcessBlockHelperBase const&) final;
0125       void resolvePutIndicies(
0126           BranchType iBranchType,
0127           std::unordered_multimap<std::string, std::tuple<TypeID const*, const char*, edm::ProductResolverIndex>> const&
0128               iIndicies) final;
0129       void convertCurrentProcessAlias(std::string const& processName) final {
0130         m_mod->convertCurrentProcessAlias(processName);
0131       }
0132 
0133     private:
0134       void implRegisterThinnedAssociations(ProductRegistry const& registry, ThinnedAssociationsHelper& helper) final;
0135 
0136       std::shared_ptr<T> m_mod;
0137     };
0138   }  // namespace maker
0139 }  // namespace edm
0140 
0141 #endif