Skip to content

Commit 9e65e5d

Browse files
committed
Move construction of modules to ScheduleBuilder
No longer have the WorkerManager trigger building of modules.
1 parent 71e99dd commit 9e65e5d

15 files changed

+1328
-794
lines changed

FWCore/Framework/interface/GlobalSchedule.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ namespace edm {
5757
std::vector<edm::propagate_const<std::shared_ptr<PathStatusInserter>>>& pathStatusInserters,
5858
std::vector<edm::propagate_const<std::shared_ptr<EndPathStatusInserter>>>& endPathStatusInserters,
5959
std::shared_ptr<ModuleRegistry> modReg,
60-
std::vector<std::string> const& modulesToUse,
60+
std::vector<edm::ModuleDescription const*> const& modulesToUse,
6161
ParameterSet& proc_pset,
6262
SignallingProductRegistryFiller& pregistry,
6363
PreallocationConfiguration const& prealloc,
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#ifndef FWCore_Framework_ModuleInPath_h
2+
#define FWCore_Framework_ModuleInPath_h
3+
4+
/** Class used to hold the traits for how a module should be handled in a Path
5+
*/
6+
7+
#include "FWCore/Framework/interface/WorkerInPath.h"
8+
9+
namespace edm {
10+
class ModuleDescription;
11+
12+
struct ModuleInPath {
13+
ModuleInPath(ModuleDescription const* iDesc, WorkerInPath::FilterAction iAct, unsigned int iPlace, bool iConcurrent)
14+
: description_(iDesc), placeInPath_(iPlace), action_(iAct), runConcurrently_(iConcurrent) {}
15+
ModuleDescription const* description_;
16+
unsigned int placeInPath_;
17+
WorkerInPath::FilterAction action_;
18+
bool runConcurrently_;
19+
};
20+
} // namespace edm
21+
#endif

FWCore/Framework/interface/StreamSchedule.h

Lines changed: 25 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@
6464
#include "FWCore/Framework/interface/ExceptionHelpers.h"
6565
#include "FWCore/Framework/interface/Frameworkfwd.h"
6666
#include "FWCore/Framework/interface/OccurrenceTraits.h"
67-
#include "FWCore/Framework/interface/UnscheduledCallProducer.h"
6867
#include "FWCore/Framework/interface/WorkerManager.h"
6968
#include "FWCore/Framework/interface/Path.h"
7069
#include "FWCore/Framework/interface/TransitionInfoTypes.h"
70+
#include "FWCore/Framework/interface/ModuleInPath.h"
7171
#include "FWCore/Framework/interface/maker/Worker.h"
7272
#include "FWCore/Framework/interface/EarlyDeleteHelper.h"
7373
#include "FWCore/MessageLogger/interface/ExceptionMessages.h"
@@ -109,7 +109,6 @@ namespace edm {
109109
class ExceptionCollector;
110110
class ExceptionToActionTable;
111111
class OutputModuleCommunicator;
112-
class UnscheduledCallProducer;
113112
class WorkerInPath;
114113
class ModuleRegistry;
115114
class TriggerResultInserter;
@@ -134,14 +133,30 @@ namespace edm {
134133

135134
typedef std::vector<WorkerInPath> PathWorkers;
136135

137-
StreamSchedule(std::shared_ptr<TriggerResultInserter> inserter,
138-
std::vector<edm::propagate_const<std::shared_ptr<PathStatusInserter>>>& pathStatusInserters,
139-
std::vector<edm::propagate_const<std::shared_ptr<EndPathStatusInserter>>>& endPathStatusInserters,
136+
struct PathInfo {
137+
PathInfo(std::string name, std::vector<edm::ModuleInPath> modules, std::shared_ptr<PathStatusInserter> inserter)
138+
: name_(std::move(name)), modules_(std::move(modules)), inserter_(std::move(inserter)) {}
139+
std::string name_;
140+
std::vector<edm::ModuleInPath> modules_;
141+
std::shared_ptr<PathStatusInserter> inserter_;
142+
};
143+
struct EndPathInfo {
144+
EndPathInfo(std::string name,
145+
std::vector<edm::ModuleInPath> modules,
146+
std::shared_ptr<EndPathStatusInserter> inserter)
147+
: name_(std::move(name)), modules_(std::move(modules)), inserter_(std::move(inserter)) {}
148+
std::string name_;
149+
std::vector<edm::ModuleInPath> modules_;
150+
std::shared_ptr<EndPathStatusInserter> inserter_;
151+
};
152+
153+
StreamSchedule(std::vector<PathInfo> const& paths,
154+
std::vector<EndPathInfo> const& endPaths,
155+
std::vector<ModuleDescription const*> const& unscheduledModules,
156+
std::shared_ptr<TriggerResultInserter> inserter,
140157
std::shared_ptr<ModuleRegistry>,
141158
ParameterSet& proc_pset,
142-
service::TriggerNamesService const& tns,
143159
PreallocationConfiguration const& prealloc,
144-
SignallingProductRegistryFiller& pregistry,
145160
ExceptionToActionTable const& actions,
146161
std::shared_ptr<ActivityRegistry> areg,
147162
std::shared_ptr<ProcessConfiguration const> processConfiguration,
@@ -232,13 +247,6 @@ namespace edm {
232247

233248
StreamContext const& context() const { return streamContext_; }
234249

235-
struct AliasInfo {
236-
std::string friendlyClassName;
237-
std::string instanceLabel;
238-
std::string originalInstanceLabel;
239-
std::string originalModuleLabel;
240-
};
241-
242250
private:
243251
/// returns the action table
244252
ExceptionToActionTable const& actionTable() const { return workerManagerLumisAndEvents_.actionTable(); }
@@ -251,60 +259,15 @@ namespace edm {
251259

252260
void reportSkipped(EventPrincipal const& ep) const;
253261

254-
std::vector<Worker*> tryToPlaceConditionalModules(
255-
Worker*,
256-
ModuleRegistry& iRegistry,
257-
std::unordered_set<std::string>& conditionalModules,
258-
std::unordered_multimap<std::string, edm::ProductDescription const*> const& conditionalModuleBranches,
259-
std::unordered_multimap<std::string, AliasInfo> const& aliasMap,
260-
ParameterSet& proc_pset,
261-
SignallingProductRegistryFiller& preg,
262-
PreallocationConfiguration const* prealloc,
263-
std::shared_ptr<ProcessConfiguration const> processConfiguration);
264-
PathWorkers fillWorkers(ParameterSet& proc_pset,
265-
ModuleRegistry& moduleRegistry,
266-
SignallingProductRegistryFiller& preg,
267-
PreallocationConfiguration const* prealloc,
268-
std::shared_ptr<ProcessConfiguration const> processConfiguration,
269-
std::string const& name,
270-
bool ignoreFilters,
271-
std::vector<std::string> const& endPathNames,
272-
ConditionalTaskHelper const& conditionalTaskHelper,
273-
std::unordered_set<std::string>& allConditionalModules);
274-
void fillTrigPath(ParameterSet& proc_pset,
275-
ModuleRegistry& moduleRegistry,
276-
SignallingProductRegistryFiller& preg,
277-
PreallocationConfiguration const* prealloc,
278-
std::shared_ptr<ProcessConfiguration const> processConfiguration,
279-
int bitpos,
280-
std::string const& name,
281-
TrigResPtr,
282-
std::vector<std::string> const& endPathNames,
283-
ConditionalTaskHelper const& conditionalTaskHelper,
284-
std::unordered_set<std::string>& allConditionalModules);
285-
void fillEndPath(ParameterSet& proc_pset,
286-
ModuleRegistry& moduleRegistry,
287-
SignallingProductRegistryFiller& preg,
288-
PreallocationConfiguration const* prealloc,
289-
std::shared_ptr<ProcessConfiguration const> processConfiguration,
290-
int bitpos,
291-
std::string const& name,
292-
std::vector<std::string> const& endPathNames,
293-
ConditionalTaskHelper const& conditionalTaskHelper,
294-
std::unordered_set<std::string>& allConditionalModules);
295-
296-
void addToAllWorkers(Worker* w);
262+
PathWorkers fillWorkers(std::vector<ModuleInPath> const&);
263+
void fillTrigPath(PathInfo const&, int bitpos, TrigResPtr);
264+
void fillEndPath(EndPathInfo const&, int bitpos);
297265

298266
void resetEarlyDelete();
299267

300268
TrigResConstPtr results() const { return get_underlying_safe(results_); }
301269
TrigResPtr& results() { return get_underlying_safe(results_); }
302270

303-
void makePathStatusInserters(
304-
std::vector<edm::propagate_const<std::shared_ptr<PathStatusInserter>>>& pathStatusInserters,
305-
std::vector<edm::propagate_const<std::shared_ptr<EndPathStatusInserter>>>& endPathStatusInserters,
306-
ExceptionToActionTable const& actions);
307-
308271
template <typename T>
309272
void preScheduleSignal(StreamContext const*) const;
310273

FWCore/Framework/interface/WorkerManager.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ namespace edm {
4040

4141
void deleteModuleIfExists(std::string const& moduleLabel);
4242

43+
void addToUnscheduledWorkers(ModuleDescription const& iDescription);
44+
4345
void addToUnscheduledWorkers(ParameterSet& pset,
4446
SignallingProductRegistryFiller& preg,
4547
PreallocationConfiguration const* prealloc,
@@ -82,12 +84,21 @@ namespace edm {
8284
bool addToAllWorkers = true);
8385

8486
template <typename T>
87+
requires requires(T const& x) { x.moduleDescription(); }
8588
Worker* getWorkerForModule(T const& module) {
8689
auto* worker = getWorkerForExistingModule(module.moduleDescription().moduleLabel());
8790
assert(worker != nullptr);
8891
assert(worker->matchesBaseClassPointer(static_cast<typename T::ModuleType const*>(&module)));
8992
return worker;
9093
}
94+
95+
Worker* getWorkerForModule(edm::ModuleDescription const& iDescription) {
96+
auto* worker = getWorkerForExistingModule(iDescription.moduleLabel());
97+
assert(worker != nullptr);
98+
assert(worker->description() == &iDescription);
99+
return worker;
100+
}
101+
91102
void resetAll();
92103

93104
private:

FWCore/Framework/interface/maker/ModuleHolder.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@ namespace edm {
5353
virtual std::vector<ModuleConsumesInfo> moduleConsumesInfos() const = 0;
5454
virtual std::vector<ModuleConsumesMinimalESInfo> moduleConsumesMinimalESInfos() const = 0;
5555

56+
enum class Type { kAnalyzer, kFilter, kProducer, kOutputModule };
57+
enum class Concurrency { kGlobal, kLimited, kOne, kStream };
58+
59+
virtual Type moduleType() const = 0;
60+
virtual Concurrency moduleConcurrencyType() const = 0;
61+
5662
virtual void finishModuleInitialization(ModuleDescription const& iDesc,
5763
PreallocationConfiguration const& iPrealloc,
5864
SignallingProductRegistryFiller* iReg) = 0;
@@ -117,6 +123,8 @@ namespace edm {
117123
ModuleDescription const& moduleDescription() const final { return m_mod->moduleDescription(); }
118124
std::vector<ModuleConsumesInfo> moduleConsumesInfos() const final;
119125
std::vector<ModuleConsumesMinimalESInfo> moduleConsumesMinimalESInfos() const final;
126+
Type moduleType() const final;
127+
Concurrency moduleConcurrencyType() const final;
120128

121129
void finishModuleInitialization(ModuleDescription const& iDesc,
122130
PreallocationConfiguration const& iPrealloc,

FWCore/Framework/src/GlobalSchedule.cc

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ namespace edm {
3333
std::vector<edm::propagate_const<std::shared_ptr<PathStatusInserter>>>& pathStatusInserters,
3434
std::vector<edm::propagate_const<std::shared_ptr<EndPathStatusInserter>>>& endPathStatusInserters,
3535
std::shared_ptr<ModuleRegistry> modReg,
36-
std::vector<std::string> const& iModulesToUse,
36+
std::vector<edm::ModuleDescription const*> const& iModulesToUse,
3737
ParameterSet& proc_pset,
3838
SignallingProductRegistryFiller& pregistry,
3939
PreallocationConfiguration const& prealloc,
@@ -51,17 +51,10 @@ namespace edm {
5151
for (unsigned int i = 0; i < nManagers; ++i) {
5252
workerManagers_.emplace_back(modReg, areg, actions);
5353
}
54-
for (auto const& moduleLabel : iModulesToUse) {
55-
bool isTracked;
56-
ParameterSet* modpset = proc_pset.getPSetForUpdate(moduleLabel, isTracked);
57-
if (modpset != nullptr) { // It will be null for PathStatusInserters, it should
58-
// be impossible to be null for anything else
59-
assert(isTracked);
60-
61-
//side effect keeps this module around
62-
for (auto& wm : workerManagers_) {
63-
(void)wm.getWorker(*modpset, pregistry, &prealloc, processConfiguration, moduleLabel);
64-
}
54+
for (auto const& module : iModulesToUse) {
55+
//side effect keeps this module around
56+
for (auto& wm : workerManagers_) {
57+
(void)wm.getWorkerForModule(*module);
6558
}
6659
}
6760
if (inserter) {

FWCore/Framework/src/ModuleHolderT.cc

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,134 @@ namespace edm::maker {
244244
return m_mod->moduleConsumesMinimalESInfos();
245245
}
246246

247+
template <>
248+
ModuleHolder::Type ModuleHolderT<edm::one::EDProducerBase>::moduleType() const {
249+
return Type::kProducer;
250+
}
251+
template <>
252+
ModuleHolder::Type ModuleHolderT<edm::one::EDFilterBase>::moduleType() const {
253+
return Type::kFilter;
254+
}
255+
template <>
256+
ModuleHolder::Type ModuleHolderT<edm::one::EDAnalyzerBase>::moduleType() const {
257+
return Type::kAnalyzer;
258+
}
259+
template <>
260+
ModuleHolder::Type ModuleHolderT<edm::one::OutputModuleBase>::moduleType() const {
261+
return Type::kOutputModule;
262+
}
263+
264+
template <>
265+
ModuleHolder::Type ModuleHolderT<edm::global::EDProducerBase>::moduleType() const {
266+
return Type::kProducer;
267+
}
268+
template <>
269+
ModuleHolder::Type ModuleHolderT<edm::global::EDFilterBase>::moduleType() const {
270+
return Type::kFilter;
271+
}
272+
template <>
273+
ModuleHolder::Type ModuleHolderT<edm::global::EDAnalyzerBase>::moduleType() const {
274+
return Type::kAnalyzer;
275+
}
276+
template <>
277+
ModuleHolder::Type ModuleHolderT<edm::global::OutputModuleBase>::moduleType() const {
278+
return Type::kOutputModule;
279+
}
280+
281+
template <>
282+
ModuleHolder::Type ModuleHolderT<edm::limited::EDProducerBase>::moduleType() const {
283+
return Type::kProducer;
284+
}
285+
template <>
286+
ModuleHolder::Type ModuleHolderT<edm::limited::EDFilterBase>::moduleType() const {
287+
return Type::kFilter;
288+
}
289+
template <>
290+
ModuleHolder::Type ModuleHolderT<edm::limited::EDAnalyzerBase>::moduleType() const {
291+
return Type::kAnalyzer;
292+
}
293+
template <>
294+
ModuleHolder::Type ModuleHolderT<edm::limited::OutputModuleBase>::moduleType() const {
295+
return Type::kOutputModule;
296+
}
297+
298+
template <>
299+
ModuleHolder::Type ModuleHolderT<edm::stream::EDProducerAdaptorBase>::moduleType() const {
300+
return Type::kProducer;
301+
}
302+
template <>
303+
ModuleHolder::Type ModuleHolderT<edm::stream::EDFilterAdaptorBase>::moduleType() const {
304+
return Type::kFilter;
305+
}
306+
template <>
307+
ModuleHolder::Type ModuleHolderT<edm::stream::EDAnalyzerAdaptorBase>::moduleType() const {
308+
return Type::kAnalyzer;
309+
}
310+
311+
template <>
312+
ModuleHolder::Concurrency ModuleHolderT<edm::one::EDProducerBase>::moduleConcurrencyType() const {
313+
return Concurrency::kOne;
314+
}
315+
template <>
316+
ModuleHolder::Concurrency ModuleHolderT<edm::one::EDFilterBase>::moduleConcurrencyType() const {
317+
return Concurrency::kOne;
318+
}
319+
template <>
320+
ModuleHolder::Concurrency ModuleHolderT<edm::one::EDAnalyzerBase>::moduleConcurrencyType() const {
321+
return Concurrency::kOne;
322+
}
323+
template <>
324+
ModuleHolder::Concurrency ModuleHolderT<edm::one::OutputModuleBase>::moduleConcurrencyType() const {
325+
return Concurrency::kOne;
326+
}
327+
328+
template <>
329+
ModuleHolder::Concurrency ModuleHolderT<edm::global::EDProducerBase>::moduleConcurrencyType() const {
330+
return Concurrency::kGlobal;
331+
}
332+
template <>
333+
ModuleHolder::Concurrency ModuleHolderT<edm::global::EDFilterBase>::moduleConcurrencyType() const {
334+
return Concurrency::kGlobal;
335+
}
336+
template <>
337+
ModuleHolder::Concurrency ModuleHolderT<edm::global::EDAnalyzerBase>::moduleConcurrencyType() const {
338+
return Concurrency::kGlobal;
339+
}
340+
template <>
341+
ModuleHolder::Concurrency ModuleHolderT<edm::global::OutputModuleBase>::moduleConcurrencyType() const {
342+
return Concurrency::kGlobal;
343+
}
344+
345+
template <>
346+
ModuleHolder::Concurrency ModuleHolderT<edm::limited::EDProducerBase>::moduleConcurrencyType() const {
347+
return Concurrency::kLimited;
348+
}
349+
template <>
350+
ModuleHolder::Concurrency ModuleHolderT<edm::limited::EDFilterBase>::moduleConcurrencyType() const {
351+
return Concurrency::kLimited;
352+
}
353+
template <>
354+
ModuleHolder::Concurrency ModuleHolderT<edm::limited::EDAnalyzerBase>::moduleConcurrencyType() const {
355+
return Concurrency::kLimited;
356+
}
357+
template <>
358+
ModuleHolder::Concurrency ModuleHolderT<edm::limited::OutputModuleBase>::moduleConcurrencyType() const {
359+
return Concurrency::kLimited;
360+
}
361+
362+
template <>
363+
ModuleHolder::Concurrency ModuleHolderT<edm::stream::EDProducerAdaptorBase>::moduleConcurrencyType() const {
364+
return Concurrency::kStream;
365+
}
366+
template <>
367+
ModuleHolder::Concurrency ModuleHolderT<edm::stream::EDFilterAdaptorBase>::moduleConcurrencyType() const {
368+
return Concurrency::kStream;
369+
}
370+
template <>
371+
ModuleHolder::Concurrency ModuleHolderT<edm::stream::EDAnalyzerAdaptorBase>::moduleConcurrencyType() const {
372+
return Concurrency::kStream;
373+
}
374+
247375
//Explicitly instantiate our needed templates to avoid having the compiler
248376
// instantiate them in all of our libraries
249377
template class ModuleHolderT<one::EDProducerBase>;

0 commit comments

Comments
 (0)