File indexing completed on 2025-06-29 22:58:00
0001 #ifndef FWCore_Framework_ModuleHolder_h
0002 #define FWCore_Framework_ModuleHolder_h
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 #include <memory>
0023
0024
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
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
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 }
0139 }
0140
0141 #endif