The Gaudi Framework  master (37c0b60a)
ApplicationMgr.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2024 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 
12 #include "ApplicationMgr.h"
13 #include "AlgorithmManager.h"
14 #include "DLLClassManager.h"
15 #include "ServiceManager.h"
16 #include <GAUDI_VERSION.h>
19 #include <GaudiKernel/IRunable.h>
20 #include <GaudiKernel/IService.h>
21 #include <GaudiKernel/Message.h>
22 #include <GaudiKernel/MsgStream.h>
24 #include <GaudiKernel/SmartIF.h>
25 #include <GaudiKernel/StatusCode.h>
26 #include <GaudiKernel/System.h>
27 #include <GaudiKernel/Time.h>
29 #include <TError.h>
30 #include <TROOT.h>
31 #include <algorithm>
32 #include <cassert>
33 #include <ctime>
34 #include <limits>
35 #include <sstream>
36 
37 using System::getEnv;
38 using System::isEnvSet;
39 
40 #define ON_DEBUG if ( m_outputLevel <= MSG::DEBUG )
41 #define ON_VERBOSE if ( m_outputLevel <= MSG::VERBOSE )
42 
44 
45 namespace {
47  static IMessageSvc* s_messageSvcInstance{ nullptr };
49  static ErrorHandlerFunc_t s_originalRootErrorHandler{ nullptr };
50 
52  void ROOTErrorHandlerAdapter( int level, Bool_t abort, const char* location, const char* msg ) {
53  if ( s_messageSvcInstance ) {
54  // we pass the message to MessageSvc only if it is not suppressed by ROOT itself
55  if ( level >= gErrorIgnoreLevel ) {
56  // # Map ROOT level to Gaudi level:
57  // ROOT levels go from 0 to 6000 in step of 1000,
58  // kInfo is 1000 while MSG::INFO is 3, so we aim for `level / 1000 + 2`,
59  // but we have to put a cap at MSG::FATAL.
60  int msgLevel = std::min<int>( level / 1000 + 2, MSG::FATAL );
61  if ( msgLevel >= s_messageSvcInstance->outputLevel( location ) ) {
62  s_messageSvcInstance->reportMessage( Message{ location, msgLevel, msg }, msgLevel );
63  }
64  }
65  } else {
66  // If a message is sent when we do not have an IMessageSvc, let's use something else
67  if ( s_originalRootErrorHandler ) {
68  // either the original handler (if any)
69  s_originalRootErrorHandler( level, abort, location, msg );
70  } else {
71  // or some minimalistic implementation from ROOT (just not to loose the message)
72  ROOT::Internal::MinimalErrorHandler( level, abort, location, msg );
73  }
74  }
75  }
76 
77 } // namespace
78 
79 // Implementation class for the Application Manager. In this way the
80 // ApplicationMgr class is a fully insulated concrete class. Clients
81 // (main programs) will not need to re-compile if there are changes
82 // in the implementation
83 
84 //=======================================================================
85 // Constructor
86 //=======================================================================
88  // IInterface initialization
89  addRef(); // Initial count set to 1
90 
91  // Instantiate component managers
92  m_managers[IService::interfaceID().id()] = new ServiceManager( this );
93 
95 
96  // Instantiate internal services
97  // SvcLocator/Factory HAS to be already instantiated
98  m_classManager = new DLLClassManager( this );
99 
100  AlgorithmManager* algMgr = new AlgorithmManager( this );
101  m_managers[IAlgorithm::interfaceID().id()] = algMgr;
102  // m_managers[IAlgorithm::interfaceID().id()] = new HiveAlgorithmManager(this);
103 
104  // This property is not hosted in the ApplicationMgr instance
105  declareProperty( "AlgTypeAliases", algMgr->typeAliases(),
106  "Aliases of algorithm types, to replace an algorithm type for every instance" );
107 
108  // ServiceMgr Initialization loop checking
109  svcManager()->setLoopCheckEnabled( m_loopCheck );
110 
111  m_svcMapping = { "EvtDataSvc/EventDataSvc",
112  "DetDataSvc/DetectorDataSvc",
113  "HistogramSvc/HistogramDataSvc",
114  "HbookCnv::PersSvc/HbookHistSvc",
115  "RootHistCnv::PersSvc/RootHistSvc",
116  "EvtPersistencySvc/EventPersistencySvc",
117  "DetPersistencySvc/DetectorPersistencySvc",
118  "HistogramPersistencySvc/HistogramPersistencySvc" };
119 }
120 
121 //============================================================================
122 // IInterface implementation: queryInterface::addRef()
123 //============================================================================
125  if ( !ppvi ) { return StatusCode::FAILURE; }
126 
127  // try to find own/direct interfaces:
128  StatusCode sc = base_class::queryInterface( iid, ppvi );
129  if ( sc.isSuccess() ) return sc;
130 
131  // find indirect interfaces :
132  if ( ISvcLocator::interfaceID().versionMatch( iid ) ) { return serviceLocator()->queryInterface( iid, ppvi ); }
133  if ( ISvcManager::interfaceID().versionMatch( iid ) ) { return svcManager()->queryInterface( iid, ppvi ); }
134  if ( IAlgManager::interfaceID().versionMatch( iid ) ) { return algManager()->queryInterface( iid, ppvi ); }
135  if ( IClassManager::interfaceID().versionMatch( iid ) ) { return m_classManager->queryInterface( iid, ppvi ); }
136  if ( IMessageSvc::interfaceID().versionMatch( iid ) ) {
137  *ppvi = m_messageSvc.get();
138  if ( m_messageSvc ) m_messageSvc->addRef();
139  // Note that 0 can be a valid IMessageSvc pointer value (when used for
140  // MsgStream).
141  return StatusCode::SUCCESS;
142  }
143  *ppvi = nullptr;
144  return StatusCode::FAILURE;
145 }
146 
147 //============================================================================
148 // ApplicationMgr::i_startup()
149 //============================================================================
151 
152  StatusCode sc;
153 
154  // declare factories in current module
155  m_classManager->loadModule( "" ).ignore();
156 
157  // Note: we cannot use CommonMessaging methods here because MessageSvc is not there yet
158  MsgStream log( nullptr, name() );
159 
160  // Create the Message service
161  auto msgsvc = svcManager()->createService( Gaudi::Utils::TypeNameString( "MessageSvc", m_messageSvcType ) );
162  if ( !msgsvc ) {
163  log << MSG::FATAL << "Error creating MessageSvc of type " << m_messageSvcType << endmsg;
164  return StatusCode::FAILURE;
165  }
166  // Get the useful interface from Message services
167  m_messageSvc = m_svcLocator->service( "MessageSvc" );
168  if ( !m_messageSvc ) {
169  log << MSG::FATAL << "Error retrieving MessageSvc." << endmsg;
170  return StatusCode::FAILURE;
171  }
172  sc = m_messageSvc.as<IProperty>()->setProperty( "OutputLevel", m_outputLevel );
173  if ( !sc ) {
174  log << MSG::FATAL << "Error setting OutputLevel option of MessageSvc" << endmsg;
175  return sc;
176  }
178  if ( gROOT ) {
179  // if ROOT is already initialized (usually it is the case) we redirect messages to MessageSvc.
180  s_messageSvcInstance = m_messageSvc.get();
181  s_originalRootErrorHandler = SetErrorHandler( ROOTErrorHandlerAdapter );
182  } else {
183  log << MSG::WARNING
184  << "ROOT not yet initialized, we cannot override the error handler are requested "
185  "(UseMessageSvcForROOTMessages==true)"
186  << endmsg;
187  }
188  }
189 
190  auto jobsvc = svcManager()->createService( Gaudi::Utils::TypeNameString( "JobOptionsSvc", m_jobOptionsSvcType ) );
191  // Create the Job Options service
192  if ( !jobsvc ) {
193  log << MSG::FATAL << "Error creating JobOptionsSvc" << endmsg;
194  return StatusCode::FAILURE;
195  }
196 
197  auto jobOptsIProp = jobsvc.as<IProperty>();
198  if ( !jobOptsIProp ) {
199  log << MSG::FATAL << "Error locating JobOptionsSvc" << endmsg;
200  return StatusCode::FAILURE;
201  }
202  sc = jobOptsIProp->setProperty( Gaudi::Property<std::string>( "TYPE", m_jobOptionsType ) );
203  if ( !sc.isSuccess() ) {
204  log << MSG::FATAL << "Error setting TYPE option in JobOptionsSvc" << endmsg;
205  return sc;
206  }
207 
208  if ( !m_jobOptionsPreAction.empty() ) {
209  sc = jobOptsIProp->setProperty( Gaudi::Property<std::string>( "PYTHONPARAMS", m_jobOptionsPreAction ) );
210  if ( !sc.isSuccess() ) {
211  log << MSG::FATAL << "Error setting JobOptionsPreAction option in JobOptionsSvc" << endmsg;
212  return sc;
213  }
214  }
215 
216  if ( !m_jobOptionsPostAction.empty() ) {
217  sc = jobOptsIProp->setProperty( Gaudi::Property<std::string>( "PYTHONACTION", m_jobOptionsPostAction ) );
218  if ( !sc.isSuccess() ) {
219  log << MSG::FATAL << "Error setting JobOptionsPostAction option in JobOptionsSvc" << endmsg;
220  return sc;
221  }
222  }
223 
224  if ( !m_jobOptionsPath.empty() ) { // The command line takes precedence
225  sc = jobOptsIProp->setProperty( Gaudi::Property<std::string>( "PATH", m_jobOptionsPath ) );
226  if ( !sc.isSuccess() ) {
227  log << MSG::FATAL << "Error setting PATH option in JobOptionsSvc" << endmsg;
228  return sc;
229  }
230  } else if ( isEnvSet( "JOBOPTPATH" ) ) { // Otherwise the Environment JOBOPTPATH
231  sc = jobOptsIProp->setProperty( Gaudi::Property<std::string>( "PATH", getEnv( "JOBOPTPATH" ) ) );
232  if ( !sc.isSuccess() ) {
233  log << MSG::FATAL << "Error setting PATH option in JobOptionsSvc from env" << endmsg;
234  return sc;
235  }
236  } else { // Otherwise the default
237  sc = jobOptsIProp->setProperty( Gaudi::Property<std::string>( "PATH", "../options/job.opts" ) );
238  if ( !sc.isSuccess() ) {
239  log << MSG::FATAL << "Error setting PATH option in JobOptionsSvc to default" << endmsg;
240  return sc;
241  }
242  }
243  jobOptsIProp.reset();
244 
245  // Sets my default the Output Level of the Message service to be
246  // the same as this
247  auto msgSvcIProp = msgsvc.as<IProperty>();
248  msgSvcIProp->setProperty( Gaudi::Property<int>( "OutputLevel", m_outputLevel ) ).ignore();
249  msgSvcIProp.reset();
250 
251  sc = jobsvc->sysInitialize();
252  if ( !sc.isSuccess() ) {
253  log << MSG::FATAL << "Error initializing JobOptionsSvc" << endmsg;
254  return sc;
255  }
256  sc = msgsvc->sysInitialize();
257  if ( !sc.isSuccess() ) {
258  log << MSG::FATAL << "Error initializing MessageSvc" << endmsg;
259  return sc;
260  }
261 
262  // Make sure output level caches are up to date.
264 
265  return sc;
266 }
267 
268 //============================================================================
269 // IAppMgrUI implementation: ApplicationMgr::configure()
270 //============================================================================
272 
273  // Check if the state is compatible with the transition
274  MsgStream tlog( m_messageSvc, name() );
276  tlog << MSG::INFO << "Already Configured" << endmsg;
277  return StatusCode::SUCCESS;
278  }
280  tlog << MSG::FATAL << "configure: Invalid state \"" << m_state << "\"" << endmsg;
281  return StatusCode::FAILURE;
282  }
284 
285  // Reset application return code.
287 
288  StatusCode sc;
289  sc = i_startup();
290  if ( !sc.isSuccess() ) { return sc; }
291 
292  {
294  // Get my own options using the Job options service
295  if ( log.level() <= MSG::DEBUG ) log << MSG::DEBUG << "Getting my own properties" << endmsg;
296  bindPropertiesTo( serviceLocator()->getOptsSvc() );
297  }
298 
299  // Make sure that the OutputLevel is in sync
300  if ( m_outputLevel != MSG::NIL && m_messageSvc ) m_messageSvc->setOutputLevel( name(), m_outputLevel );
302 
303  // Check current outputLevel to eventually inform the MessageSvc
304  if ( m_outputLevel != MSG::NIL && !m_appName.empty() ) {
305  // Print a welcome message
307  << "=================================================================="
308  << "==================================================================" << std::endl
309  << " "
310  << " Welcome to " << m_appName.value();
311 
312  if ( !m_appVersion.empty() ) {
313  log << MSG::ALWAYS << " version " << m_appVersion.value();
314  } else {
315  log << MSG::ALWAYS << " (GaudiCoreSvc "
316  << "v" << GAUDI_MAJOR_VERSION << "r" << GAUDI_MINOR_VERSION
317 #if GAUDI_PATCH_VERSION
318  << "p" << GAUDI_PATCH_VERSION
319 #endif
320  << ")";
321  }
322 
323  // Add the host name and current time to the message
325  << " "
326  << " running on " << System::hostName() << " on " << Gaudi::Time::current().format( true ) << std::endl
327  << "=================================================================="
328  << "==================================================================" << endmsg;
329  }
330 
331  // print all own properties if the options "PropertiesPrint" is set to true
332  if ( m_propertiesPrint ) {
333  const auto& properties = getProperties();
334  log << MSG::ALWAYS << "List of ALL properties of " << System::typeinfoName( typeid( *this ) ) << "/" << this->name()
335  << " #properties = " << properties.size() << endmsg;
336  for ( const auto& property : properties ) { log << "Property ['Name': Value] = " << *property << endmsg; }
337  }
338 
339  // set the requested environment variables
340  for ( auto& var : m_environment ) {
341  const std::string& name = var.first;
342  const std::string& value = var.second;
344  const MSG::Level lvl = ( !old.empty() && ( old != "UNKNOWN" ) ) ? MSG::WARNING : MSG::DEBUG;
345  if ( m_outputLevel <= lvl ) log << lvl << "Setting " << name << " = " << value << endmsg;
346  System::setEnv( name, value );
347  }
348 
349  // Declare Service Types
350  for ( auto& j : m_svcMapping ) {
352  if ( svcManager()->declareSvcType( itm.name(), itm.type() ).isFailure() ) {
353  log << MSG::ERROR << "configure: declaring svc type:'" << j << "' failed." << endmsg;
354  return StatusCode::FAILURE;
355  } else {
356  ON_VERBOSE
357  log << MSG::VERBOSE << "declared service " << j << endmsg;
358  }
359  }
360  for ( auto& j : m_svcOptMapping ) {
362  if ( svcManager()->declareSvcType( itm.name(), itm.type() ).isFailure() ) {
363  log << MSG::ERROR << "declaring svc type:'" << j << "' failed." << endmsg;
364  return StatusCode::FAILURE;
365  }
366  }
367 
368  //--------------------------------------------------------------------------
369  // Declare other Services and Algorithms by loading DLL's
370  sc = decodeDllNameList();
371  if ( sc.isFailure() ) {
372  log << MSG::ERROR << "Failure loading declared DLL's" << endmsg;
373  return sc;
374  }
375 
376  //--------------------------------------------------------------------------
377  // Deal with the services explicitly declared by the user.
378  sc = decodeExtSvcNameList();
379  if ( sc.isFailure() ) {
380  log << MSG::ERROR << "Failure during external service association" << endmsg;
381  return sc;
382  }
383 
385  if ( sc.isFailure() ) {
386  log << MSG::ERROR << "Failure during external service creation" << endmsg;
387  return sc;
388  }
389 
390  //--------------------------------------------------------------------------
391  // Retrieve intrinsic services. If needed configure them.
392  //--------------------------------------------------------------------------
393  const Gaudi::Utils::TypeNameString evtloop_item( m_eventLoopMgr );
394  sc = svcManager()->addService( evtloop_item, ServiceManager::DEFAULT_SVC_PRIORITY * 10 );
395  if ( !sc.isSuccess() ) {
396  log << MSG::FATAL << "Error adding :" << m_eventLoopMgr << endmsg;
397  return sc;
398  } else {
399  ON_VERBOSE
400  log << MSG::VERBOSE << "added service " << evtloop_item << endmsg;
401  }
402 
403  m_runable = m_svcLocator->service( m_runableType );
404  if ( !m_runable ) {
405  log << MSG::FATAL << "Error retrieving Runable: " << m_runableType.value() << "\n Check option ApplicationMgr."
406  << m_runableType.name() << endmsg;
407  return sc;
408  }
409  m_processingMgr = m_svcLocator->service( evtloop_item );
410  if ( !m_processingMgr ) {
411  log << MSG::FATAL << "Error retrieving Processing manager: " << m_eventLoopMgr.value()
412  << "\n Check option ApplicationMgr." << m_eventLoopMgr.name() << "\n No events will be processed." << endmsg;
413  return sc;
414  }
415  // The IEventProcessor might also be an IQueueingEventProcessor
417 
418  // Establish Update Handlers for ExtSvc and DLLs Properties
422 
423  if ( m_actHistory ) {
424  // Create HistorySvc with a priority to ensure it's initialized last, finalized first
425  sc = svcManager()->addService( "HistorySvc", std::numeric_limits<int>::max() );
426  if ( sc.isFailure() ) {
427  log << MSG::FATAL << "Error adding HistorySvc" << endmsg;
428  return StatusCode::FAILURE;
429  }
430  }
431 
432  log << MSG::INFO << "Application Manager Configured successfully" << endmsg;
434  return StatusCode::SUCCESS;
435 }
436 
437 //============================================================================
438 // IAppMgrUI implementation: ApplicationMgr::initialize()
439 //============================================================================
441  StatusCode sc;
442 
444 
445  // Make sure output level caches are up to date.
447 
448  // I cannot add these services in configure() because they are coming from GaudiUtils
449  // and it messes up genconf when rebuilding it.
450  if ( m_stopOnSignal ) {
451  // Instantiate the service that schedules a stop when a signal is received
452  std::string svcname( "Gaudi::Utils::StopSignalHandler" );
453  sc = svcManager()->addService( svcname );
454  if ( sc.isFailure() ) {
455  log << MSG::INFO << "Cannot instantiate " << svcname << "signals will be ignored" << endmsg;
456  }
457  }
458 
460  log << MSG::INFO << "Already Initialized!" << endmsg;
461  return StatusCode::SUCCESS;
462  }
464  log << MSG::FATAL << "initialize: Invalid state \"" << m_state << "\"" << endmsg;
465  return StatusCode::FAILURE;
466  }
468 
469  //--------------------------------------------------------------------------
470  // Initialize the list of top Services
471  //--------------------------------------------------------------------------
472  sc = svcManager()->initialize();
473  if ( !sc.isSuccess() ) return sc;
474 
475  sc = algManager()->initialize();
476  if ( !sc.isSuccess() ) return sc;
477 
478  //--------------------------------------------------------------------------
479  // Final steps: Inform user and change internal state
480  //--------------------------------------------------------------------------
481  log << MSG::INFO << "Application Manager Initialized successfully" << endmsg;
483 
485 
486  return sc;
487 }
488 
489 //============================================================================
490 // IAppMgrUI implementation: ApplicationMgr::start()
491 //============================================================================
493 
495 
497  log << MSG::INFO << "Already Initialized!" << endmsg;
498  return StatusCode::SUCCESS;
499  }
501  log << MSG::FATAL << "start: Invalid state \"" << m_state << "\"" << endmsg;
502  return StatusCode::FAILURE;
503  }
505 
506  //--------------------------------------------------------------------------
507  // Initialize the list of top Services
508  //--------------------------------------------------------------------------
509  return m_svcLocator->service( "JobOptionsSvc" )
510  ->sysStart()
511  .andThen( [&]() { return m_messageSvc.as<IService>()->sysStart(); } )
512  .andThen( [&]() { return svcManager()->start(); } )
513  .andThen( [&]() { return algManager()->start(); } )
514  .andThen( [&]() {
515  //--------------------------------------------------------------------------
516  // Final steps: Inform user and change internal state
517  //--------------------------------------------------------------------------
518  log << MSG::INFO << "Application Manager Started successfully" << endmsg;
520  } );
521 }
522 
523 //============================================================================
524 // IAppMgrUI implementation: ApplicationMgr::nextEvent(int)
525 //============================================================================
529  log << MSG::FATAL << "nextEvent: Invalid state \"" << m_state << "\"" << endmsg;
530  return StatusCode::FAILURE;
531  }
532  if ( !m_processingMgr ) {
534  log << MSG::FATAL << "No event processing manager specified. Check option: " << m_eventLoopMgr.name() << endmsg;
535  return StatusCode::FAILURE;
536  }
537  return m_processingMgr->nextEvent( maxevt );
538 }
539 
540 //============================================================================
541 // IAppMgrUI implementation: ApplicationMgr::stop()
542 //============================================================================
544 
546 
548  log << MSG::INFO << "Already Initialized!" << endmsg;
549  return StatusCode::SUCCESS;
550  }
552  log << MSG::FATAL << "stop: Invalid state \"" << m_state << "\"" << endmsg;
553  return StatusCode::FAILURE;
554  }
556 
557  // Stop independently managed Algorithms
558  return algManager()
559  ->stop()
560  //--------------------------------------------------------------------------
561  // Stop the list of top Services
562  //--------------------------------------------------------------------------
563  .andThen( [&]() { return svcManager()->stop(); } )
564  .andThen( [&]() { return m_messageSvc.as<IService>()->sysStop(); } )
565  .andThen( [&]() { return m_svcLocator->service( "JobOptionsSvc" )->sysStop(); } )
566  //--------------------------------------------------------------------------
567  // Final steps: Inform user and change internal state
568  //--------------------------------------------------------------------------
569  .andThen( [&]() {
570  log << MSG::INFO << "Application Manager Stopped successfully" << endmsg;
572  } );
573 }
574 
575 //============================================================================
576 // IAppMgrUI implementation: ApplicationMgr::finalize()
577 //============================================================================
581  log << MSG::INFO << "Already Finalized" << endmsg;
582  return StatusCode::SUCCESS;
583  }
585  log << MSG::FATAL << "finalize: Invalid state \"" << m_state << "\"" << endmsg;
586  return StatusCode::FAILURE;
587  }
589 
590  // disable message suppression in finalize
591  m_svcLocator->service<IProperty>( "MessageSvc" )
592  ->setProperty( Gaudi::Property<bool>( "enableSuppression", false ) )
593  .ignore();
594 
595  // Finalize independently managed Algorithms
596  StatusCode sc = algManager()->finalize();
597  if ( sc.isFailure() ) {
598  log << MSG::WARNING << "Failed to finalize an algorithm." << endmsg;
600  }
601 
602  // Finalize all Services
603  sc = svcManager()->finalize();
604  if ( sc.isFailure() ) {
605  log << MSG::WARNING << "Failed to finalize a service." << endmsg;
607  }
608 
609  // svcManager()->removeService( (IService*) m_processingMgr.get() );
610  // svcManager()->removeService( (IService*) m_runable.get() );
611 
612  if ( sc.isSuccess() ) {
613  log << MSG::INFO << "Application Manager Finalized successfully" << endmsg;
614  } else {
615  log << MSG::ERROR << "Application Manager failed to finalize" << endmsg;
616  }
617 
619  return sc;
620 }
621 
622 //============================================================================
623 // IAppMgrUI implementation: ApplicationMgr::terminate()
624 //============================================================================
627 
629  log << MSG::INFO << "Already Offline" << endmsg;
630  return StatusCode::SUCCESS;
631  }
633  log << MSG::FATAL << "terminate: Invalid state \"" << m_state << "\"" << endmsg;
634  return StatusCode::FAILURE;
635  }
636  // release all Services
638 
640  log << MSG::INFO << "Application Manager Terminated successfully" << endmsg;
642  log << MSG::INFO << "Application Manager Terminated successfully with a user requested ScheduledStop" << endmsg;
643  } else {
644  log << MSG::ERROR << "Application Manager Terminated with error code " << m_returnCode.value() << endmsg;
645  }
646 
647  {
648  auto& opts = m_svcLocator->getOptsSvc();
649  // Force a disable the auditing of finalize for MessageSvc
650  opts.set( "MessageSvc.AuditFinalize", "false" );
651  // Force a disable the auditing of finalize for JobOptionsSvc
652  opts.set( "JobOptionsSvc.AuditFinalize", "false" );
653  }
654 
655  // if we have overriden it, restore the original ROOT error handler
656  if ( s_originalRootErrorHandler ) {
657  SetErrorHandler( s_originalRootErrorHandler );
658  s_originalRootErrorHandler = nullptr;
659  }
660  // make sure ROOTErrorHandlerAdapter (if in use) does not try to use the MessageSvc we are about to delete
661  s_messageSvcInstance = nullptr;
662  // finalize MessageSvc
663  auto svc = m_messageSvc.as<IService>();
664  if ( !svc ) {
665  log << MSG::ERROR << "Could not get the IService interface of the MessageSvc" << endmsg;
666  } else {
667  svc->sysFinalize().ignore();
668  svcManager()->removeService( svc ).ignore();
669  }
670 
671  // finalize JobOptionsSvc
672  svc = m_svcLocator->service( "JobOptionsSvc" );
673  if ( !svc ) {
674  log << MSG::ERROR << "Could not get the IService interface of the JobOptionsSvc" << endmsg;
675  } else {
676  svc->sysFinalize().ignore();
677  svcManager()->removeService( svc ).ignore();
678  }
679 
681  return StatusCode::SUCCESS;
682 }
683 
684 //============================================================================
685 // Reach the required state going through all the needed transitions
686 //============================================================================
689 
690  switch ( state ) {
691 
693  switch ( m_state ) {
695  return StatusCode::SUCCESS;
696  break;
698  return terminate();
699  break;
700  default: // Gaudi::StateMachine::INITIALIZED or Gaudi::StateMachine::RUNNING
702  if ( sc.isSuccess() ) { return terminate(); }
703  break;
704  }
705  break;
706 
708  switch ( m_state ) {
710  return StatusCode::SUCCESS;
711  break;
713  return configure();
714  break;
716  return finalize();
717  break;
718  default: // Gaudi::StateMachine::RUNNING
720  if ( sc.isSuccess() ) { return finalize(); }
721  break;
722  }
723  break;
724 
726  switch ( m_state ) {
728  return StatusCode::SUCCESS;
729  break;
731  return initialize();
732  break;
734  return stop();
735  break;
736  default: // Gaudi::StateMachine::OFFLINE
738  if ( sc.isSuccess() ) { return initialize(); }
739  break;
740  }
741  break;
742 
744  switch ( m_state ) {
746  return StatusCode::SUCCESS;
747  break;
749  return start();
750  break;
751  default: // Gaudi::StateMachine::OFFLINE or Gaudi::StateMachine::CONFIGURED
753  if ( sc.isSuccess() ) { return start(); }
754  break;
755  }
756  break;
757  }
758 
759  // If I get here, there has been a problem in the recursion
760 
761  if ( ignoreFailures ) {
762  // force the new state
763  m_state = state;
764  return StatusCode::SUCCESS;
765  }
766 
767  return sc;
768 }
769 
770 //============================================================================
771 // IAppMgrUI implementation: ApplicationMgr::run()
772 //============================================================================
775 
777  if ( sc.isSuccess() ) {
779  if ( m_runable != 0 ) { // loop over the events
780  sc = m_runable->run();
781  if ( !sc.isSuccess() ) { log << MSG::FATAL << "Application execution failed. Ending the job." << endmsg; }
782  } else {
783  log << MSG::FATAL << "Application has no runable object. Check option:" << m_runableType.name() << endmsg;
784  }
785  }
786  if ( sc.isSuccess() ) { // try to close cleanly
788  }
789  // either the runable failed of the stut-down
790  if ( sc.isFailure() ) { // try to close anyway (but keep the StatusCode unchanged)
792  }
793  return sc;
794 }
795 
796 //============================================================================
797 // IEventProcessor implementation: executeEvent(EventContext&&)
798 //============================================================================
801  if ( m_processingMgr ) { return m_processingMgr->executeEvent( std::move( ctx ) ); }
802  }
804  log << MSG::FATAL << "executeEvent: Invalid state \"" << FSMState() << "\"" << endmsg;
805  return StatusCode::FAILURE;
806 }
807 
810  std::move( ctx ) );
811 }
812 
813 bool ApplicationMgr::empty() const {
815 }
816 
817 std::optional<Gaudi::Interfaces::IQueueingEventProcessor::ResultType> ApplicationMgr::pop() {
819 }
820 
823  if ( m_processingMgr ) { return m_processingMgr->createEventContext(); }
824  }
826  ss << "createEventContext: Invalid state \"" << FSMState() << '"';
827  throw GaudiException( ss.str(), name(), StatusCode::FAILURE );
828 }
829 //============================================================================
830 // IEventProcessor implementation: executeRun(int)
831 //============================================================================
835  if ( m_processingMgr ) { return m_processingMgr->executeRun( evtmax ); }
836  log << MSG::WARNING << "No EventLoop Manager specified " << endmsg;
837  return StatusCode::SUCCESS;
838  }
839  log << MSG::FATAL << "executeRun: Invalid state \"" << FSMState() << "\"" << endmsg;
840  return StatusCode::FAILURE;
841 }
842 
843 //============================================================================
844 // IEventProcessor implementation: stopRun(int)
845 //============================================================================
849  if ( m_processingMgr ) { return m_processingMgr->stopRun(); }
850  log << MSG::WARNING << "No EventLoop Manager specified " << endmsg;
851  return StatusCode::SUCCESS;
852  }
853  log << MSG::FATAL << "stopRun: Invalid state \"" << FSMState() << "\"" << endmsg;
854  return StatusCode::FAILURE;
855 }
856 // Implementation of IAppMgrUI::name
857 const std::string& ApplicationMgr::name() const { return m_name; }
858 
859 // implementation of IService::state
861 // implementation of IService::state
863 
864 //============================================================================
865 // implementation of IService::reinitilaize
866 //============================================================================
870  StatusCode sc;
872  throw GaudiException( "Cannot reinitialize application if not INITIALIZED or RUNNING",
873  "ApplicationMgr::reinitialize", StatusCode::FAILURE );
874  }
876  sc = svcManager()->reinitialize();
877  if ( sc.isFailure() ) retval = sc;
878  sc = algManager()->reinitialize();
879  if ( sc.isFailure() ) retval = sc;
880 
882  if ( sc.isFailure() ) retval = sc;
883  sc = m_svcLocator->service( "JobOptionsSvc" )->sysReinitialize();
884  if ( sc.isFailure() ) retval = sc;
885 
886  log << MSG::INFO << "Application Manager Reinitialized successfully" << endmsg;
887 
888  return retval;
889 }
890 
891 //============================================================================
892 // implementation of IService::reinitiaize
893 //============================================================================
896  StatusCode sc;
898  throw GaudiException( "Cannot restart application if not RUNNING", "ApplicationMgr::restart", StatusCode::FAILURE );
899  }
900 
901  sc = svcManager()->restart();
902  if ( sc.isFailure() ) retval = sc;
903  sc = algManager()->restart();
904  if ( sc.isFailure() ) retval = sc;
905 
906  sc = m_messageSvc.as<IService>()->sysRestart();
907  if ( sc.isFailure() ) retval = sc;
908  sc = m_svcLocator->service( "JobOptionsSvc" )->sysRestart();
909  if ( sc.isFailure() ) retval = sc;
910 
911  return retval;
912 }
913 
914 //============================================================================
915 // Handle properties of the event loop manager (Top alg/Output stream list)
916 //============================================================================
918  if ( m_processingMgr ) {
919  auto props = m_processingMgr.as<IProperty>();
920  if ( props ) props->setProperty( p ).ignore();
921  }
922 }
923 
924 //============================================================================
925 // External Service List handler
926 //============================================================================
928  if ( !( decodeCreateSvcNameList() ).isSuccess() ) {
929  throw GaudiException( "Failed to create ext services", "MinimalEventLoopMgr::createSvcNameListHandler",
931  }
932 }
933 //============================================================================
934 // decodeCreateSvcNameList
935 //============================================================================
938  const auto& theNames = m_createSvcNameList.value();
939  auto it = theNames.begin();
940  auto et = theNames.end();
941  while ( result.isSuccess() && it != et ) {
942  Gaudi::Utils::TypeNameString item( *it++ );
943  if ( ( result = svcManager()->addService( item, ServiceManager::DEFAULT_SVC_PRIORITY ) ).isFailure() ) {
945  log << MSG::ERROR << "decodeCreateSvcNameList: Cannot create service " << item.type() << "/" << item.name()
946  << endmsg;
947  } else {
948  ON_DEBUG {
950  log << MSG::DEBUG << "decodeCreateSvcNameList: Created service " << item.type() << "/" << item.name() << endmsg;
951  }
952  }
953  }
954  return result;
955 }
956 
957 //============================================================================
958 // External Service List handler
959 //============================================================================
961  if ( !( decodeExtSvcNameList() ).isSuccess() ) {
962  throw GaudiException( "Failed to declare ext services", "MinimalEventLoopMgr::extSvcNameListHandler",
964  }
965 }
966 
967 //============================================================================
968 // decodeExtSvcNameList
969 //============================================================================
972 
973  const auto& theNames = m_extSvcNameList.value();
974 
975  auto it = theNames.begin();
976  auto et = theNames.end();
977  while ( result.isSuccess() && it != et ) {
978  Gaudi::Utils::TypeNameString item( *it++ );
979  if ( m_extSvcCreates ) {
980  if ( ( result = svcManager()->addService( item, ServiceManager::DEFAULT_SVC_PRIORITY ) ).isFailure() ) {
982  log << MSG::ERROR << "decodeExtSvcNameList: Cannot create service " << item.type() << "/" << item.name()
983  << endmsg;
984  }
985  } else {
986  if ( ( result = svcManager()->declareSvcType( item.name(), item.type() ) ).isFailure() ) {
988  log << MSG::ERROR << "decodeExtSvcNameList: Cannot declare service " << item.type() << "/" << item.name()
989  << endmsg;
990  }
991  }
992  }
993  return result;
994 }
995 
996 //============================================================================
997 // Dll List handler
998 //============================================================================
1000  if ( !( decodeDllNameList() ).isSuccess() ) {
1001  throw GaudiException( "Failed to load DLLs.", "MinimalEventLoopMgr::dllNameListHandler", StatusCode::FAILURE );
1002  }
1003 }
1004 
1005 //============================================================================
1006 // decodeDllNameList
1007 //============================================================================
1009 
1012 
1013  // Clean up multiple entries from DLL list
1014  // -------------------------------------------------------------------------
1015  std::vector<std::string> newList;
1016  std::map<std::string, unsigned int> dllInList, duplicateList;
1017  {
1018  for ( const auto& it : m_dllNameList ) {
1019  if ( 0 == dllInList[it] ) {
1020  newList.push_back( it ); // first instance of this module
1021  } else {
1022  ++duplicateList[it];
1023  } // module listed multiple times
1024  ++dllInList[it]; // increment count for this module
1025  }
1026  }
1027  // m_dllNameList = newList; // update primary list to new, filtered list (do not use the
1028  // property itself otherwise we get called again infinitely)
1029  // List modules that were in there twice..
1030  ON_DEBUG if ( !duplicateList.empty() ) {
1031  log << MSG::DEBUG << "Removed duplicate entries for modules : ";
1032  for ( auto it = duplicateList.begin(); it != duplicateList.end(); ++it ) {
1033  log << it->first << "(" << 1 + it->second << ")";
1034  if ( it != --duplicateList.end() ) log << ", ";
1035  }
1036  log << endmsg;
1037  }
1038  // -------------------------------------------------------------------------
1039 
1040  const std::vector<std::string>& theNames = newList;
1041 
1042  // only load the new dlls or previously failed dlls
1043  ON_DEBUG log << MSG::DEBUG << "Loading declared DLL's" << endmsg;
1044 
1045  std::vector<std::string> successNames, failNames;
1046  for ( const auto& it : theNames ) {
1047  if ( std::find( m_okDlls.rbegin(), m_okDlls.rend(), it ) == m_okDlls.rend() ) {
1048  // found a new module name
1049  StatusCode status = m_classManager->loadModule( it );
1050  if ( status.isFailure() ) {
1051  failNames.push_back( it );
1052  result = StatusCode::FAILURE;
1053  } else {
1054  successNames.push_back( it );
1055  }
1056  }
1057  }
1058 
1059  // report back to the user and store the names of the succesfully loaded dlls
1060  if ( !successNames.empty() ) {
1061  log << MSG::INFO << "Successfully loaded modules : ";
1062  for ( auto it = successNames.begin(); it != successNames.end(); it++ ) {
1063  log << ( *it );
1064  if ( ( it + 1 ) != successNames.end() ) log << ", ";
1065  // save name
1066  m_okDlls.push_back( *it );
1067  }
1068  log << endmsg;
1069  }
1070 
1071  if ( result == StatusCode::FAILURE ) {
1072  log << MSG::WARNING << "Failed to load modules: ";
1073  for ( auto it = failNames.begin(); it != failNames.end(); it++ ) {
1074  log << ( *it );
1075  if ( ( it + 1 ) != failNames.end() ) log << ", ";
1076  }
1077  log << endmsg;
1078  }
1079  return result;
1080 }
1081 
1083  resetMessaging();
1084  for ( auto& mgrItem : m_managers ) { mgrItem.second->outputLevelUpdate(); }
1085 }
1086 
1087 namespace {
1089  void printAlgsSequencesHelper( SmartIF<IAlgManager>& algmgr, const std::string& algname, MsgStream& log,
1090  int indent ) {
1092  log << MSG::ALWAYS;
1093  for ( int i = 0; i < indent; ++i ) log << " ";
1094  log << algname << endmsg;
1095  auto prop = algmgr->algorithm<IProperty>( algname, false );
1096  if ( prop ) {
1097  // Try to get the property Members
1098  Gaudi::Property<std::vector<std::string>> p( "Members", {} );
1099  if ( prop->getProperty( &p ).isSuccess() ) {
1100  for ( auto& subalgname : p.value() ) { printAlgsSequencesHelper( algmgr, subalgname, log, indent + 1 ); }
1101  }
1102  } else {
1103  log << MSG::WARNING << "Cannot get properties of " << algname << endmsg;
1104  }
1105  }
1106 } // namespace
1107 
1110  log << MSG::ALWAYS << "****************************** Algorithm Sequence ****************************" << endmsg;
1111  for ( auto& algname : m_topAlgNameList ) { printAlgsSequencesHelper( algManager(), algname, log, 0 ); }
1112  log << MSG::ALWAYS << "******************************************************************************" << endmsg;
1113 }
ApplicationMgr::printAlgsSequences
void printAlgsSequences()
Print the sequence of algorithms that have been loaded.
Definition: ApplicationMgr.cpp:1108
Gaudi::ReturnCode::Success
constexpr int Success
Definition: AppReturnCode.h:26
MSG::DEBUG
@ DEBUG
Definition: IMessageSvc.h:25
IService
Definition: IService.h:28
Gaudi::Details::PropertyBase
PropertyBase base class allowing PropertyBase* collections to be "homogeneous".
Definition: PropertyBase.h:35
Gaudi::Details::PropertyBase::name
const std::string name() const
property name
Definition: PropertyBase.h:39
Gaudi::Interfaces::IQueueingEventProcessor::pop
virtual std::optional< ResultType > pop()=0
Get the next available result.
Gaudi::ReturnCode::FinalizationFailure
constexpr int FinalizationFailure
Error codes for operation failures.
Definition: AppReturnCode.h:42
IService.h
std::string
STL class.
ApplicationMgr::m_propertiesPrint
Gaudi::Property< bool > m_propertiesPrint
Definition: ApplicationMgr.h:296
IMessageSvc
Definition: IMessageSvc.h:47
Gaudi::Utils::TypeNameString::name
const std::string & name() const
Definition: TypeNameString.h:49
Gaudi.Configuration.log
log
Definition: Configuration.py:28
ApplicationMgr::empty
bool empty() const override
Definition: ApplicationMgr.cpp:813
std::move
T move(T... args)
ApplicationMgr::decodeDllNameList
StatusCode decodeDllNameList()
Definition: ApplicationMgr.cpp:1008
CommonMessaging< implements< IAppMgrUI, Gaudi::Interfaces::IQueueingEventProcessor, IService, IStateful, INamedInterface, IProperty > >::resetMessaging
MSG::Level resetMessaging()
Reinitialize internal states.
Definition: CommonMessaging.h:179
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:314
MSG::INFO
@ INFO
Definition: IMessageSvc.h:25
ApplicationMgr::outputLevelUpdate
void outputLevelUpdate() override
Function to call to update the outputLevel of the components (after a change in MessageSvc).
Definition: ApplicationMgr.cpp:1082
System.h
ApplicationMgr::run
StatusCode run() override
Definition: ApplicationMgr.cpp:773
ApplicationMgr::m_runable
SmartIF< IRunable > m_runable
Reference to the runable object.
Definition: ApplicationMgr.h:230
GaudiException.h
ApplicationMgr::i_startup
StatusCode i_startup()
Internal startup routine.
Definition: ApplicationMgr.cpp:150
ApplicationMgr::stop
StatusCode stop() override
Definition: ApplicationMgr.cpp:543
ApplicationMgr::m_name
std::string m_name
Name.
Definition: ApplicationMgr.h:221
System::getEnv
GAUDI_API std::string getEnv(const char *var)
get a particular environment variable (returning "UNKNOWN" if not set)
Definition: System.cpp:390
ApplicationMgr::m_messageSvcType
Gaudi::Property< std::string > m_messageSvcType
Definition: ApplicationMgr.h:216
std::vector< std::string >
std::find
T find(T... args)
PropertyHolder< CommonMessaging< implements< IAppMgrUI, Gaudi::Interfaces::IQueueingEventProcessor, IService, IStateful, INamedInterface, IProperty > > >::setProperty
StatusCode setProperty(const Gaudi::Details::PropertyBase &p)
Set the property from a property.
Definition: IProperty.h:39
check_ParticleID.props
props
Definition: check_ParticleID.py:21
GAUDI_MINOR_VERSION
#define GAUDI_MINOR_VERSION
Definition: GAUDI_VERSION.h:9
ApplicationMgr::name
const std::string & name() const override
Definition: ApplicationMgr.cpp:857
GaudiException
Definition: GaudiException.h:31
ApplicationMgr::FSMState
Gaudi::StateMachine::State FSMState() const override
Definition: ApplicationMgr.cpp:860
ApplicationMgr::sysStop
StatusCode sysStop() override
Definition: ApplicationMgr.h:105
ApplicationMgr::m_stopOnSignal
Gaudi::Property< bool > m_stopOnSignal
Property to enable/disable the "stop on signal" service.
Definition: ApplicationMgr.h:293
GaudiMP.FdsRegistry.msg
msg
Definition: FdsRegistry.py:19
ServiceManager
Definition: ServiceManager.h:46
System::setEnv
GAUDI_API int setEnv(const std::string &name, const std::string &value, int overwrite=1)
Set an environment variables.
Definition: System.cpp:503
std::stringstream
STL class.
ServiceManager.h
MSG::WARNING
@ WARNING
Definition: IMessageSvc.h:25
ApplicationMgr::m_okDlls
std::vector< std::string > m_okDlls
names of successfully loaded dlls
Definition: ApplicationMgr.h:313
ApplicationMgr::createEventContext
EventContext createEventContext() override
implementation of IEventProcessor::createEventContext()
Definition: ApplicationMgr.cpp:821
AlgorithmManager.h
System::typeinfoName
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:315
ObjectFactory.h
StatusCode.h
ApplicationMgr::i_delegateToEvtProc
static auto i_delegateToEvtProc(SELF *self, PIMPL &member, std::string_view method_name, METHOD &&method, ARGS &&... args)
Helper to delegate calls to event processor implementation.
Definition: ApplicationMgr.h:317
ApplicationMgr::terminate
StatusCode terminate() override
Definition: ApplicationMgr.cpp:625
IMessageSvc.h
ApplicationMgr::executeRun
StatusCode executeRun(int evtmax) override
implementation of IEventProcessor::executeRun(int)
Definition: ApplicationMgr.cpp:832
ApplicationMgr::finalize
StatusCode finalize() override
Definition: ApplicationMgr.cpp:578
PropertyHolder< CommonMessaging< implements< IAppMgrUI, Gaudi::Interfaces::IQueueingEventProcessor, IService, IStateful, INamedInterface, IProperty > > >::bindPropertiesTo
void bindPropertiesTo(Gaudi::Interfaces::IOptionsSvc &optsSvc)
Definition: PropertyHolder.h:252
ApplicationMgr::m_jobOptionsSvcType
Gaudi::Property< std::string > m_jobOptionsSvcType
Definition: ApplicationMgr.h:218
ApplicationMgr::nextEvent
StatusCode nextEvent(int maxevt) override
Definition: ApplicationMgr.cpp:526
ApplicationMgr::ApplicationMgr
ApplicationMgr(IInterface *=nullptr)
Definition: ApplicationMgr.cpp:87
PropertyHolder< CommonMessaging< implements< IAppMgrUI, Gaudi::Interfaces::IQueueingEventProcessor, IService, IStateful, INamedInterface, IProperty > > >::property
Gaudi::Details::PropertyBase * property(std::string_view name) const
\fixme property and bindPropertiesTo should be protected
Definition: PropertyHolder.h:238
ApplicationMgr::createSvcNameListHandler
void createSvcNameListHandler(Gaudi::Details::PropertyBase &)
Definition: ApplicationMgr.cpp:927
AlgorithmManager
Definition: AlgorithmManager.h:42
std::vector::push_back
T push_back(T... args)
DLLClassManager
Definition: DLLClassManager.h:38
PropertyHolder< CommonMessaging< implements< IAppMgrUI, Gaudi::Interfaces::IQueueingEventProcessor, IService, IStateful, INamedInterface, IProperty > > >::getProperties
const std::vector< Gaudi::Details::PropertyBase * > & getProperties() const override
get all properties
Definition: PropertyHolder.h:222
ApplicationMgr::svcManager
SmartIF< ISvcManager > & svcManager()
Definition: ApplicationMgr.h:136
ApplicationMgr::m_dllNameList
Gaudi::Property< std::vector< std::string > > m_dllNameList
Definition: ApplicationMgr.h:247
IProperty
Definition: IProperty.h:33
GAUDI_VERSION.h
Gaudi::StateMachine::State
State
Allowed states for classes implementing the state machine (ApplicationMgr, Algorithm,...
Definition: StateMachine.h:22
SmartIF.h
ApplicationMgr::dllNameListHandler
void dllNameListHandler(Gaudi::Details::PropertyBase &theProp)
Definition: ApplicationMgr.cpp:999
Gaudi::Utils::TypeNameString
Helper class to parse a string of format "type/name".
Definition: TypeNameString.h:20
ApplicationMgr::m_returnCode
Gaudi::Property< int > m_returnCode
Property to record the error conditions occurring during the running.
Definition: ApplicationMgr.h:300
Gaudi::Time::format
std::string format(bool local, std::string spec="%c") const
Format the time using strftime.
Definition: Time.cpp:262
Gaudi::StateMachine::CONFIGURED
@ CONFIGURED
Definition: StateMachine.h:24
GaudiPython.Pythonizations.ctx
ctx
Definition: Pythonizations.py:578
StatusCode
Definition: StatusCode.h:65
gaudirun.opts
opts
Definition: gaudirun.py:336
Message
Definition: Message.h:26
ApplicationMgr::restart
StatusCode restart() override
Definition: ApplicationMgr.cpp:894
ApplicationMgr::configure
StatusCode configure() override
Definition: ApplicationMgr.cpp:271
IInterface::interfaceID
static const InterfaceID & interfaceID()
Return an instance of InterfaceID identifying the interface.
Definition: IInterface.h:248
DLLClassManager.h
ProduceConsume.j
j
Definition: ProduceConsume.py:104
ApplicationMgr::m_jobOptionsPostAction
Gaudi::Property< std::string > m_jobOptionsPostAction
Definition: ApplicationMgr.h:252
Gaudi::StateMachine::OFFLINE
@ OFFLINE
Definition: StateMachine.h:23
std::string::c_str
T c_str(T... args)
Gaudi::Interfaces::IQueueingEventProcessor::push
virtual void push(EventContext &&ctx)=0
Schedule the processing of an event.
Gaudi::Property::declareUpdateHandler
Details::PropertyBase & declareUpdateHandler(std::function< void(Details::PropertyBase &)> fun) override
set new callback for update
Definition: Property.h:144
ApplicationMgr::m_jobOptionsPreAction
Gaudi::Property< std::string > m_jobOptionsPreAction
Definition: ApplicationMgr.h:250
ApplicationMgr::pop
std::optional< Gaudi::Interfaces::IQueueingEventProcessor::ResultType > pop() override
Definition: ApplicationMgr.cpp:817
Gaudi::Property::value
const ValueType & value() const
Definition: Property.h:237
Gaudi::ReturnCode::ScheduledStop
constexpr int ScheduledStop
Definition: AppReturnCode.h:35
ApplicationMgr::m_svcLocator
SmartIF< ISvcLocator > m_svcLocator
Reference to its own service locator (must be instantiated prior to any service!)
Definition: ApplicationMgr.h:189
ApplicationMgr::m_appVersion
Gaudi::Property< std::string > m_appVersion
Definition: ApplicationMgr.h:261
ApplicationMgr::sysReinitialize
StatusCode sysReinitialize() override
Definition: ApplicationMgr.h:109
ApplicationMgr::m_jobOptionsType
Gaudi::Property< std::string > m_jobOptionsType
Definition: ApplicationMgr.h:248
ApplicationMgr::sysRestart
StatusCode sysRestart() override
Definition: ApplicationMgr.h:111
ON_DEBUG
#define ON_DEBUG
Definition: ApplicationMgr.cpp:40
ApplicationMgr::executeEvent
StatusCode executeEvent(EventContext &&ctx) override
implementation of IEventProcessor::executeEvent(void*)
Definition: ApplicationMgr.cpp:799
SmartIF< IAlgManager >
ApplicationMgr::m_runableType
Gaudi::Property< std::string > m_runableType
Definition: ApplicationMgr.h:254
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202
System::isEnvSet
GAUDI_API bool isEnvSet(const char *var)
Check if an environment variable is set or not.
Definition: System.cpp:410
ApplicationMgr::targetFSMState
Gaudi::StateMachine::State targetFSMState() const override
Definition: ApplicationMgr.cpp:862
std::map< std::string, unsigned int >
ApplicationMgr::m_topAlgNameList
Gaudi::Property< std::vector< std::string > > m_topAlgNameList
Definition: ApplicationMgr.h:208
gaudirun.level
level
Definition: gaudirun.py:364
ApplicationMgr::m_processingMgr
SmartIF< IEventProcessor > m_processingMgr
Reference to processing manager object.
Definition: ApplicationMgr.h:231
Gaudi::StateMachine::RUNNING
@ RUNNING
Definition: StateMachine.h:26
MsgStream
Definition: MsgStream.h:33
ApplicationMgr::m_svcMapping
Gaudi::Property< std::vector< std::string > > m_svcMapping
Definition: ApplicationMgr.h:225
TypeNameString.h
MSG::FATAL
@ FATAL
Definition: IMessageSvc.h:25
Gaudi::Utils::TypeNameString::type
const std::string & type() const
Definition: TypeNameString.h:48
ApplicationMgr::m_svcOptMapping
Gaudi::Property< std::vector< std::string > > m_svcOptMapping
Definition: ApplicationMgr.h:226
ApplicationMgr::decodeExtSvcNameList
StatusCode decodeExtSvcNameList()
Definition: ApplicationMgr.cpp:970
gaudiComponentHelp.properties
properties
Definition: gaudiComponentHelp.py:68
ApplicationMgr::m_extSvcNameList
Gaudi::Property< std::vector< std::string > > m_extSvcNameList
Definition: ApplicationMgr.h:242
ApplicationMgr::m_eventLoopMgr
Gaudi::Property< std::string > m_eventLoopMgr
Definition: ApplicationMgr.h:255
std::vector::rend
T rend(T... args)
StatusCode::ignore
const StatusCode & ignore() const
Allow discarding a StatusCode without warning.
Definition: StatusCode.h:139
SmartIF::as
SmartIF< IFace > as() const
return a new SmartIF instance to another interface
Definition: SmartIF.h:117
ApplicationMgr::m_extSvcCreates
Gaudi::Property< bool > m_extSvcCreates
Definition: ApplicationMgr.h:244
ApplicationMgr::m_useMessageSvcForROOTMessages
Gaudi::Property< bool > m_useMessageSvcForROOTMessages
Definition: ApplicationMgr.h:306
StatusCode::isFailure
bool isFailure() const
Definition: StatusCode.h:129
ApplicationMgr::m_createSvcNameList
Gaudi::Property< std::vector< std::string > > m_createSvcNameList
Definition: ApplicationMgr.h:276
ApplicationMgr::m_actHistory
Gaudi::Property< bool > m_actHistory
Definition: ApplicationMgr.h:262
MSG::Level
Level
Definition: IMessageSvc.h:25
ApplicationMgr::serviceLocator
SmartIF< ISvcLocator > & serviceLocator() const override
Needed to locate the message service.
Definition: ApplicationMgr.h:149
PropertyHolder< CommonMessaging< implements< IAppMgrUI, Gaudi::Interfaces::IQueueingEventProcessor, IService, IStateful, INamedInterface, IProperty > > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Details::PropertyBase &prop)
Declare a property.
Definition: PropertyHolder.h:106
MSG::VERBOSE
@ VERBOSE
Definition: IMessageSvc.h:25
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:100
std::endl
T endl(T... args)
ApplicationMgr::decodeCreateSvcNameList
StatusCode decodeCreateSvcNameList()
Definition: ApplicationMgr.cpp:936
IRunable.h
SmartIF::get
TYPE * get() const
Get interface pointer.
Definition: SmartIF.h:86
ApplicationMgr::m_appName
Gaudi::Property< std::string > m_appName
Definition: ApplicationMgr.h:260
MSG::ALWAYS
@ ALWAYS
Definition: IMessageSvc.h:25
ApplicationMgr.h
std::map::begin
T begin(T... args)
Time.h
ApplicationMgr
Definition: ApplicationMgr.h:57
ApplicationMgr::stopRun
StatusCode stopRun() override
implementation of IEventProcessor::stopRun()
Definition: ApplicationMgr.cpp:846
MSG::NIL
@ NIL
Definition: IMessageSvc.h:25
Gaudi::StateMachine::INITIALIZED
@ INITIALIZED
Definition: StateMachine.h:25
MSG::ERROR
@ ERROR
Definition: IMessageSvc.h:25
Gaudi::Time::current
static Time current()
Returns the current time.
Definition: Time.cpp:119
IInterface
Definition: IInterface.h:239
ApplicationMgr::evtLoopPropertyHandler
void evtLoopPropertyHandler(Gaudi::Details::PropertyBase &theProp)
Definition: ApplicationMgr.cpp:917
compareRootHistos.retval
retval
Definition: compareRootHistos.py:499
EventContext
Definition: EventContext.h:34
ApplicationMgr::m_queueingProcessor
SmartIF< IQueueingEventProcessor > m_queueingProcessor
Reference to a queueing processing manager object.
Definition: ApplicationMgr.h:233
ApplicationMgr::m_outputLevel
Gaudi::Property< int > m_outputLevel
Definition: ApplicationMgr.h:259
ApplicationMgr::queryInterface
StatusCode queryInterface(const InterfaceID &iid, void **pinterface) override
Definition: ApplicationMgr.cpp:124
ApplicationMgr::m_messageSvc
SmartIF< IMessageSvc > m_messageSvc
Reference to the message service.
Definition: ApplicationMgr.h:229
ApplicationMgr::m_managers
ManagersMap m_managers
Map of known component managers.
Definition: ApplicationMgr.h:178
std::string::empty
T empty(T... args)
ApplicationMgr::m_state
Gaudi::StateMachine::State m_state
Internal State.
Definition: ApplicationMgr.h:222
ApplicationMgr::sysStart
StatusCode sysStart() override
Definition: ApplicationMgr.h:103
ApplicationMgr::m_jobOptionsPath
Gaudi::Property< std::string > m_jobOptionsPath
Definition: ApplicationMgr.h:249
ApplicationMgr::m_printAlgsSequence
Gaudi::Property< bool > m_printAlgsSequence
Definition: ApplicationMgr.h:303
std::stringstream::str
T str(T... args)
System::hostName
GAUDI_API const std::string & hostName()
Host name.
Definition: System.cpp:320
ApplicationMgr::extSvcNameListHandler
void extSvcNameListHandler(Gaudi::Details::PropertyBase &theProp)
Definition: ApplicationMgr.cpp:960
std::map::end
T end(T... args)
ApplicationMgr::GoToState
StatusCode GoToState(Gaudi::StateMachine::State state, bool ignoreFailures=false)
Reach a state from current state (whichever it is) going through the correct transitions.
Definition: ApplicationMgr.cpp:687
InterfaceID
Definition: IInterface.h:39
GAUDI_MAJOR_VERSION
#define GAUDI_MAJOR_VERSION
Definition: GAUDI_VERSION.h:8
ApplicationMgr::reinitialize
StatusCode reinitialize() override
Definition: ApplicationMgr.cpp:867
ApplicationMgr::m_loopCheck
Gaudi::Property< bool > m_loopCheck
Definition: ApplicationMgr.h:287
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
Gaudi::Interfaces::IQueueingEventProcessor::empty
virtual bool empty() const =0
Tell if the processor has events in the queues.
ApplicationMgr::m_environment
Gaudi::Property< std::map< std::string, std::string > > m_environment
Definition: ApplicationMgr.h:284
compareRootHistos.state
state
Definition: compareRootHistos.py:496
AlgorithmManager::typeAliases
AlgTypeAliasesMap & typeAliases()
Definition: AlgorithmManager.h:92
DECLARE_OBJECT_FACTORY
#define DECLARE_OBJECT_FACTORY(x)
Definition: ObjectFactory.h:25
ApplicationMgr::algManager
SmartIF< IAlgManager > & algManager()
Definition: ApplicationMgr.h:142
std::numeric_limits
Gaudi::Property< std::string >
ApplicationMgr::m_classManager
SmartIF< DLLClassManager > m_classManager
Reference to the class manager.
Definition: ApplicationMgr.h:191
ApplicationMgr::push
void push(EventContext &&ctx) override
Definition: ApplicationMgr.cpp:808
ApplicationMgr::start
StatusCode start() override
Definition: ApplicationMgr.cpp:492
ON_VERBOSE
#define ON_VERBOSE
Definition: ApplicationMgr.cpp:41
std::vector::rbegin
T rbegin(T... args)
MsgStream.h
Message.h
ApplicationMgr::m_targetState
Gaudi::StateMachine::State m_targetState
Internal State.
Definition: ApplicationMgr.h:223
ApplicationMgr::initialize
StatusCode initialize() override
Definition: ApplicationMgr.cpp:440
IProperty::setProperty
StatusCode setProperty(const Gaudi::Details::PropertyBase &p)
Set the property from a property.
Definition: IProperty.h:39
GAUDI_PATCH_VERSION
#define GAUDI_PATCH_VERSION
Definition: GAUDI_VERSION.h:10