File indexing completed on 2025-06-29 22:58:02
0001 #ifndef FWCore_Framework_Schedule_h
0002 #define FWCore_Framework_Schedule_h
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060 #include "DataFormats/Provenance/interface/ModuleDescription.h"
0061 #include "DataFormats/Provenance/interface/BranchIDList.h"
0062 #include "FWCore/Common/interface/FWCoreCommonFwd.h"
0063 #include "FWCore/Framework/interface/ExceptionActions.h"
0064 #include "FWCore/Framework/interface/ExceptionHelpers.h"
0065 #include "FWCore/Framework/interface/Frameworkfwd.h"
0066 #include "FWCore/Framework/interface/OccurrenceTraits.h"
0067 #include "FWCore/Framework/interface/WorkerManager.h"
0068 #include "FWCore/Framework/interface/maker/Worker.h"
0069 #include "FWCore/Framework/interface/GlobalSchedule.h"
0070 #include "FWCore/Framework/interface/StreamSchedule.h"
0071 #include "FWCore/Framework/interface/SystemTimeKeeper.h"
0072 #include "FWCore/Framework/interface/PreallocationConfiguration.h"
0073 #include "FWCore/MessageLogger/interface/ExceptionMessages.h"
0074 #include "FWCore/MessageLogger/interface/JobReport.h"
0075 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0076 #include "FWCore/ServiceRegistry/interface/Service.h"
0077 #include "FWCore/ServiceRegistry/interface/ServiceRegistryfwd.h"
0078 #include "FWCore/Utilities/interface/Algorithms.h"
0079 #include "FWCore/Utilities/interface/BranchType.h"
0080 #include "FWCore/Utilities/interface/Exception.h"
0081 #include "FWCore/Utilities/interface/StreamID.h"
0082 #include "FWCore/Utilities/interface/get_underlying_safe.h"
0083 #include "FWCore/Utilities/interface/propagate_const.h"
0084 #include "FWCore/Utilities/interface/Transition.h"
0085
0086 #include <array>
0087 #include <map>
0088 #include <memory>
0089 #include <mutex>
0090 #include <set>
0091 #include <string>
0092 #include <vector>
0093 #include <sstream>
0094 #include <utility>
0095
0096 namespace edm {
0097
0098 namespace service {
0099 class TriggerNamesService;
0100 }
0101 namespace eventsetup {
0102 struct ComponentDescription;
0103 class ESRecordsToProductResolverIndices;
0104 }
0105
0106 class BranchIDListHelper;
0107 class EventTransitionInfo;
0108 class ExceptionCollector;
0109 class MergeableRunProductMetadata;
0110 class OutputModuleCommunicator;
0111 class SignallingProductRegistryFiller;
0112 class PreallocationConfiguration;
0113 class StreamSchedule;
0114 class GlobalSchedule;
0115 struct TriggerTimingReport;
0116 class ModuleRegistry;
0117 class ModuleTypeResolverMaker;
0118 class ThinnedAssociationsHelper;
0119 class TriggerResultInserter;
0120 class PathStatusInserter;
0121 class EndPathStatusInserter;
0122 class WaitingTaskHolder;
0123
0124 class Schedule {
0125 public:
0126 typedef std::vector<std::string> vstring;
0127 typedef std::vector<Worker*> AllWorkers;
0128 typedef std::vector<edm::propagate_const<std::shared_ptr<OutputModuleCommunicator>>> AllOutputModuleCommunicators;
0129
0130 typedef std::vector<Worker*> Workers;
0131
0132 Schedule(ParameterSet& proc_pset,
0133 service::TriggerNamesService const& tns,
0134 SignallingProductRegistryFiller& pregistry,
0135 ExceptionToActionTable const& actions,
0136 std::shared_ptr<ActivityRegistry> areg,
0137 std::shared_ptr<ProcessConfiguration const> processConfiguration,
0138 PreallocationConfiguration const& config,
0139 ProcessContext const* processContext,
0140 ModuleTypeResolverMaker const* resolverMaker);
0141 void finishSetup(ParameterSet& proc_pset,
0142 service::TriggerNamesService const& tns,
0143 SignallingProductRegistryFiller& preg,
0144 BranchIDListHelper& branchIDListHelper,
0145 ProcessBlockHelperBase& processBlockHelper,
0146 ThinnedAssociationsHelper& thinnedAssociationsHelper,
0147 std::shared_ptr<ActivityRegistry> areg,
0148 std::shared_ptr<ProcessConfiguration> processConfiguration,
0149 PreallocationConfiguration const& prealloc,
0150 ProcessContext const* processContext);
0151
0152 void processOneEventAsync(WaitingTaskHolder iTask,
0153 unsigned int iStreamID,
0154 EventTransitionInfo&,
0155 ServiceToken const& token);
0156
0157 template <typename T>
0158 void processOneGlobalAsync(WaitingTaskHolder iTask,
0159 typename T::TransitionInfoType& transitionInfo,
0160 ServiceToken const& token,
0161 bool cleaningUpAfterException = false);
0162
0163 template <typename T>
0164 void processOneStreamAsync(WaitingTaskHolder iTask,
0165 unsigned int iStreamID,
0166 typename T::TransitionInfoType& transitionInfo,
0167 ServiceToken const& token,
0168 bool cleaningUpAfterException = false);
0169
0170 void beginJob(ProductRegistry const&,
0171 eventsetup::ESRecordsToProductResolverIndices const&,
0172 ProcessBlockHelperBase const&,
0173 std::string const& processName);
0174 void endJob(ExceptionCollector& collector);
0175 void sendFwkSummaryToMessageLogger() const;
0176
0177 void beginStream(unsigned int streamID);
0178 void endStream(unsigned int streamID, ExceptionCollector& collector, std::mutex& collectorMutex) noexcept;
0179
0180
0181 void writeLumiAsync(WaitingTaskHolder iTask,
0182 LuminosityBlockPrincipal const& lbp,
0183 ProcessContext const*,
0184 ActivityRegistry*);
0185
0186
0187 void writeRunAsync(WaitingTaskHolder iTask,
0188 RunPrincipal const& rp,
0189 ProcessContext const*,
0190 ActivityRegistry*,
0191 MergeableRunProductMetadata const*);
0192
0193 void writeProcessBlockAsync(WaitingTaskHolder iTask,
0194 ProcessBlockPrincipal const&,
0195 ProcessContext const*,
0196 ActivityRegistry*);
0197
0198
0199 void closeOutputFiles();
0200
0201
0202 void openOutputFiles(FileBlock& fb);
0203
0204
0205 void respondToOpenInputFile(FileBlock const& fb);
0206
0207
0208 void respondToCloseInputFile(FileBlock const& fb);
0209
0210
0211 bool shouldWeCloseOutput() const;
0212
0213
0214
0215
0216
0217
0218
0219 std::vector<ModuleDescription const*> getAllModuleDescriptions() const;
0220
0221
0222 void availablePaths(std::vector<std::string>& oLabelsToFill) const;
0223
0224
0225
0226
0227 void triggerPaths(std::vector<std::string>& oLabelsToFill) const;
0228
0229
0230 void endPaths(std::vector<std::string>& oLabelsToFill) const;
0231
0232
0233 void modulesInPath(std::string const& iPathLabel, std::vector<std::string>& oLabelsToFill) const;
0234
0235
0236
0237 void moduleDescriptionsInPath(std::string const& iPathLabel,
0238 std::vector<ModuleDescription const*>& descriptions,
0239 unsigned int hint) const;
0240
0241
0242
0243 void moduleDescriptionsInEndPath(std::string const& iEndPathLabel,
0244 std::vector<ModuleDescription const*>& descriptions,
0245 unsigned int hint) const;
0246
0247
0248
0249
0250 int totalEvents() const;
0251
0252
0253
0254 int totalEventsPassed() const;
0255
0256
0257
0258 int totalEventsFailed() const;
0259
0260
0261
0262 void getTriggerReport(TriggerReport& rep) const;
0263
0264
0265
0266 void getTriggerTimingReport(TriggerTimingReport& rep) const;
0267
0268
0269 bool terminate() const;
0270
0271
0272 void clearCounters();
0273
0274
0275
0276 bool changeModule(std::string const& iLabel,
0277 ParameterSet const& iPSet,
0278 const SignallingProductRegistryFiller& iRegistry,
0279 eventsetup::ESRecordsToProductResolverIndices const&);
0280
0281
0282 void deleteModule(std::string const& iLabel, ActivityRegistry* areg);
0283
0284 void initializeEarlyDelete(std::vector<std::string> const& branchesToDeleteEarly,
0285 std::multimap<std::string, std::string> const& referencesToBranches,
0286 std::vector<std::string> const& modulesToSkip,
0287 edm::ProductRegistry const& preg);
0288
0289
0290 AllWorkers const& allWorkers() const;
0291
0292
0293 void convertCurrentProcessAlias(std::string const& processName);
0294
0295 void releaseMemoryPostLookupSignal();
0296
0297 private:
0298 void limitOutput(ParameterSet const& proc_pset, BranchIDLists const& branchIDLists);
0299
0300 std::shared_ptr<TriggerResultInserter const> resultsInserter() const {
0301 return get_underlying_safe(resultsInserter_);
0302 }
0303 std::shared_ptr<TriggerResultInserter>& resultsInserter() { return get_underlying_safe(resultsInserter_); }
0304 std::shared_ptr<ModuleRegistry const> moduleRegistry() const { return get_underlying_safe(moduleRegistry_); }
0305 std::shared_ptr<ModuleRegistry>& moduleRegistry() { return get_underlying_safe(moduleRegistry_); }
0306
0307 edm::propagate_const<std::shared_ptr<ModuleRegistry>> moduleRegistry_;
0308 edm::propagate_const<std::shared_ptr<TriggerResultInserter>> resultsInserter_;
0309 std::vector<edm::propagate_const<std::shared_ptr<PathStatusInserter>>> pathStatusInserters_;
0310 std::vector<edm::propagate_const<std::shared_ptr<EndPathStatusInserter>>> endPathStatusInserters_;
0311 std::vector<edm::propagate_const<std::shared_ptr<StreamSchedule>>> streamSchedules_;
0312
0313 edm::propagate_const<std::unique_ptr<GlobalSchedule>> globalSchedule_;
0314
0315 AllOutputModuleCommunicators all_output_communicators_;
0316 PreallocationConfiguration preallocConfig_;
0317
0318 edm::propagate_const<std::unique_ptr<SystemTimeKeeper>> summaryTimeKeeper_;
0319
0320 std::vector<std::string> const* pathNames_;
0321 std::vector<std::string> const* endPathNames_;
0322 bool wantSummary_;
0323 };
0324
0325 template <typename T>
0326 void Schedule::processOneStreamAsync(WaitingTaskHolder iTaskHolder,
0327 unsigned int iStreamID,
0328 typename T::TransitionInfoType& transitionInfo,
0329 ServiceToken const& token,
0330 bool cleaningUpAfterException) {
0331 assert(iStreamID < streamSchedules_.size());
0332 streamSchedules_[iStreamID]->processOneStreamAsync<T>(
0333 std::move(iTaskHolder), transitionInfo, token, cleaningUpAfterException);
0334 }
0335
0336 template <typename T>
0337 void Schedule::processOneGlobalAsync(WaitingTaskHolder iTaskHolder,
0338 typename T::TransitionInfoType& transitionInfo,
0339 ServiceToken const& token,
0340 bool cleaningUpAfterException) {
0341 globalSchedule_->processOneGlobalAsync<T>(iTaskHolder, transitionInfo, token, cleaningUpAfterException);
0342 }
0343
0344 }
0345 #endif