Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v29r3 (fa547fc2)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
ApplicationMgr.cpp
Go to the documentation of this file.
1 // Include files
2 #include "ApplicationMgr.h"
3 #include "AlgorithmManager.h"
4 #include "DLLClassManager.h"
5 #include "ServiceManager.h"
6 
9 #include "GaudiKernel/IRunable.h"
10 #include "GaudiKernel/IService.h"
12 
13 #include "GaudiKernel/MsgStream.h"
15 #include "GaudiKernel/SmartIF.h"
16 
19 
20 #include "GaudiKernel/StatusCode.h"
21 #include "GaudiKernel/System.h"
22 #include "GaudiKernel/Time.h"
23 
24 #include "GaudiCoreSvcVersion.h"
25 
26 using System::getEnv;
27 using System::isEnvSet;
28 
29 #include <algorithm>
30 #include <cassert>
31 #include <ctime>
32 #include <limits>
33 
34 #define ON_DEBUG if ( UNLIKELY( m_outputLevel <= MSG::DEBUG ) )
35 #define ON_VERBOSE if ( UNLIKELY( m_outputLevel <= MSG::VERBOSE ) )
36 
38 
39 // Implementation class for the Application Manager. In this way the
40 // ApplicationMgr class is a fully insulated concrete class. Clients
41 // (main programs) will not need to re-compile if there are changes
42 // in the implementation
43 
44 //=======================================================================
45 // Constructor
46 //=======================================================================
48 {
49  // IInterface initialization
50  addRef(); // Initial count set to 1
51 
52  // Instantiate component managers
53  m_managers[IService::interfaceID().id()] = new ServiceManager( this );
54 
55  m_svcLocator = svcManager();
56 
57  // Instantiate internal services
58  // SvcLocator/Factory HAS to be already instantiated
59  m_classManager = new DLLClassManager( this );
60 
61  AlgorithmManager* algMgr = new AlgorithmManager( this );
62  m_managers[IAlgorithm::interfaceID().id()] = algMgr;
63  // m_managers[IAlgorithm::interfaceID().id()] = new HiveAlgorithmManager(this);
64 
65  // This property is not hosted in the ApplicationMgr instance
66  declareProperty( "AlgTypeAliases", algMgr->typeAliases(),
67  "Aliases of algorithm types, to replace an algorithm type for every instance" );
68 
69  // Add action handlers to the appropriate properties
76  // ServiceMgr Initialization loop checking
78  svcManager()->setLoopCheckEnabled( m_loopCheck );
79 
80  m_svcMapping = {"EvtDataSvc/EventDataSvc",
81  "DetDataSvc/DetectorDataSvc",
82  "HistogramSvc/HistogramDataSvc",
83  "HbookCnv::PersSvc/HbookHistSvc",
84  "RootHistCnv::PersSvc/RootHistSvc",
85  "EvtPersistencySvc/EventPersistencySvc",
86  "DetPersistencySvc/DetectorPersistencySvc",
87  "HistogramPersistencySvc/HistogramPersistencySvc"};
88 }
89 
90 //============================================================================
91 // IInterface implementation: queryInterface::addRef()
92 //============================================================================
94 {
95  if ( !ppvi ) {
96  return StatusCode::FAILURE;
97  }
98 
99  // try to find own/direct interfaces:
100  StatusCode sc = base_class::queryInterface( iid, ppvi );
101  if ( sc.isSuccess() ) return sc;
102 
103  // find indirect interfaces :
104  if ( ISvcLocator::interfaceID().versionMatch( iid ) ) {
105  return serviceLocator()->queryInterface( iid, ppvi );
106  }
107  if ( ISvcManager::interfaceID().versionMatch( iid ) ) {
108  return svcManager()->queryInterface( iid, ppvi );
109  }
110  if ( IAlgManager::interfaceID().versionMatch( iid ) ) {
111  return algManager()->queryInterface( iid, ppvi );
112  }
113  if ( IClassManager::interfaceID().versionMatch( iid ) ) {
114  return m_classManager->queryInterface( iid, ppvi );
115  }
116  if ( IMessageSvc::interfaceID().versionMatch( iid ) ) {
117  *ppvi = reinterpret_cast<void*>( m_messageSvc.get() );
118  if ( m_messageSvc ) m_messageSvc->addRef();
119  // Note that 0 can be a valid IMessageSvc pointer value (when used for
120  // MsgStream).
121  return StatusCode::SUCCESS;
122  }
123  *ppvi = nullptr;
124  return StatusCode::FAILURE;
125 }
126 
127 //============================================================================
128 // ApplicationMgr::i_startup()
129 //============================================================================
131 {
132 
133  StatusCode sc;
134 
135  // declare factories in current module
137 
138  // Note: we cannot use CommonMessaging methods here because MessageSvc is not there yet
139  MsgStream log( nullptr, name() );
140 
141  // Create the Message service
142  auto msgsvc = svcManager()->createService( Gaudi::Utils::TypeNameString( "MessageSvc", m_messageSvcType ) );
143  if ( !msgsvc ) {
144  log << MSG::FATAL << "Error creating MessageSvc of type " << m_messageSvcType << endmsg;
145  return StatusCode::FAILURE;
146  }
147  // Get the useful interface from Message services
148  m_messageSvc = m_svcLocator->service( "MessageSvc" );
149  if ( !m_messageSvc ) {
150  log << MSG::FATAL << "Error retrieving MessageSvc." << endmsg;
151  return StatusCode::FAILURE;
152  }
153 
154  auto jobsvc = svcManager()->createService( Gaudi::Utils::TypeNameString( "JobOptionsSvc", m_jobOptionsSvcType ) );
155  // Create the Job Options service
156  if ( !jobsvc ) {
157  log << MSG::FATAL << "Error creating JobOptionsSvc" << endmsg;
158  return StatusCode::FAILURE;
159  }
160  // Get the useful interface from Message services
161  m_jobOptionsSvc = m_svcLocator->service( "JobOptionsSvc" );
162  if ( !m_jobOptionsSvc ) {
163  log << MSG::FATAL << "Error retrieving JobOptionsSvc." << endmsg;
164  return StatusCode::FAILURE;
165  }
166 
167  auto jobOptsIProp = jobsvc.as<IProperty>();
168  if ( !jobOptsIProp ) {
169  log << MSG::FATAL << "Error locating JobOptionsSvc" << endmsg;
170  return StatusCode::FAILURE;
171  }
172  sc = jobOptsIProp->setProperty( Gaudi::Property<std::string>( "TYPE", m_jobOptionsType ) );
173  if ( !sc.isSuccess() ) {
174  log << MSG::FATAL << "Error setting TYPE option in JobOptionsSvc" << endmsg;
175  return sc;
176  }
177 
178  if ( !m_jobOptionsPreAction.empty() ) {
179  sc = jobOptsIProp->setProperty( Gaudi::Property<std::string>( "PYTHONPARAMS", m_jobOptionsPreAction ) );
180  if ( !sc.isSuccess() ) {
181  log << MSG::FATAL << "Error setting JobOptionsPreAction option in JobOptionsSvc" << endmsg;
182  return sc;
183  }
184  }
185 
186  if ( !m_jobOptionsPostAction.empty() ) {
187  sc = jobOptsIProp->setProperty( Gaudi::Property<std::string>( "PYTHONACTION", m_jobOptionsPostAction ) );
188  if ( !sc.isSuccess() ) {
189  log << MSG::FATAL << "Error setting JobOptionsPostAction option in JobOptionsSvc" << endmsg;
190  return sc;
191  }
192  }
193 
194  if ( !m_jobOptionsPath.empty() ) { // The command line takes precedence
195  sc = jobOptsIProp->setProperty( Gaudi::Property<std::string>( "PATH", m_jobOptionsPath ) );
196  if ( !sc.isSuccess() ) {
197  log << MSG::FATAL << "Error setting PATH option in JobOptionsSvc" << endmsg;
198  return sc;
199  }
200  } else if ( isEnvSet( "JOBOPTPATH" ) ) { // Otherwise the Environment JOBOPTPATH
201  sc = jobOptsIProp->setProperty( Gaudi::Property<std::string>( "PATH", getEnv( "JOBOPTPATH" ) ) );
202  if ( !sc.isSuccess() ) {
203  log << MSG::FATAL << "Error setting PATH option in JobOptionsSvc from env" << endmsg;
204  return sc;
205  }
206  } else { // Otherwise the default
207  sc = jobOptsIProp->setProperty( Gaudi::Property<std::string>( "PATH", "../options/job.opts" ) );
208  if ( !sc.isSuccess() ) {
209  log << MSG::FATAL << "Error setting PATH option in JobOptionsSvc to default" << endmsg;
210  return sc;
211  }
212  }
213  jobOptsIProp.reset();
214 
215  // Sets my default the Output Level of the Message service to be
216  // the same as this
217  auto msgSvcIProp = msgsvc.as<IProperty>();
218  msgSvcIProp->setProperty( Gaudi::Property<int>( "OutputLevel", m_outputLevel ) ).ignore();
219  msgSvcIProp.reset();
220 
221  sc = jobsvc->sysInitialize();
222  if ( !sc.isSuccess() ) {
223  log << MSG::FATAL << "Error initializing JobOptionsSvc" << endmsg;
224  return sc;
225  }
226  sc = msgsvc->sysInitialize();
227  if ( !sc.isSuccess() ) {
228  log << MSG::FATAL << "Error initializing MessageSvc" << endmsg;
229  return sc;
230  }
231 
232  // Make sure output level caches are up to date.
234 
235  return sc;
236 }
237 
238 //============================================================================
239 // IAppMgrUI implementation: ApplicationMgr::configure()
240 //============================================================================
242 {
243 
244  // Check if the state is compatible with the transition
245  MsgStream tlog( m_messageSvc, name() );
247  tlog << MSG::INFO << "Already Configured" << endmsg;
248  return StatusCode::SUCCESS;
249  }
251  tlog << MSG::FATAL << "configure: Invalid state \"" << m_state << "\"" << endmsg;
252  return StatusCode::FAILURE;
253  }
255 
256  // Reset application return code.
258 
259  StatusCode sc;
260  sc = i_startup();
261  if ( !sc.isSuccess() ) {
262  return sc;
263  }
264 
266 
267  // Get my own options using the Job options service
268  if ( log.level() <= MSG::DEBUG ) log << MSG::DEBUG << "Getting my own properties" << endmsg;
269  sc = m_jobOptionsSvc->setMyProperties( name(), this );
270  if ( !sc.isSuccess() ) {
271  log << MSG::WARNING << "Problems getting my properties from JobOptionsSvc" << endmsg;
272  return sc;
273  }
274 
275  // Check current outputLevel to eventually inform the MessageSvc
276  if ( m_outputLevel != MSG::NIL && !m_appName.empty() ) {
277  assert( m_messageSvc );
279  // Print a welcome message
280  log << MSG::ALWAYS << std::endl
281  << "=================================================================="
282  << "==================================================================" << std::endl
283  << " "
284  << " Welcome to " << m_appName.value();
285 
286  if ( !m_appVersion.empty() ) {
287  log << MSG::ALWAYS << " version " << m_appVersion.value();
288  } else {
289  log << MSG::ALWAYS << " (GaudiCoreSvc "
290  << "v" << GAUDICORESVC_MAJOR_VERSION << "r" << GAUDICORESVC_MINOR_VERSION
291 #if GAUDICORESVC_PATCH_VERSION
292  << "p" << GAUDICORESVC_PATCH_VERSION
293 #endif
294  << ")";
295  }
296 
297  // Add the host name and current time to the message
298  log << MSG::ALWAYS << std::endl
299  << " "
300  << " running on " << System::hostName() << " on " << Gaudi::Time::current().format( true ) << std::endl
301  << "=================================================================="
302  << "==================================================================" << endmsg;
303  }
304 
305  // print all own properties if the options "PropertiesPrint" is set to true
306  if ( m_propertiesPrint ) {
307  const auto& properties = getProperties();
308  log << MSG::ALWAYS << "List of ALL properties of " << System::typeinfoName( typeid( *this ) ) << "/" << this->name()
309  << " #properties = " << properties.size() << endmsg;
310  for ( const auto& property : properties ) {
311  log << "Property ['Name': Value] = " << *property << endmsg;
312  }
313  }
314 
315  // Check if StatusCode need to be checked
316  if ( m_codeCheck ) {
318  sc = addMultiSvc( "StatusCodeSvc", -9999 );
319  if ( sc.isFailure() ) {
320  log << MSG::FATAL << "Error adding StatusCodeSvc for multiple threads" << endmsg;
321  return StatusCode::FAILURE;
322  }
323  } else {
325  }
326 
327  // set the requested environment variables
328  for ( auto& var : m_environment ) {
329  const std::string& name = var.first;
330  const std::string& value = var.second;
331  std::string old = System::getEnv( name.c_str() );
332  const MSG::Level lvl = ( !old.empty() && ( old != "UNKNOWN" ) ) ? MSG::WARNING : MSG::DEBUG;
333  if ( UNLIKELY( m_outputLevel <= lvl ) ) log << lvl << "Setting " << name << " = " << value << endmsg;
334  System::setEnv( name, value );
335  }
336 
337  // Declare Service Types
338  for ( auto& j : m_svcMapping ) {
340  if ( declareMultiSvcType( itm.name(), itm.type() ).isFailure() ) {
341  log << MSG::ERROR << "configure: declaring svc type:'" << j << "' failed." << endmsg;
342  return StatusCode::FAILURE;
343  }
344  }
345  for ( auto& j : m_svcOptMapping ) {
347  if ( declareMultiSvcType( itm.name(), itm.type() ).isFailure() ) {
348  log << MSG::ERROR << "configure: declaring svc type:'" << j << "' failed." << endmsg;
349  return StatusCode::FAILURE;
350  }
351  }
352 
353  //--------------------------------------------------------------------------
354  // Declare other Services and Algorithms by loading DLL's
355  sc = decodeDllNameList();
356  if ( sc.isFailure() ) {
357  log << MSG::ERROR << "Failure loading declared DLL's" << endmsg;
358  return sc;
359  }
360 
361  //--------------------------------------------------------------------------
362  // Deal with the services explicitly declared by the user.
363  sc = decodeExtSvcNameList();
364  if ( sc.isFailure() ) {
365  log << MSG::ERROR << "Failure during external service association" << endmsg;
366  return sc;
367  }
368 
370  if ( sc.isFailure() ) {
371  log << MSG::ERROR << "Failure during multi thread service creation" << endmsg;
372  return sc;
373  }
374 
376  if ( sc.isFailure() ) {
377  log << MSG::ERROR << "Failure during external service creation" << endmsg;
378  return sc;
379  }
380 
381  //--------------------------------------------------------------------------
382  // Retrieve intrinsic services. If needed configure them.
383  //--------------------------------------------------------------------------
384  const Gaudi::Utils::TypeNameString evtloop_item( m_eventLoopMgr );
385  sc = addMultiSvc( evtloop_item, ServiceManager::DEFAULT_SVC_PRIORITY * 10 );
386  if ( !sc.isSuccess() ) {
387  log << MSG::FATAL << "Error adding :" << m_eventLoopMgr << endmsg;
388  return sc;
389  }
390 
391  if ( m_noOfEvtThreads == 0 ) {
393  if ( !m_runable ) {
394  log << MSG::FATAL << "Error retrieving Runable: " << m_runableType.value() << "\n Check option ApplicationMgr."
395  << m_runableType.name() << endmsg;
396  return sc;
397  }
398  m_processingMgr = m_svcLocator->service( evtloop_item );
399  if ( !m_processingMgr ) {
400  log << MSG::FATAL << "Error retrieving Processing manager: " << m_eventLoopMgr.value()
401  << "\n Check option ApplicationMgr." << m_eventLoopMgr.name() << "\n No events will be processed." << endmsg;
402  return sc;
403  }
404  }
405 
406  // Establish Update Handlers for ExtSvc and DLLs Properties
407  m_extSvcNameList.declareUpdateHandler( &ApplicationMgr::extSvcNameListHandler, this );
408  m_createSvcNameList.declareUpdateHandler( &ApplicationMgr::createSvcNameListHandler, this );
410  m_dllNameList.declareUpdateHandler( &ApplicationMgr::dllNameListHandler, this );
411 
412  if ( m_actHistory ) {
413  // Create HistorySvc with a priority to ensure it's initialized last, finalized first
414  sc = svcManager()->addService( "HistorySvc", std::numeric_limits<int>::max() );
415  if ( sc.isFailure() ) {
416  log << MSG::FATAL << "Error adding HistorySvc" << endmsg;
417  return StatusCode::FAILURE;
418  }
419 
420  if ( m_noOfEvtThreads > 0 ) {
421  sc = addMultiSvc( "HistorySvc", std::numeric_limits<int>::max() );
422  if ( sc.isFailure() ) {
423  log << MSG::FATAL << "Error adding HistorySvc for multiple threads" << endmsg;
424  return StatusCode::FAILURE;
425  }
426  }
427  }
428 
429  log << MSG::INFO << "Application Manager Configured successfully" << endmsg;
431  return StatusCode::SUCCESS;
432 }
433 
434 //============================================================================
435 // IAppMgrUI implementation: ApplicationMgr::initialize()
436 //============================================================================
438 {
439  StatusCode sc;
440 
442 
443  // Make sure output level caches are up to date.
445 
446  // I cannot add these services in configure() because they are coming from GaudiUtils
447  // and it messes up genconf when rebuilding it.
448  if ( m_stopOnSignal ) {
449  // Instantiate the service that schedules a stop when a signal is received
450  std::string svcname( "Gaudi::Utils::StopSignalHandler" );
451  sc = svcManager()->addService( svcname );
452  if ( sc.isFailure() ) {
453  log << MSG::INFO << "Cannot instantiate " << svcname << "signals will be ignored" << endmsg;
454  }
455  }
456 
457  if ( m_stalledEventMonitoring ) {
458  // Instantiate the service that schedules a stop when a signal is received
459  std::string svcname( "StalledEventMonitor" );
460  sc = svcManager()->addService( svcname );
461  if ( sc.isFailure() ) {
462  log << MSG::INFO << "Cannot instantiate " << svcname << "signals will be ignored" << endmsg;
463  }
464  }
465 
467  log << MSG::INFO << "Already Initialized!" << endmsg;
468  return StatusCode::SUCCESS;
469  }
471  log << MSG::FATAL << "initialize: Invalid state \"" << m_state << "\"" << endmsg;
472  return StatusCode::FAILURE;
473  }
475 
476  //--------------------------------------------------------------------------
477  // Initialize the list of top Services
478  //--------------------------------------------------------------------------
479  sc = svcManager()->initialize();
480  if ( !sc.isSuccess() ) return sc;
481 
482  //--------------------------------------------------------------------------
483  // Final steps: Inform user and change internal state
484  //--------------------------------------------------------------------------
485  log << MSG::INFO << "Application Manager Initialized successfully" << endmsg;
487 
488  return sc;
489 }
490 
491 //============================================================================
492 // IAppMgrUI implementation: ApplicationMgr::start()
493 //============================================================================
495 {
496 
498  StatusCode sc;
499 
501  log << MSG::INFO << "Already Initialized!" << endmsg;
502  return StatusCode::SUCCESS;
503  }
505  log << MSG::FATAL << "start: Invalid state \"" << m_state << "\"" << endmsg;
506  return StatusCode::FAILURE;
507  }
509 
510  //--------------------------------------------------------------------------
511  // Initialize the list of top Services
512  //--------------------------------------------------------------------------
513  sc = svcManager()->start();
514  if ( !sc.isSuccess() ) return sc;
515 
516  //--------------------------------------------------------------------------
517  // Final steps: Inform user and change internal state
518  //--------------------------------------------------------------------------
519  log << MSG::INFO << "Application Manager Started successfully" << endmsg;
521 
522  return sc;
523 }
524 
525 //============================================================================
526 // IAppMgrUI implementation: ApplicationMgr::nextEvent(int)
527 //============================================================================
529 {
532  log << MSG::FATAL << "nextEvent: Invalid state \"" << m_state << "\"" << endmsg;
533  return StatusCode::FAILURE;
534  }
535  if ( !m_processingMgr ) {
537  log << MSG::FATAL << "No event processing manager specified. Check option: " << m_eventLoopMgr.name() << endmsg;
538  return StatusCode::FAILURE;
539  }
540  return m_processingMgr->nextEvent( maxevt );
541 }
542 
543 //============================================================================
544 // IAppMgrUI implementation: ApplicationMgr::stop()
545 //============================================================================
547 {
548 
550  StatusCode sc;
551 
553  log << MSG::INFO << "Already Initialized!" << endmsg;
554  return StatusCode::SUCCESS;
555  }
557  log << MSG::FATAL << "stop: Invalid state \"" << m_state << "\"" << endmsg;
558  return StatusCode::FAILURE;
559  }
561 
562  // Stop independently managed Algorithms
563  sc = algManager()->stop();
564  if ( !sc.isSuccess() ) return sc;
565 
566  //--------------------------------------------------------------------------
567  // Stop the list of top Services
568  //--------------------------------------------------------------------------
569  sc = svcManager()->stop();
570  if ( !sc.isSuccess() ) return sc;
571 
572  //--------------------------------------------------------------------------
573  // Final steps: Inform user and change internal state
574  //--------------------------------------------------------------------------
575  log << MSG::INFO << "Application Manager Stopped successfully" << endmsg;
577 
578  return sc;
579 }
580 
581 //============================================================================
582 // IAppMgrUI implementation: ApplicationMgr::finalize()
583 //============================================================================
585 {
588  log << MSG::INFO << "Already Finalized" << endmsg;
589  return StatusCode::SUCCESS;
590  }
592  log << MSG::FATAL << "finalize: Invalid state \"" << m_state << "\"" << endmsg;
593  return StatusCode::FAILURE;
594  }
596 
597  // disable message suppression in finalize
598  m_svcLocator->service<IProperty>( "MessageSvc" )
599  ->setProperty( Gaudi::Property<bool>( "enableSuppression", false ) )
600  .ignore();
601 
602  // Finalize independently managed Algorithms
603  StatusCode sc = algManager()->finalize();
604  if ( sc.isFailure() ) {
605  log << MSG::WARNING << "Failed to finalize an algorithm." << endmsg;
607  }
608 
609  // Finalize all Services
610  sc = svcManager()->finalize();
611  if ( sc.isFailure() ) {
612  log << MSG::WARNING << "Failed to finalize a service." << endmsg;
614  }
615 
616  // svcManager()->removeService( (IService*) m_processingMgr.get() );
617  // svcManager()->removeService( (IService*) m_runable.get() );
618 
619  if ( m_codeCheck ) {
621  }
622 
623  if ( sc.isSuccess() ) {
624  log << MSG::INFO << "Application Manager Finalized successfully" << endmsg;
625  } else {
626  log << MSG::ERROR << "Application Manager failed to finalize" << endmsg;
627  }
628 
630  return sc;
631 }
632 
633 //============================================================================
634 // IAppMgrUI implementation: ApplicationMgr::terminate()
635 //============================================================================
637 {
639 
641  log << MSG::INFO << "Already Offline" << endmsg;
642  return StatusCode::SUCCESS;
643  }
645  log << MSG::FATAL << "terminate: Invalid state \"" << m_state << "\"" << endmsg;
646  return StatusCode::FAILURE;
647  }
648  // release all Services
650 
651  if ( m_returnCode.value() == Gaudi::ReturnCode::Success ) {
652  log << MSG::INFO << "Application Manager Terminated successfully" << endmsg;
653  } else if ( m_returnCode.value() == Gaudi::ReturnCode::ScheduledStop ) {
654  log << MSG::INFO << "Application Manager Terminated successfully with a user requested ScheduledStop" << endmsg;
655  } else {
656  log << MSG::ERROR << "Application Manager Terminated with error code " << m_returnCode.value() << endmsg;
657  }
658 
659  { // Force a disable the auditing of finalize for MessageSvc
660  auto prop = m_messageSvc.as<IProperty>();
661  if ( prop ) {
662  prop->setProperty( Gaudi::Property<bool>( "AuditFinalize", false ) ).ignore();
663  }
664  }
665  { // Force a disable the auditing of finalize for JobOptionsSvc
666  auto prop = m_jobOptionsSvc.as<IProperty>();
667  if ( prop ) {
668  prop->setProperty( Gaudi::Property<bool>( "AuditFinalize", false ) ).ignore();
669  }
670  }
671 
672  // finalize MessageSvc
673  auto svc = m_messageSvc.as<IService>();
674  if ( !svc ) {
675  log << MSG::ERROR << "Could not get the IService interface of the MessageSvc" << endmsg;
676  } else {
677  svc->sysFinalize().ignore();
678  }
679 
680  // finalize JobOptionsSvc
681  svc = m_jobOptionsSvc.as<IService>();
682  if ( !svc ) {
683  log << MSG::ERROR << "Could not get the IService interface of the JobOptionsSvc" << endmsg;
684  } else {
685  svc->sysFinalize().ignore();
686  }
687 
689  return StatusCode::SUCCESS;
690 }
691 
692 //============================================================================
693 // Reach the required state going through all the needed transitions
694 //============================================================================
696 {
698 
699  switch ( state ) {
700 
702  switch ( m_state ) {
704  return StatusCode::SUCCESS;
705  break;
707  return terminate();
708  break;
709  default: // Gaudi::StateMachine::INITIALIZED or Gaudi::StateMachine::RUNNING
711  if ( sc.isSuccess() ) {
712  return terminate();
713  }
714  break;
715  }
716  break;
717 
719  switch ( m_state ) {
721  return StatusCode::SUCCESS;
722  break;
724  return configure();
725  break;
727  return finalize();
728  break;
729  default: // Gaudi::StateMachine::RUNNING
731  if ( sc.isSuccess() ) {
732  return finalize();
733  }
734  break;
735  }
736  break;
737 
739  switch ( m_state ) {
741  return StatusCode::SUCCESS;
742  break;
744  return initialize();
745  break;
747  return stop();
748  break;
749  default: // Gaudi::StateMachine::OFFLINE
751  if ( sc.isSuccess() ) {
752  return initialize();
753  }
754  break;
755  }
756  break;
757 
759  switch ( m_state ) {
761  return StatusCode::SUCCESS;
762  break;
764  return start();
765  break;
766  default: // Gaudi::StateMachine::OFFLINE or Gaudi::StateMachine::CONFIGURED
768  if ( sc.isSuccess() ) {
769  return start();
770  }
771  break;
772  }
773  break;
774  }
775 
776  // If I get here, there has been a problem in the recursion
777 
778  if ( ignoreFailures ) {
779  // force the new state
780  m_state = state;
781  return StatusCode::SUCCESS;
782  }
783 
784  return sc;
785 }
786 
787 //============================================================================
788 // IAppMgrUI implementation: ApplicationMgr::run()
789 //============================================================================
791 {
793 
795  if ( sc.isSuccess() ) {
797  if ( m_runable != 0 ) { // loop over the events
798  sc = m_runable->run();
799  if ( !sc.isSuccess() ) {
800  log << MSG::FATAL << "Application execution failed. Ending the job." << endmsg;
801  }
802  } else {
803  log << MSG::FATAL << "Application has no runable object. Check option:" << m_runableType.name() << endmsg;
804  }
805  }
806  if ( sc.isSuccess() ) { // try to close cleanly
808  }
809  // either the runable failed of the stut-down
810  if ( sc.isFailure() ) { // try to close anyway (but keep the StatusCode unchanged)
812  }
813  return sc;
814 }
815 
816 //============================================================================
817 // IEventProcessor implementation: executeEvent(void* par)
818 //============================================================================
820 {
823  if ( m_processingMgr ) {
824  return m_processingMgr->executeEvent( par );
825  }
826  }
827  log << MSG::FATAL << "executeEvent: Invalid state \"" << FSMState() << "\"" << endmsg;
828  return StatusCode::FAILURE;
829 }
830 
831 //============================================================================
832 // IEventProcessor implementation: executeRun(int)
833 //============================================================================
835 {
838  if ( m_processingMgr ) {
839  return m_processingMgr->executeRun( evtmax );
840  }
841  log << MSG::WARNING << "No EventLoop Manager specified " << endmsg;
842  return StatusCode::SUCCESS;
843  }
844  log << MSG::FATAL << "executeRun: Invalid state \"" << FSMState() << "\"" << endmsg;
845  return StatusCode::FAILURE;
846 }
847 
848 //============================================================================
849 // IEventProcessor implementation: stopRun(int)
850 //============================================================================
852 {
855  if ( m_processingMgr ) {
856  return m_processingMgr->stopRun();
857  }
858  log << MSG::WARNING << "No EventLoop Manager specified " << endmsg;
859  return StatusCode::SUCCESS;
860  }
861  log << MSG::FATAL << "stopRun: Invalid state \"" << FSMState() << "\"" << endmsg;
862  return StatusCode::FAILURE;
863 }
864 // Implementation of IAppMgrUI::name
865 const std::string& ApplicationMgr::name() const { return m_name; }
866 
867 // implementation of IService::state
869 // implementation of IService::state
871 
872 //============================================================================
873 // implementation of IService::reinitilaize
874 //============================================================================
876 {
878  StatusCode sc;
880  throw GaudiException( "Cannot reinitialize application if not INITIALIZED or RUNNING",
881  "ApplicationMgr::reinitialize", StatusCode::FAILURE );
882  }
885  }
886  sc = svcManager()->reinitialize();
887  if ( sc.isFailure() ) retval = sc;
888  sc = algManager()->reinitialize();
889  if ( sc.isFailure() ) retval = sc;
890  return retval;
891 }
892 
893 //============================================================================
894 // implementation of IService::reinitiaize
895 //============================================================================
897 {
899  StatusCode sc;
901  throw GaudiException( "Cannot restart application if not RUNNING", "ApplicationMgr::restart", StatusCode::FAILURE );
902  }
903  sc = svcManager()->restart();
904  if ( sc.isFailure() ) retval = sc;
905  sc = algManager()->restart();
906  if ( sc.isFailure() ) retval = sc;
907  return retval;
908 }
909 
910 //============================================================================
911 // SI Go Handler
912 //============================================================================
914 {
915 
917  StatusCode sc;
918 
919  // Re-initialize everything
920  sc = reinitialize();
921  // Execute a number of events
922  executeRun( m_evtMax );
923 
924  return;
925 }
926 
927 //============================================================================
928 // SI Exit Handler
929 //============================================================================
931 {
932  StatusCode status;
933  status = finalize();
934  status = terminate();
935  ::exit( 0 );
936 }
937 
938 //============================================================================
939 // Handle properties of the event loop manager (Top alg/Output stream list)
940 //============================================================================
942 {
943  if ( m_processingMgr ) {
944  auto props = m_processingMgr.as<IProperty>();
945  if ( props ) props->setProperty( p ).ignore();
946  }
947 }
948 
949 //============================================================================
950 // External Service List handler
951 //============================================================================
953 {
954  if ( !( decodeCreateSvcNameList() ).isSuccess() ) {
955  throw GaudiException( "Failed to create ext services", "MinimalEventLoopMgr::createSvcNameListHandler",
957  }
958 }
959 //============================================================================
960 // decodeCreateSvcNameList
961 //============================================================================
963 {
965  const auto& theNames = m_createSvcNameList.value();
966  auto it = theNames.begin();
967  auto et = theNames.end();
968  while ( result.isSuccess() && it != et ) {
969  Gaudi::Utils::TypeNameString item( *it++ );
970  if ( ( result = svcManager()->addService( item, ServiceManager::DEFAULT_SVC_PRIORITY ) ).isFailure() ) {
972  log << MSG::ERROR << "decodeCreateSvcNameList: Cannot create service " << item.type() << "/" << item.name()
973  << endmsg;
974  } else {
975  ON_DEBUG
976  {
978  log << MSG::DEBUG << "decodeCreateSvcNameList: Created service " << item.type() << "/" << item.name() << endmsg;
979  }
980  }
981  }
982  return result;
983 }
984 
985 //============================================================================
986 // External Service List handler
987 //============================================================================
989 {
990  if ( !( decodeExtSvcNameList() ).isSuccess() ) {
991  throw GaudiException( "Failed to declare ext services", "MinimalEventLoopMgr::extSvcNameListHandler",
993  }
994 }
995 
996 //============================================================================
997 // decodeExtSvcNameList
998 //============================================================================
1000 {
1002 
1003  const auto& theNames = m_extSvcNameList.value();
1004 
1005  auto it = theNames.begin();
1006  auto et = theNames.end();
1007  while ( result.isSuccess() && it != et ) {
1008  Gaudi::Utils::TypeNameString item( *it++ );
1009  if ( m_extSvcCreates ) {
1010  if ( ( result = svcManager()->addService( item, ServiceManager::DEFAULT_SVC_PRIORITY ) ).isFailure() ) {
1012  log << MSG::ERROR << "decodeExtSvcNameList: Cannot create service " << item.type() << "/" << item.name()
1013  << endmsg;
1014  }
1015  } else {
1016  if ( ( result = svcManager()->declareSvcType( item.name(), item.type() ) ).isFailure() ) {
1018  log << MSG::ERROR << "decodeExtSvcNameList: Cannot declare service " << item.type() << "/" << item.name()
1019  << endmsg;
1020  }
1021  }
1022  }
1023  return result;
1024 }
1025 
1026 //============================================================================
1027 // External Service List handler
1028 //============================================================================
1030 {
1031  if ( !( decodeMultiThreadSvcNameList() ).isSuccess() ) {
1032  throw GaudiException( "Failed to create copies of mt services",
1033  "MinimalEventLoopMgr::multiThreadSvcNameListHandler", StatusCode::FAILURE );
1034  }
1035 }
1036 
1037 //============================================================================
1038 // decodeMultiExtSvcNameList
1039 //============================================================================
1041 {
1043  const auto& theNames = m_multiThreadSvcNameList.value();
1044  for ( int iCopy = 0; iCopy < m_noOfEvtThreads; ++iCopy ) {
1045  for ( const auto& it : theNames ) {
1046  Gaudi::Utils::TypeNameString item( it );
1047  result = addMultiSvc( item, ServiceManager::DEFAULT_SVC_PRIORITY );
1048  // FIXME SHOULD CLONE?
1049  if ( result.isFailure() ) {
1051  log << MSG::ERROR << "decodeMultiThreadSvcNameList: Cannot create service " << item.type() << "/" << item.name()
1052  << endmsg;
1053  } else {
1054  ON_VERBOSE
1055  {
1057  log << MSG::VERBOSE << "decodeMultiThreadSvcNameList: created service " << item.type() << "/" << item.name()
1058  << endmsg;
1059  }
1060  }
1061  }
1062  }
1063  return result;
1064 }
1065 //=============================================================================
1066 // declareMultiSvcType
1067 //=============================================================================
1069 {
1072  if ( 0 == m_noOfEvtThreads ) {
1073  result = svcManager()->declareSvcType( name, type );
1074  if ( result.isFailure() ) {
1075  log << MSG::ERROR << "declareMultiSvcType: Cannot declare service " << type << "/" << name << endmsg;
1076  } else {
1077  ON_VERBOSE
1078  log << MSG::VERBOSE << "declareMultiSvcType: declared service " << type << "/" << name << endmsg;
1079  }
1080  } else {
1081  for ( int iCopy = 0; iCopy < m_noOfEvtThreads; ++iCopy ) {
1082  std::string thrName( name + getGaudiThreadIDfromID( iCopy ) );
1083  result = svcManager()->declareSvcType( thrName, type );
1084  if ( result.isFailure() ) {
1085  log << MSG::ERROR << "declareMultiSvcType: Cannot declare service " << type << "/" << thrName << endmsg;
1086  } else {
1087  ON_VERBOSE
1088  log << MSG::VERBOSE << "declareMultiSvcType: declared service " << type << "/" << thrName << endmsg;
1089  }
1090  }
1091  }
1092  return result;
1093 }
1094 //=============================================================================
1095 // addMultiSvc
1096 //=============================================================================
1098 {
1102  if ( 0 == m_noOfEvtThreads ) {
1103  result = svcManager()->addService( typeName, prio );
1104  // result = svcManager()->addService(name, type, prio); // CHECKME???
1105  if ( result.isFailure() ) {
1106  log << MSG::ERROR << "addMultiSvc: Cannot add service " << typeName.type() << "/" << typeName.name() << endmsg;
1107  } else {
1108  ON_VERBOSE
1109  log << MSG::VERBOSE << "addMultiSvc: added service " << typeName.type() << "/" << typeName.name() << endmsg;
1110  }
1111  } else {
1112  for ( int iCopy = 0; iCopy < m_noOfEvtThreads; ++iCopy ) {
1113  const std::string& type = typeName.type();
1114  std::string thrName( typeName.name() + getGaudiThreadIDfromID( iCopy ) );
1115  result = svcManager()->addService( TypeNameString( thrName, type ), prio );
1116  if ( result.isFailure() ) {
1117  log << MSG::ERROR << "addMultiSvc: Cannot add service " << type << "/" << thrName << endmsg;
1118  } else {
1119  ON_VERBOSE
1120  log << MSG::VERBOSE << "addMultiSvc: added service " << type << "/" << thrName << endmsg;
1121  }
1122  }
1123  }
1124  return result;
1125 }
1126 
1127 //============================================================================
1128 // Dll List handler
1129 //============================================================================
1131 {
1132  if ( !( decodeDllNameList() ).isSuccess() ) {
1133  throw GaudiException( "Failed to load DLLs.", "MinimalEventLoopMgr::dllNameListHandler", StatusCode::FAILURE );
1134  }
1135 }
1136 
1137 //============================================================================
1138 // decodeDllNameList
1139 //============================================================================
1141 {
1142 
1145 
1146  // Clean up multiple entries from DLL list
1147  // -------------------------------------------------------------------------
1148  std::vector<std::string> newList;
1149  std::map<std::string, unsigned int> dllInList, duplicateList;
1150  {
1151  for ( const auto it : m_dllNameList ) {
1152  if ( 0 == dllInList[it] ) {
1153  newList.push_back( it ); // first instance of this module
1154  } else {
1155  ++duplicateList[it];
1156  } // module listed multiple times
1157  ++dllInList[it]; // increment count for this module
1158  }
1159  }
1160  // m_dllNameList = newList; // update primary list to new, filtered list (do not use the
1161  // property itself otherwise we get called again infinitely)
1162  // List modules that were in there twice..
1163  ON_DEBUG if ( !duplicateList.empty() )
1164  {
1165  log << MSG::DEBUG << "Removed duplicate entries for modules : ";
1166  for ( auto it = duplicateList.begin(); it != duplicateList.end(); ++it ) {
1167  log << it->first << "(" << 1 + it->second << ")";
1168  if ( it != --duplicateList.end() ) log << ", ";
1169  }
1170  log << endmsg;
1171  }
1172  // -------------------------------------------------------------------------
1173 
1174  const std::vector<std::string>& theNames = newList;
1175 
1176  // only load the new dlls or previously failed dlls
1177  ON_DEBUG log << MSG::DEBUG << "Loading declared DLL's" << endmsg;
1178 
1179  std::vector<std::string> successNames, failNames;
1180  for ( const auto& it : theNames ) {
1181  if ( std::find( m_okDlls.rbegin(), m_okDlls.rend(), it ) == m_okDlls.rend() ) {
1182  // found a new module name
1183  StatusCode status = m_classManager->loadModule( it );
1184  if ( status.isFailure() ) {
1185  failNames.push_back( it );
1186  result = StatusCode::FAILURE;
1187  } else {
1188  successNames.push_back( it );
1189  }
1190  }
1191  }
1192 
1193  // report back to the user and store the names of the succesfully loaded dlls
1194  if ( !successNames.empty() ) {
1195  log << MSG::INFO << "Successfully loaded modules : ";
1196  for ( auto it = successNames.begin(); it != successNames.end(); it++ ) {
1197  log << ( *it );
1198  if ( ( it + 1 ) != successNames.end() ) log << ", ";
1199  // save name
1200  m_okDlls.push_back( *it );
1201  }
1202  log << endmsg;
1203  }
1204 
1205  if ( result == StatusCode::FAILURE ) {
1206  log << MSG::WARNING << "Failed to load modules: ";
1207  for ( auto it = failNames.begin(); it != failNames.end(); it++ ) {
1208  log << ( *it );
1209  if ( ( it + 1 ) != failNames.end() ) log << ", ";
1210  }
1211  log << endmsg;
1212  }
1213  return result;
1214 }
1215 
1216 //============================================================================
1217 // Plugin debug level handler
1218 //============================================================================
1220 {
1221  // Setup debug level for the plugin system
1223  log << MSG::INFO << "Updating Gaudi::PluginService::SetDebug(level) to level=" << m_pluginDebugLevel << endmsg;
1225 }
1226 
1227 //============================================================================
1228 // Init loop check handler
1229 //============================================================================
1231 {
1233 }
1234 
1236 {
1237  resetMessaging();
1238  for ( auto& mgrItem : m_managers ) {
1239  mgrItem.second->outputLevelUpdate();
1240  }
1241 }
The ServiceManager class is in charge of the creation of concrete instances of Services.
Gaudi::StateMachine::State m_targetState
Internal State.
GAUDI_API std::string getEnv(const char *var)
get a particular environment variable (returning "UNKNOWN" if not set)
Definition: System.cpp:581
The AlgorithmManager class is in charge of the creation of concrete instances of Algorithms.
StatusCode initialize() override
constexpr int FinalizationFailure
Error codes for operation failures.
Definition: AppReturnCode.h:34
#define UNLIKELY(x)
Definition: Kernel.h:128
virtual StatusCode addService(IService *svc, int prio=DEFAULT_SVC_PRIORITY)=0
Add a service to the "active" list of services of the factory.
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
Gaudi::Property< bool > m_propertiesPrint
virtual StatusCode stopRun()=0
Schedule a stop of the current event processing.
T empty(T...args)
virtual StatusCode run()=0
Run the class implementation.
Define general base for Gaudi exception.
StatusCode decodeDllNameList()
Gaudi::Property< int > m_returnCode
Property to record the error conditions occurring during the running.
GAUDI_API int setEnv(const std::string &name, const std::string &value, int overwrite=1)
Set an environment variables.
Definition: System.cpp:704
void SIExitHandler(Gaudi::Details::PropertyBase &theProp)
Gaudi::Property< bool > m_stopOnSignal
Property to enable/disable the "stop on signal" service.
StatusCode loadModule(const std::string &module, bool fireIncident=true) override
Gaudi::Property< bool > m_codeCheck
Gaudi::Property< int > m_evtMax
SmartIF< IRunable > m_runable
Reference to the runable object.
Implementation of property with value of concrete type.
Definition: Property.h:319
StatusCode setProperty(const Gaudi::Details::PropertyBase &p) override
set the property form another property
const std::vector< Gaudi::Details::PropertyBase * > & getProperties() const override
get all properties
virtual PropertyBase & declareUpdateHandler(std::function< void(PropertyBase &)> fun)=0
set new callback for update
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:329
void SIGoHandler(Gaudi::Details::PropertyBase &theProp)
T rend(T...args)
ManagersMap m_managers
Map of known component managers.
Gaudi::Property< std::string > m_jobOptionsType
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:50
const std::string & name() const override
T endl(T...args)
void multiThreadSvcNameListHandler(Gaudi::Details::PropertyBase &theProp)
static Time current()
Returns the current time.
Definition: Time.cpp:112
Gaudi::Property< std::map< std::string, std::string > > m_environment
Gaudi::Property< std::vector< std::string > > m_multiThreadSvcNameList
List of external services names for which we want a copy per evt thread.
void outputLevelUpdate() override
Function to call to update the outputLevel of the components (after a change in MessageSvc).
virtual StatusCode executeEvent(void *par=0)=0
Process single event.
Gaudi::Property< std::string > m_appVersion
T end(T...args)
static GAUDI_API void enableChecking()
Definition: StatusCode.cpp:18
std::vector< std::string > m_okDlls
names of successfully loaded dlls
State
Allowed states for classes implementing the state machine (ApplicationMgr, Algorithm, Service, AlgTool).
Definition: StateMachine.h:14
StatusCode nextEvent(int maxevt) override
SmartIF< IJobOptionsSvc > m_jobOptionsSvc
Reference to JobOption service.
AlgTypeAliasesMap & typeAliases()
virtual StatusCode declareSvcType(const std::string &svcname, const std::string &svctype)=0
Declare the type of the service to be used when crating a given service name.
void createSvcNameListHandler(Gaudi::Details::PropertyBase &)
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:61
SmartIF< IEventProcessor > m_processingMgr
Reference to processing manager object.
StatusCode terminate() override
SmartIF< ISvcManager > & svcManager()
virtual StatusCode start()=0
Start (from INITIALIZED to RUNNING).
constexpr int ScheduledStop
Definition: AppReturnCode.h:27
Gaudi::Property< std::string > m_eventLoopMgr
STL class.
StatusCode addMultiSvc(const Gaudi::Utils::TypeNameString &typeName, int prio)
add one or more copies of svc type/name as determined by NoOfThreads
TYPE * get() const
Get interface pointer.
Definition: SmartIF.h:82
virtual StatusCode nextEvent(int maxevt)=0
Process the next maxevt events.
void evtLoopPropertyHandler(Gaudi::Details::PropertyBase &theProp)
StatusCode service(const Gaudi::Utils::TypeNameString &name, T *&svc, bool createIf=true)
Templated method to access a service by name.
Definition: ISvcLocator.h:79
T push_back(T...args)
Interface ID class.
Definition: IInterface.h:29
GAUDIPS_API void SetDebug(int debugLevel)
Backward compatibility with Reflex.
virtual StatusCode setProperty(const Gaudi::Details::PropertyBase &p)=0
Set the property by property.
Gaudi::Property< int > m_outputLevel
SmartIF< IFace > as() const
return a new SmartIF instance to another interface
Definition: SmartIF.h:115
Helper class to parse a string of format "type/name".
StatusCode executeRun(int evtmax) override
implementation of IEventProcessor::executeRun(int)
virtual StatusCode stop()=0
Stop (from RUNNING to INITIALIZED).
virtual StatusCode reinitialize()=0
Initialization (from INITIALIZED or RUNNING to INITIALIZED, via CONFIGURED).
Gaudi::StateMachine::State targetFSMState() const override
void extSvcNameListHandler(Gaudi::Details::PropertyBase &theProp)
void initLoopCheckHndlr(Gaudi::Details::PropertyBase &)
General service interface definition.
Definition: IService.h:18
#define ON_DEBUG
SmartIF< ISvcLocator > m_svcLocator
Reference to its own service locator (must be instantiated prior to any service!) ...
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
virtual SmartIF< IService > & createService(const Gaudi::Utils::TypeNameString &nametype)=0
Creates and instance of a service type that has been declared beforehand and assigns it a name...
Gaudi::Details::PropertyBase * declareProperty(const std::string &name, TYPE &value, const std::string &doc="none")
Declare a property (templated)
Definition of the basic interface.
Definition: IInterface.h:277
virtual StatusCode setMyProperties(const std::string &client, IProperty *me)=0
Override default properties of the calling client.
Gaudi::Property< std::vector< std::string > > m_extSvcNameList
#define DECLARE_OBJECT_FACTORY(x)
Definition: ObjectFactory.h:16
void dllNameListHandler(Gaudi::Details::PropertyBase &theProp)
Gaudi::Property< std::string > m_runableType
GAUDI_API std::string getGaudiThreadIDfromID(int iCopy)
helper function to extract Gaudi Thread ID from thread copy number
Definition: ThreadGaudi.cpp:16
Gaudi::Property< bool > m_stalledEventMonitoring
Property to enable/disable the monitoring and reporting of stalled events.
PropertyBase base class allowing PropertyBase* collections to be "homogeneous".
Definition: Property.h:32
StatusCode GoToState(Gaudi::StateMachine::State state, bool ignoreFailures=false)
Reach a state from current state (whichever it is) going through the correct transitions.
StatusCode finalize() override
Gaudi::Property< std::vector< std::string > > m_svcOptMapping
virtual StatusCode initialize()=0
Initialization (from CONFIGURED to INITIALIZED).
Gaudi::Property< std::string > m_jobOptionsPreAction
Gaudi::Property< std::vector< std::string > > m_svcMapping
Gaudi::Property< std::vector< std::string > > m_dllNameList
GAUDI_API bool isEnvSet(const char *var)
Check if an environment variable is set or not.
Definition: System.cpp:603
StatusCode queryInterface(const InterfaceID &iid, void **pinterface) override
implementation of IInterface::queryInterface
StatusCode executeEvent(void *par) override
implementation of IEventProcessor::executeEvent(void*)
The Application Manager class.
Gaudi::Property< bool > m_actHistory
constexpr bool versionMatch(const InterfaceID &iid) const
check compatibility.
Definition: IInterface.h:62
StatusCode queryInterface(const InterfaceID &iid, void **pinterface) override
StatusCode decodeExtSvcNameList()
T find(T...args)
GAUDI_API const std::string & hostName()
Host name.
Definition: System.cpp:403
Gaudi::Property< bool > m_extSvcCreates
SmartIF< DLLClassManager > m_classManager
Reference to the class manager.
Gaudi::Property< std::string > m_jobOptionsSvcType
StatusCode start() override
Gaudi::Property< std::vector< std::string > > m_createSvcNameList
StatusCode restart() override
StatusCode configure() override
T begin(T...args)
void pluginDebugPropertyHandler(Gaudi::Details::PropertyBase &theProp)
virtual StatusCode restart()=0
Initialization (from RUNNING to RUNNING, via INITIALIZED).
StatusCode stopRun() override
implementation of IEventProcessor::stopRun()
const std::string & type() const
StatusCode decodeCreateSvcNameList()
virtual StatusCode finalize()=0
Finalize (from INITIALIZED to CONFIGURED).
Gaudi::Property< std::string > m_jobOptionsPostAction
T c_str(T...args)
StatusCode i_startup()
Internal startup routine.
StatusCode stop() override
std::string m_name
Name.
virtual unsigned long addRef()=0
Increment the reference count of Interface instance.
static GAUDI_API void disableChecking()
Definition: StatusCode.cpp:20
Gaudi::Property< std::string > m_messageSvcType
#define ON_VERBOSE
StatusCode reinitialize() override
MSG::Level level() const
Retrieve output level.
Definition: MsgStream.h:108
Gaudi::StateMachine::State m_state
Internal State.
Gaudi::Property< std::string > m_appName
Gaudi::StateMachine::State FSMState() const override
const std::string & name() const
SmartIF< ISvcLocator > & serviceLocator() const override
Needed to locate the message service.
virtual void setLoopCheckEnabled(bool en=true)=0
Set the value of the initialization loop check flag.
virtual StatusCode executeRun(int maxevt)=0
Process the maxevt events as a Run (beginRun() and endRun() called)
int maxevt
Definition: Bootstrap.cpp:279
void ignore() const
Definition: StatusCode.h:84
constexpr int Success
Definition: AppReturnCode.h:18
StatusCode run() override
std::string typeName(const std::type_info &typ)
Definition: Dictionary.cpp:23
StatusCode queryInterface(const InterfaceID &iid, void **pinterface) override
StatusCode decodeMultiThreadSvcNameList()
The IProperty is the basic interface for all components which have properties that can be set or get...
Definition: IProperty.h:20
SmartIF< IAlgManager > & algManager()
static const InterfaceID & interfaceID()
Return an instance of InterfaceID identifying the interface.
Definition: IInterface.h:287
Gaudi::Property< int > m_noOfEvtThreads
SmartIF< IMessageSvc > m_messageSvc
Reference to the message service.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
Gaudi::Property< int > m_pluginDebugLevel
Gaudi::Property< std::string > m_jobOptionsPath
virtual void setOutputLevel(int new_level)=0
Set new global output level threshold.
std::string format(bool local, std::string spec="%c") const
Format the time using strftime.
Definition: Time.cpp:260
Gaudi::Property< bool > m_loopCheck
virtual StatusCode queryInterface(const InterfaceID &ti, void **pp)=0
Set the void** to the pointer to the requested interface of the instance.
StatusCode declareMultiSvcType(const std::string &name, const std::string &type)
declare one or more copies of svc type/name as determined by NoOfThreads
T rbegin(T...args)