File indexing completed on 2025-06-20 01:53:19
0001
0002
0003
0004
0005
0006
0007
0008 #include <memory>
0009 #include "FWCore/Framework/interface/WorkerRegistry.h"
0010 #include "FWCore/Framework/interface/maker/Worker.h"
0011 #include "FWCore/Framework/interface/maker/ModuleHolder.h"
0012 #include "FWCore/Framework/interface/maker/MakeModuleParams.h"
0013 #include "FWCore/Framework/interface/ModuleRegistry.h"
0014 #include "FWCore/ServiceRegistry/interface/ActivityRegistry.h"
0015
0016 namespace edm {
0017
0018 WorkerRegistry::WorkerRegistry(std::shared_ptr<ActivityRegistry> areg, std::shared_ptr<ModuleRegistry> modReg)
0019 : modRegistry_(modReg), m_workerMap(), actReg_(areg) {}
0020
0021 WorkerRegistry::~WorkerRegistry() {}
0022
0023 void WorkerRegistry::clear() { m_workerMap.clear(); }
0024
0025 Worker* WorkerRegistry::getWorker(WorkerParams const& p, std::string const& moduleLabel) {
0026 WorkerMap::iterator workerIt = m_workerMap.find(moduleLabel);
0027
0028
0029 if (workerIt == m_workerMap.end()) {
0030 MakeModuleParams mmp(p.pset_, *p.reg_, p.preallocate_, p.processConfiguration_);
0031 auto modulePtr = modRegistry_->getModule(
0032 mmp, moduleLabel, actReg_->preModuleConstructionSignal_, actReg_->postModuleConstructionSignal_);
0033 auto workerPtr = modulePtr->makeWorker(p.actions_);
0034
0035 workerPtr->setActivityRegistry(actReg_);
0036
0037
0038 m_workerMap[moduleLabel] =
0039 std::shared_ptr<Worker>(workerPtr.release());
0040 return m_workerMap[moduleLabel].get();
0041 }
0042 return (workerIt->second.get());
0043 }
0044
0045 Worker const* WorkerRegistry::get(std::string const& moduleLabel) const {
0046 WorkerMap::const_iterator workerIt = m_workerMap.find(moduleLabel);
0047 if (workerIt != m_workerMap.end()) {
0048 return workerIt->second;
0049 }
0050 return nullptr;
0051 }
0052
0053 Worker* WorkerRegistry::getWorkerFromExistingModule(std::string const& moduleLabel,
0054 ExceptionToActionTable const* actions) {
0055 WorkerMap::iterator workerIt = m_workerMap.find(moduleLabel);
0056 if (workerIt == m_workerMap.end()) {
0057 auto modulePtr = modRegistry_->getExistingModule(moduleLabel);
0058 if (!modulePtr) {
0059 return nullptr;
0060 }
0061 auto workerPtr = modulePtr->makeWorker(actions);
0062
0063 workerPtr->setActivityRegistry(actReg_);
0064
0065
0066 m_workerMap[moduleLabel] =
0067 std::shared_ptr<Worker>(workerPtr.release());
0068 return m_workerMap[moduleLabel].get();
0069 }
0070 return (workerIt->second.get());
0071 }
0072
0073 void WorkerRegistry::deleteModule(std::string const& moduleLabel) {
0074 WorkerMap::iterator workerIt = m_workerMap.find(moduleLabel);
0075 if (workerIt == m_workerMap.end()) {
0076 throw cms::Exception("LogicError")
0077 << "WorkerRegistry::deleteModule() Trying to delete the module of a Worker with label " << moduleLabel
0078 << " but no such Worker exists in the WorkerRegistry. Please contact framework developers.";
0079 }
0080 workerIt->second->clearModule();
0081 }
0082
0083 }