Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-06-20 01:53:19

0001 /**
0002    \file
0003    Implementation of class WorkerRegistry
0004 
0005    \author Stefano ARGIRO
0006    \date 18 May 2005
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     // if the worker is not there, make it
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       // Transfer ownership of worker to the registry
0038       m_workerMap[moduleLabel] =
0039           std::shared_ptr<Worker>(workerPtr.release());  // propagate_const<T> has no reset() function
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       // Transfer ownership of worker to the registry
0066       m_workerMap[moduleLabel] =
0067           std::shared_ptr<Worker>(workerPtr.release());  // propagate_const<T> has no reset() function
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 }  // namespace edm