ApplicationMgr.cpp
Go to the documentation of this file.
1 // Include files
2 #include "ApplicationMgr.h"
3 #include "ServiceManager.h"
4 #include "AlgorithmManager.h"
5 #include "DLLClassManager.h"
6 
7 #include "GaudiKernel/TypeNameString.h"
8 #include "GaudiKernel/IService.h"
9 #include "GaudiKernel/IRunable.h"
10 #include "GaudiKernel/IMessageSvc.h"
11 #include "GaudiKernel/IJobOptionsSvc.h"
12 
13 #include "GaudiKernel/SmartIF.h"
14 #include "GaudiKernel/MsgStream.h"
15 #include "GaudiKernel/PropertyMgr.h"
16 #include "GaudiKernel/ObjectFactory.h"
17 
18 #include "GaudiKernel/GaudiException.h"
19 #include "GaudiKernel/ThreadGaudi.h"
20 
21 #include "GaudiKernel/StatusCode.h"
22 #include "GaudiKernel/Time.h"
23 #include "GaudiKernel/System.h"
24 
25 #include "GaudiKernel/AppReturnCode.h"
26 
27 #include "GaudiCoreSvcVersion.h"
28 
29 
30 using System::getEnv;
31 using System::isEnvSet;
32 
33 #include <algorithm>
34 #include <cassert>
35 #include <ctime>
36 #include <limits>
37 
38 static const char* s_eventloop = "EventLoop";
39 static const char* s_runable = "Runable";
40 
41 #define ON_DEBUG if (UNLIKELY(m_outputLevel <= MSG::DEBUG))
42 #define ON_VERBOSE if (UNLIKELY(m_outputLevel <= MSG::VERBOSE))
43 
45 
46 // Implementation class for the Application Manager. In this way the
47 // ApplicationMgr class is a fully insulated concrete class. Clients
48 // (main programs) will not need to re-compile if there are changes
49 // in the implementation
50 
51 //=======================================================================
52 // Constructor
53 //=======================================================================
55  base_class()
56 {
57  // IInterface initialization
58  addRef(); // Initial count set to 1
59 
60  // Instantiate component managers
61  m_managers[IService::interfaceID().id()] = new ServiceManager(this);
62  AlgorithmManager *algMgr = new AlgorithmManager(this);
63  m_managers[IAlgorithm::interfaceID().id()] = algMgr;
64 
65  m_svcLocator = svcManager();
66 
67  // Instantiate internal services
68  // SvcLocator/Factory HAS to be already instantiated
69  m_classManager = new DLLClassManager(this);
70  m_propertyMgr = new PropertyMgr(this);
71 
72  m_propertyMgr->declareProperty("Go", m_SIGo = 0 );
73  m_propertyMgr->declareProperty("Exit", m_SIExit = 0 );
74  m_propertyMgr->declareProperty("Dlls", m_dllNameList );
75  m_propertyMgr->declareProperty("ExtSvc", m_extSvcNameList );
76  m_propertyMgr->declareProperty("CreateSvc", m_createSvcNameList );
77  m_propertyMgr->declareProperty("ExtSvcCreates", m_extSvcCreates=true );
78 
79  m_propertyMgr->declareProperty("SvcMapping", m_svcMapping );
80  m_propertyMgr->declareProperty("SvcOptMapping", m_svcOptMapping );
81 
82  m_propertyMgr->declareProperty("TopAlg", m_topAlgNameList );
83  m_propertyMgr->declareProperty("OutStream", m_outStreamNameList );
84  m_propertyMgr->declareProperty("OutStreamType", m_outStreamType = "OutputStream" );
85  m_propertyMgr->declareProperty("MessageSvcType",m_messageSvcType= "MessageSvc" );
86  m_propertyMgr->declareProperty("JobOptionsSvcType",
87  m_jobOptionsSvcType = "JobOptionsSvc" );
88  m_propertyMgr->declareProperty( s_runable, m_runableType = "AppMgrRunable");
89  m_propertyMgr->declareProperty( s_eventloop, m_eventLoopMgr = "EventLoopMgr");
90 
91  m_propertyMgr->declareProperty("HistogramPersistency", m_histPersName="NONE");
92 
93  // Declare Job Options Service properties and set default
94  m_propertyMgr->declareProperty("JobOptionsType", m_jobOptionsType = "FILE");
95  m_propertyMgr->declareProperty("JobOptionsPath", m_jobOptionsPath = "");
96  m_propertyMgr->declareProperty("EvtMax", m_evtMax = -1);
97  m_propertyMgr->declareProperty("EvtSel", m_evtsel );
98  m_propertyMgr->declareProperty("OutputLevel", m_outputLevel = MSG::INFO);
99 
100  m_propertyMgr->declareProperty("MultiThreadExtSvc", m_multiThreadSvcNameList);
101  m_propertyMgr->declareProperty("NoOfThreads", m_noOfEvtThreads = 0);
102  m_propertyMgr->declareProperty("AppName", m_appName = "ApplicationMgr");
103  m_propertyMgr->declareProperty("AppVersion", m_appVersion = "");
104 
105  m_propertyMgr->declareProperty("AuditTools", m_auditTools = false);
106  m_propertyMgr->declareProperty("AuditServices", m_auditSvcs = false);
107  m_propertyMgr->declareProperty("AuditAlgorithms", m_auditAlgs = false);
108 
109  m_propertyMgr->declareProperty("ActivateHistory", m_actHistory = false);
110  m_propertyMgr->declareProperty("StatusCodeCheck", m_codeCheck = false);
111 
112  m_propertyMgr->declareProperty("Environment", m_environment);
113 
114  // ServiceMgr Initialization loop checking
115  m_propertyMgr->declareProperty("InitializationLoopCheck", m_loopCheck = true)
116  ->declareUpdateHandler(&ApplicationMgr::initLoopCheckHndlr, this);
117  svcManager()->setLoopCheckEnabled(m_loopCheck);
118 
119  // Flag to activate the printout of properties
120  m_propertyMgr->declareProperty
121  ( "PropertiesPrint",
122  m_propertiesPrint = false,
123  "Flag to activate the printout of properties" );
124 
125  m_propertyMgr->declareProperty("PluginDebugLevel", m_pluginDebugLevel = 0 );
126 
127  m_propertyMgr->declareProperty("StopOnSignal", m_stopOnSignal = false,
128  "Flag to enable/disable the signal handler that schedule a stop of the event loop");
129 
130  m_propertyMgr->declareProperty("StalledEventMonitoring", m_stalledEventMonitoring = false,
131  "Flag to enable/disable the monitoring and reporting of stalled events");
132 
133  m_propertyMgr->declareProperty("ReturnCode", m_returnCode = Gaudi::ReturnCode::Success,
134  "Return code of the application. Set internally in case of error conditions.");
135 
136  m_propertyMgr->declareProperty("AlgTypeAliases", algMgr->typeAliases(),
137  "Aliases of algorithm types, to replace an algorithm type for every instance");
138 
139  // Add action handlers to the appropriate properties
140  m_SIGo.declareUpdateHandler ( &ApplicationMgr::SIGoHandler , this );
141  m_SIExit.declareUpdateHandler( &ApplicationMgr::SIExitHandler , this );
142  m_topAlgNameList.declareUpdateHandler(&ApplicationMgr::evtLoopPropertyHandler, this);
143  m_outStreamNameList.declareUpdateHandler(&ApplicationMgr::evtLoopPropertyHandler, this);
144  m_outStreamType.declareUpdateHandler(&ApplicationMgr::evtLoopPropertyHandler, this);
145  m_pluginDebugLevel.declareUpdateHandler(&ApplicationMgr::pluginDebugPropertyHandler, this);
146 
147  m_svcMapping.insert( std::end(m_svcMapping),
148  { "EvtDataSvc/EventDataSvc",
149  "DetDataSvc/DetectorDataSvc",
150  "HistogramSvc/HistogramDataSvc",
151  "HbookCnv::PersSvc/HbookHistSvc",
152  "RootHistCnv::PersSvc/RootHistSvc",
153  "EvtPersistencySvc/EventPersistencySvc",
154  "DetPersistencySvc/DetectorPersistencySvc",
155  "HistogramPersistencySvc/HistogramPersistencySvc" } );
156 }
157 
158 
159 //============================================================================
160 // IInterface implementation: queryInterface::addRef()
161 //============================================================================
163 ( const InterfaceID& iid ,
164  void** ppvi )
165 {
166  if ( !ppvi ) { return StatusCode::FAILURE ; }
167 
168  // try to find own/direct interfaces:
169  StatusCode sc = base_class::queryInterface(iid,ppvi);
170  if (sc.isSuccess()) return sc;
171 
172  // find indirect interfaces :
173  if ( ISvcLocator ::interfaceID() . versionMatch ( iid ) )
174  { return serviceLocator()-> queryInterface ( iid , ppvi ) ; }
175  else if ( ISvcManager ::interfaceID() . versionMatch ( iid ) )
176  { return svcManager() -> queryInterface ( iid , ppvi ) ; }
177  else if ( IAlgManager ::interfaceID() . versionMatch ( iid ) )
178  { return algManager() -> queryInterface ( iid , ppvi ) ; }
179  else if ( IClassManager ::interfaceID() . versionMatch ( iid ) )
180  { return m_classManager -> queryInterface ( iid , ppvi ) ; }
181  else if ( IProperty ::interfaceID() . versionMatch ( iid ) )
182  { return m_propertyMgr -> queryInterface ( iid , ppvi ) ; }
183  else if ( IMessageSvc ::interfaceID() . versionMatch ( iid ) )
184  {
185  *ppvi = reinterpret_cast<void*>(m_messageSvc.get());
186  if (m_messageSvc) m_messageSvc->addRef();
187  // Note that 0 can be a valid IMessageSvc pointer value (when used for
188  // MsgStream).
189  return StatusCode::SUCCESS;
190  }
191  *ppvi = nullptr;
192  return StatusCode::FAILURE;
193 }
194 
195 //============================================================================
196 // ApplicationMgr::i_startup()
197 //============================================================================
199  StatusCode sc;
200 
201  // declare factories in current module
203 
204  // Create the Message service
206  if( !msgsvc ) {
207  fatal() << "Error creating MessageSvc of type " << m_messageSvcType << endmsg;
208  return sc;
209  }
210  // Create the Job Options service
211  auto jobsvc = svcManager()->createService(Gaudi::Utils::TypeNameString("JobOptionsSvc", m_jobOptionsSvcType));
212  if( !jobsvc ) {
213  fatal() << "Error creating JobOptionsSvc" << endmsg;
214  return sc;
215  }
216 
217  auto jobOptsIProp = jobsvc.as<IProperty>();
218  if ( !jobOptsIProp ) {
219  fatal() << "Error locating JobOptionsSvc" << endmsg;
220  return sc;
221  }
222  sc = jobOptsIProp->setProperty( StringProperty("TYPE", m_jobOptionsType) );
223  if( !sc.isSuccess() ) {
224  fatal() << "Error setting TYPE option in JobOptionsSvc" << endmsg;
225  return sc;
226  }
227 
228  if ( !m_jobOptionsPath.empty() ) { // The command line takes precedence
229  sc = jobOptsIProp->setProperty( StringProperty("PATH", m_jobOptionsPath) );
230  if( !sc.isSuccess() ) {
231  fatal() << "Error setting PATH option in JobOptionsSvc" << endmsg;
232  return sc;
233  }
234  }
235  else if ( isEnvSet("JOBOPTPATH") ) {// Otherwise the Environment JOBOPTPATH
236  sc = jobOptsIProp->setProperty (StringProperty("PATH",
237  getEnv("JOBOPTPATH")));
238  if( !sc.isSuccess() ) {
239  fatal()
240  << "Error setting PATH option in JobOptionsSvc from env"
241  << endmsg;
242  return sc;
243  }
244  }
245  else { // Otherwise the default
246  sc = jobOptsIProp->setProperty (StringProperty("PATH",
247  "../options/job.opts"));
248  if( !sc.isSuccess() ) {
249  fatal()
250  << "Error setting PATH option in JobOptionsSvc to default"
251  << endmsg;
252  return sc;
253  }
254  }
255  jobOptsIProp.reset();
256 
257  // Sets my default the Output Level of the Message service to be
258  // the same as this
259  auto msgSvcIProp = msgsvc.as<IProperty>();
260  msgSvcIProp->setProperty( IntegerProperty("OutputLevel", m_outputLevel)).ignore();
261  msgSvcIProp.reset();
262 
263  sc = jobsvc->sysInitialize();
264  if( !sc.isSuccess() ) {
265  fatal() << "Error initializing JobOptionsSvc" << endmsg;
266  return sc;
267  }
268  sc = msgsvc->sysInitialize();
269  if( !sc.isSuccess() ) {
270  fatal() << "Error initializing MessageSvc" << endmsg;
271  return sc;
272  }
273 
274  // Get the useful interface from Message and JobOptions services
275  m_messageSvc = m_svcLocator->service("MessageSvc");
276  if( !m_messageSvc ) {
277  fatal() << "Error retrieving MessageSvc." << endmsg;
278  return sc;
279  }
280  m_jobOptionsSvc = m_svcLocator->service("JobOptionsSvc");
281  if( !m_jobOptionsSvc ) {
282  fatal() << "Error retrieving JobOptionsSvc." << endmsg;
283  return sc;
284  }
285 
286  return sc;
287 }
288 
289 //============================================================================
290 // IAppMgrUI implementation: ApplicationMgr::configure()
291 //============================================================================
293  // Check if the state is compatible with the transition
294  MsgStream tlog( m_messageSvc, name() );
296  tlog << MSG::INFO << "Already Configured" << endmsg;
297  return StatusCode::SUCCESS;
298  }
299  else if( Gaudi::StateMachine::OFFLINE != m_state ) {
300  tlog << MSG::FATAL
301  << "configure: Invalid state \"" << m_state << "\"" << endmsg;
302  return StatusCode::FAILURE;
303  }
305 
306  // Reset application return code.
308 
309  StatusCode sc;
310  sc = i_startup();
311  if ( !sc.isSuccess() ) {
312  return sc;
313  }
314 
316 
317  // Get my own options using the Job options service
318  if (log.level() <= MSG::DEBUG)
319  log << MSG::DEBUG << "Getting my own properties" << endmsg;
321  if( !sc.isSuccess() ) {
322  log << MSG::WARNING << "Problems getting my properties from JobOptionsSvc"
323  << endmsg;
324  return sc;
325  }
326 
327  // Check current outputLevel to eventually inform the MessageSvc
328  if( m_outputLevel != MSG::NIL && !m_appName.empty() ) {
329  assert(m_messageSvc);
331  // Print a welcome message
332  log << MSG::ALWAYS
333  << std::endl
334  << "=================================================================="
335  << "=================================================================="
336  << std::endl
337  << " "
338  << " Welcome to " << m_appName;
339 
340  if( "" != m_appVersion ) {
341  log << MSG::ALWAYS << " version " << m_appVersion;
342  }
343  else {
344  log << MSG::ALWAYS
345  << " (GaudiCoreSvc "
346  << "v" << GAUDICORESVC_MAJOR_VERSION
347  << "r" << GAUDICORESVC_MINOR_VERSION
348 #if GAUDICORESVC_PATCH_VERSION
349  << "p" << GAUDICORESVC_PATCH_VERSION
350 #endif
351  << ")";
352  }
353 
354  // Add the host name and current time to the message
355  log << MSG::ALWAYS
356  << std::endl
357  << " "
358  << " running on " << System::hostName()
359  << " on " << Gaudi::Time::current().format(true) << std::endl
360  << "=================================================================="
361  << "=================================================================="
362  << endmsg;
363  }
364 
365  // print all own properties if the options "PropertiesPrint" is set to true
366  if ( m_propertiesPrint )
367  {
368  const auto& properties = m_propertyMgr->getProperties() ;
369  log << MSG::ALWAYS
370  << "List of ALL properties of "
371  << System::typeinfoName ( typeid( *this ) ) << "/" << this->name()
372  << " #properties = " << properties.size() << endmsg ;
373  for ( const auto& property : properties )
374  { log << "Property ['Name': Value] = " << *property << endmsg ; }
375  }
376 
377  // Check if StatusCode need to be checked
378  if (m_codeCheck) {
380  sc = addMultiSvc("StatusCodeSvc", -9999);
381  if ( sc.isFailure() ) {
382  log << MSG::FATAL << "Error adding StatusCodeSvc for multiple threads" << endmsg;
383  return StatusCode::FAILURE;
384  }
385  } else {
387  }
388 
389  // set the requested environment variables
390  for ( auto& var : m_environment ) {
391  const std::string &name = var.first;
392  const std::string &value = var.second;
393  std::string old = System::getEnv(name.c_str());
394  const MSG::Level lvl = (!old.empty() && (old != "UNKNOWN" ))
395  ? MSG::WARNING
396  : MSG::DEBUG;
397  if (UNLIKELY(m_outputLevel <= lvl))
398  log << lvl << "Setting " << name << " = " << value << endmsg;
399  System::setEnv(name,value);
400  }
401 
402  //Declare Service Types
403  for(auto& j : m_svcMapping) {
405  if ( declareMultiSvcType(itm.name(), itm.type()).isFailure() ) {
406  log << MSG::ERROR << "configure: declaring svc type:'" << j << "' failed." << endmsg;
407  return StatusCode::FAILURE;
408  }
409  }
410  for(auto& j : m_svcOptMapping) {
412  if ( declareMultiSvcType(itm.name(), itm.type()).isFailure() ) {
413  log << MSG::ERROR << "configure: declaring svc type:'" << j << "' failed." << endmsg;
414  return StatusCode::FAILURE;
415  }
416  }
417 
418  //--------------------------------------------------------------------------
419  // Declare other Services and Algorithms by loading DLL's
420  sc = decodeDllNameList( );
421  if ( sc.isFailure( ) ) {
422  log << MSG::ERROR << "Failure loading declared DLL's" << endmsg;
423  return sc;
424  }
425 
426  //--------------------------------------------------------------------------
427  // Deal with the services explicitly declared by the user.
428  sc = decodeExtSvcNameList();
429  if ( sc.isFailure( ) ) {
430  log << MSG::ERROR << "Failure during external service association" << endmsg;
431  return sc;
432  }
433 
435  if ( sc.isFailure( ) ) {
436  log << MSG::ERROR << "Failure during multi thread service creation"
437  << endmsg;
438  return sc;
439  }
440 
442  if ( sc.isFailure( ) ) {
443  log << MSG::ERROR << "Failure during external service creation" << endmsg;
444  return sc;
445  }
446 
447 
448  //--------------------------------------------------------------------------
449  // Retrieve intrinsic services. If needed configure them.
450  //--------------------------------------------------------------------------
452  sc = addMultiSvc(evtloop_item, ServiceManager::DEFAULT_SVC_PRIORITY*10);
453  if( !sc.isSuccess() ) {
454  log << MSG::FATAL << "Error adding :" << m_eventLoopMgr << endmsg;
455  return sc;
456  }
457 
458  if (m_noOfEvtThreads == 0) {
460  if( !m_runable ) {
461  log << MSG::FATAL
462  << "Error retrieving Runable:" << m_runableType
463  << "\n Check option ApplicationMgr." << s_runable << endmsg;
464  return sc;
465  }
466  m_processingMgr = m_svcLocator->service(evtloop_item);
467  if( !m_processingMgr ) {
468  log << MSG::FATAL
469  << "Error retrieving Processing manager:" << m_eventLoopMgr
470  << "\n Check option ApplicationMgr." << s_eventloop
471  << "\n No events will be processed." << endmsg;
472  return sc;
473  }
474  }
475 
476  // Establish Update Handlers for ExtSvc and DLLs Properties
478  this);
480  this);
484  this );
485 
486  if (m_actHistory) {
487  // Create HistorySvc with a priority to ensure it's initialized last, finalized first
488  sc = svcManager()->addService("HistorySvc",std::numeric_limits<int>::max());
489  if ( sc.isFailure() ) {
490  log << MSG::FATAL << "Error adding HistorySvc" << endmsg;
491  return StatusCode::FAILURE;
492  }
493 
494  if (m_noOfEvtThreads > 0) {
495  sc = addMultiSvc("HistorySvc",std::numeric_limits<int>::max());
496  if ( sc.isFailure() ) {
497  log << MSG::FATAL << "Error adding HistorySvc for multiple threads"
498  << endmsg;
499  return StatusCode::FAILURE;
500  }
501  }
502  }
503 
504  log << MSG::INFO << "Application Manager Configured successfully" << endmsg;
506  return StatusCode::SUCCESS;
507 }
508 
509 //============================================================================
510 // IAppMgrUI implementation: ApplicationMgr::initialize()
511 //============================================================================
513 
515  StatusCode sc;
516 
517  // I cannot add these services in configure() because they are coming from GaudiUtils
518  // and it messes up genconf when rebuilding it.
519  if (m_stopOnSignal) {
520  // Instantiate the service that schedules a stop when a signal is received
521  std::string svcname("Gaudi::Utils::StopSignalHandler");
522  sc = svcManager()->addService(svcname);
523  if ( sc.isFailure() ) {
524  log << MSG::INFO << "Cannot instantiate " << svcname << "signals will be ignored" << endmsg;
525  }
526  }
527 
529  // Instantiate the service that schedules a stop when a signal is received
530  std::string svcname("StalledEventMonitor");
531  sc = svcManager()->addService(svcname);
532  if ( sc.isFailure() ) {
533  log << MSG::INFO << "Cannot instantiate " << svcname << "signals will be ignored" << endmsg;
534  }
535  }
536 
538  log << MSG::INFO << "Already Initialized!" << endmsg;
539  return StatusCode::SUCCESS;
540  }
542  log << MSG::FATAL
543  << "initialize: Invalid state \"" << m_state << "\"" << endmsg;
544  return StatusCode::FAILURE;
545  }
547 
548  //--------------------------------------------------------------------------
549  // Initialize the list of top Services
550  //--------------------------------------------------------------------------
551  sc = svcManager()->initialize();
552  if( !sc.isSuccess() ) return sc;
553 
554  //--------------------------------------------------------------------------
555  // Final steps: Inform user and change internal state
556  //--------------------------------------------------------------------------
557  log << MSG::INFO << "Application Manager Initialized successfully" << endmsg;
559 
560  return sc;
561 }
562 
563 //============================================================================
564 // IAppMgrUI implementation: ApplicationMgr::start()
565 //============================================================================
567 
569  StatusCode sc;
570 
572  log << MSG::INFO << "Already Initialized!" << endmsg;
573  return StatusCode::SUCCESS;
574  }
576  log << MSG::FATAL
577  << "start: Invalid state \"" << m_state << "\"" << endmsg;
578  return StatusCode::FAILURE;
579  }
581 
582  //--------------------------------------------------------------------------
583  // Initialize the list of top Services
584  //--------------------------------------------------------------------------
585  sc = svcManager()->start();
586  if( !sc.isSuccess() ) return sc;
587 
588  //--------------------------------------------------------------------------
589  // Final steps: Inform user and change internal state
590  //--------------------------------------------------------------------------
591  log << MSG::INFO << "Application Manager Started successfully" << endmsg;
593 
594  return sc;
595 }
596 
597 //============================================================================
598 // IAppMgrUI implementation: ApplicationMgr::nextEvent(int)
599 //============================================================================
603  log << MSG::FATAL << "nextEvent: Invalid state \"" << m_state << "\""
604  << endmsg;
605  return StatusCode::FAILURE;
606  }
607  if (!m_processingMgr) {
609  log << MSG::FATAL << "No event processing manager specified. Check option:"
610  << s_eventloop << endmsg;
611  return StatusCode::FAILURE;
612  }
613  return m_processingMgr->nextEvent(maxevt);
614 }
615 
616 //============================================================================
617 // IAppMgrUI implementation: ApplicationMgr::stop()
618 //============================================================================
620 
622  StatusCode sc;
623 
625  log << MSG::INFO << "Already Initialized!" << endmsg;
626  return StatusCode::SUCCESS;
627  }
628  else if( m_state != Gaudi::StateMachine::RUNNING ) {
629  log << MSG::FATAL
630  << "stop: Invalid state \"" << m_state << "\"" << endmsg;
631  return StatusCode::FAILURE;
632  }
634 
635  // Stop independently managed Algorithms
636  sc = algManager()->stop();
637  if( !sc.isSuccess() ) return sc;
638 
639  //--------------------------------------------------------------------------
640  // Stop the list of top Services
641  //--------------------------------------------------------------------------
642  sc = svcManager()->stop();
643  if( !sc.isSuccess() ) return sc;
644 
645  //--------------------------------------------------------------------------
646  // Final steps: Inform user and change internal state
647  //--------------------------------------------------------------------------
648  log << MSG::INFO << "Application Manager Stopped successfully" << endmsg;
650 
651  return sc;
652 }
653 
654 //============================================================================
655 // IAppMgrUI implementation: ApplicationMgr::finalize()
656 //============================================================================
660  log << MSG::INFO << "Already Finalized" << endmsg;
661  return StatusCode::SUCCESS;
662  }
664  log << MSG::FATAL << "finalize: Invalid state \"" << m_state << "\""
665  << endmsg;
666  return StatusCode::FAILURE;
667  }
669 
670  // disable message suppression in finalize
671  m_svcLocator->service<IProperty>("MessageSvc")->setProperty(BooleanProperty("enableSuppression", false)).ignore();
672 
673  // Finalize independently managed Algorithms
675  if (sc.isFailure()) {
676  log << MSG::WARNING << "Failed to finalize an algorithm." << endmsg;
678  }
679 
680  // Finalize all Services
681  sc = svcManager()->finalize();
682  if (sc.isFailure()) {
683  log << MSG::WARNING << "Failed to finalize a service." << endmsg;
685  }
686 
687  //svcManager()->removeService( (IService*) m_processingMgr.get() );
688  //svcManager()->removeService( (IService*) m_runable.get() );
689 
690  if (m_codeCheck) {
692  }
693 
694  if (sc.isSuccess()) {
695  log << MSG::INFO << "Application Manager Finalized successfully" << endmsg;
696  } else {
697  log << MSG::ERROR << "Application Manager failed to finalize" << endmsg;
698  }
699 
701  return sc;
702 }
703 
704 //============================================================================
705 // IAppMgrUI implementation: ApplicationMgr::terminate()
706 //============================================================================
709 
711  log << MSG::INFO << "Already Offline" << endmsg;
712  return StatusCode::SUCCESS;
713  }
715  log << MSG::FATAL << "terminate: Invalid state \"" << m_state << "\""
716  << endmsg;
717  return StatusCode::FAILURE;
718  }
719  // release all Services
721 
723  log << MSG::INFO << "Application Manager Terminated successfully" << endmsg;
725  log << MSG::INFO << "Application Manager Terminated successfully with a user requested ScheduledStop" << endmsg;
726  } else {
727  log << MSG::ERROR << "Application Manager Terminated with error code " << m_returnCode.value() << endmsg;
728  }
729 
730  { // Force a disable the auditing of finalize for MessageSvc
731  auto prop = m_messageSvc.as<IProperty>();
732  if (prop) {
733  prop->setProperty(BooleanProperty("AuditFinalize", false)).ignore();
734  }
735  }
736  { // Force a disable the auditing of finalize for JobOptionsSvc
737  auto prop = m_jobOptionsSvc.as<IProperty>();
738  if (prop) {
739  prop->setProperty(BooleanProperty("AuditFinalize", false)).ignore();
740  }
741  }
742 
743  // finalize MessageSvc
744  auto svc = m_messageSvc.as<IService>();
745  if ( !svc ) {
746  log << MSG::ERROR << "Could not get the IService interface of the MessageSvc" << endmsg;
747  } else {
748  svc->sysFinalize().ignore();
749  }
750 
751  // finalize JobOptionsSvc
752  svc = m_jobOptionsSvc.as<IService>();
753  if ( !svc ) {
754  log << MSG::ERROR << "Could not get the IService interface of the JobOptionsSvc" << endmsg;
755  } else {
756  svc->sysFinalize().ignore();
757  }
758 
760  return StatusCode::SUCCESS;
761 }
762 
763 //============================================================================
764 // Reach the required state going through all the needed transitions
765 //============================================================================
768 
769  switch (state) {
770 
772  switch (m_state) {
774  case Gaudi::StateMachine::CONFIGURED : return terminate(); break;
775  default: // Gaudi::StateMachine::INITIALIZED or Gaudi::StateMachine::RUNNING
777  if (sc.isSuccess()) {
778  return terminate();
779  } break;
780  } break;
781 
783  switch (m_state) {
785  case Gaudi::StateMachine::OFFLINE : return configure(); break;
786  case Gaudi::StateMachine::INITIALIZED : return finalize(); break;
787  default: // Gaudi::StateMachine::RUNNING
789  if (sc.isSuccess()) {
790  return finalize();
791  } break;
792  } break;
793 
795  switch (m_state) {
797  case Gaudi::StateMachine::CONFIGURED : return initialize(); break;
798  case Gaudi::StateMachine::RUNNING : return stop(); break;
799  default: // Gaudi::StateMachine::OFFLINE
801  if (sc.isSuccess()) {
802  return initialize();
803  } break;
804  } break;
805 
807  switch (m_state) {
809  case Gaudi::StateMachine::INITIALIZED : return start(); break;
810  default: // Gaudi::StateMachine::OFFLINE or Gaudi::StateMachine::CONFIGURED
812  if (sc.isSuccess()) {
813  return start();
814  } break;
815  } break;
816 
817  }
818 
819  // If I get here, there has been a problem in the recursion
820 
821  if (ignoreFailures){
822  // force the new state
823  m_state = state;
824  return StatusCode::SUCCESS;
825  }
826 
827  return sc;
828 }
829 
830 //============================================================================
831 // IAppMgrUI implementation: ApplicationMgr::run()
832 //============================================================================
835 
837  if ( sc.isSuccess() ) {
839  if ( m_runable != 0 ) { // loop over the events
840  sc = m_runable->run();
841  if ( !sc.isSuccess() ) {
842  log << MSG::FATAL << "Application execution failed. Ending the job."
843  << endmsg;
844  }
845  } else {
846  log << MSG::FATAL << "Application has no runable object. Check option:"
847  << s_runable << endmsg;
848  }
849  }
850  if (sc.isSuccess()) { // try to close cleanly
852  }
853  // either the runable failed of the stut-down
854  if (sc.isFailure()) { // try to close anyway (but keep the StatusCode unchanged)
856  }
857  return sc;
858 }
859 
860 //============================================================================
861 // IEventProcessor implementation: executeEvent(void* par)
862 //============================================================================
866  if ( m_processingMgr ) {
867  return m_processingMgr->executeEvent(par);
868  }
869  }
870  log << MSG::FATAL << "executeEvent: Invalid state \"" << FSMState() << "\""
871  <<endmsg;
872  return StatusCode::FAILURE;
873 }
874 
875 //============================================================================
876 // IEventProcessor implementation: executeRun(int)
877 //============================================================================
881  if ( m_processingMgr ) {
882  return m_processingMgr->executeRun(evtmax);
883  }
884  log << MSG::WARNING << "No EventLoop Manager specified " << endmsg;
885  return StatusCode::SUCCESS;
886  }
887  log << MSG::FATAL << "executeRun: Invalid state \"" << FSMState() << "\""
888  << endmsg;
889  return StatusCode::FAILURE;
890 }
891 
892 //============================================================================
893 // IEventProcessor implementation: stopRun(int)
894 //============================================================================
898  if ( m_processingMgr ) {
899  return m_processingMgr->stopRun();
900  }
901  log << MSG::WARNING << "No EventLoop Manager specified " << endmsg;
902  return StatusCode::SUCCESS;
903  }
904  log << MSG::FATAL << "stopRun: Invalid state \"" << FSMState() << "\""
905  << endmsg;
906  return StatusCode::FAILURE;
907 }
908 // Implementation of IAppMgrUI::name
909 const std::string& ApplicationMgr::name() const {
910  return m_name;
911 }
912 
913 // implementation of IService::state
915  return m_state;
916 }
917 // implementation of IService::state
919  return m_targetState;
920 }
921 
922 
923 //============================================================================
924 // implementation of IService::reinitilaize
925 //============================================================================
928  StatusCode sc;
930  throw GaudiException("Cannot reinitialize application if not INITIALIZED or RUNNING",
931  "ApplicationMgr::reinitialize", StatusCode::FAILURE);
932  }
935  }
936  sc = svcManager()->reinitialize();
937  if (sc.isFailure()) retval = sc;
938  sc = algManager()->reinitialize();
939  if (sc.isFailure()) retval = sc;
940  return retval;
941 }
942 
943 //============================================================================
944 // implementation of IService::reinitiaize
945 //============================================================================
948  StatusCode sc;
950  throw GaudiException("Cannot restart application if not RUNNING",
951  "ApplicationMgr::restart", StatusCode::FAILURE);
952  }
953  sc = svcManager()->restart();
954  if (sc.isFailure()) retval = sc;
955  sc = algManager()->restart();
956  if (sc.isFailure()) retval = sc;
957  return retval;
958 }
959 
960 //============================================================================
961 // SI Go Handler
962 //============================================================================
964 
966  StatusCode sc;
967 
968  // Re-initialize everything
969  sc = reinitialize();
970  // Execute a number of events
972 
973  return;
974 }
975 
976 //============================================================================
977 // SI Exit Handler
978 //============================================================================
980  StatusCode status;
981  status = finalize();
982  status = terminate();
983  ::exit( 0 );
984 }
985 
986 //============================================================================
987 // Handle properties of the event loop manager (Top alg/Output stream list)
988 //============================================================================
990  if ( m_processingMgr ) {
991  auto props = m_processingMgr.as<IProperty>();
992  if ( props ) props->setProperty( p ).ignore();
993  }
994 }
995 
996 //============================================================================
997 // External Service List handler
998 //============================================================================
1000  if ( !(decodeCreateSvcNameList()).isSuccess() ) {
1001  throw GaudiException("Failed to create ext services",
1002  "MinimalEventLoopMgr::createSvcNameListHandler",
1004  }
1005 }
1006 //============================================================================
1007 // decodeCreateSvcNameList
1008 //============================================================================
1011  const auto& theNames = m_createSvcNameList.value( );
1012  auto it = theNames.begin();
1013  auto et = theNames.end();
1014  while(result.isSuccess() && it != et) {
1016  if( (result = svcManager()->addService(item, ServiceManager::DEFAULT_SVC_PRIORITY) ).isFailure()) {
1018  log << MSG::ERROR << "decodeCreateSvcNameList: Cannot create service "
1019  << item.type() << "/" << item.name() << endmsg;
1020  } else {
1021  ON_DEBUG {
1023  log << MSG::DEBUG << "decodeCreateSvcNameList: Created service "
1024  << item.type() << "/" << item.name() << endmsg;
1025  }
1026  }
1027  }
1028  return result;
1029 }
1030 
1031 //============================================================================
1032 // External Service List handler
1033 //============================================================================
1035  if ( !(decodeExtSvcNameList( )).isSuccess() ) {
1036  throw GaudiException("Failed to declare ext services",
1037  "MinimalEventLoopMgr::extSvcNameListHandler",
1039  }
1040 }
1041 
1042 //============================================================================
1043 // decodeExtSvcNameList
1044 //============================================================================
1047 
1048  const auto& theNames = m_extSvcNameList.value( );
1049 
1050  auto it = theNames.begin();
1051  auto et = theNames.end();
1052  while(result.isSuccess() && it != et) {
1054  if (m_extSvcCreates) {
1055  if ( (result = svcManager()->addService(item, ServiceManager::DEFAULT_SVC_PRIORITY)).isFailure()) {
1057  log << MSG::ERROR << "decodeExtSvcNameList: Cannot create service "
1058  << item.type() << "/" << item.name() << endmsg;
1059  }
1060  } else {
1061  if( ( result = svcManager()->declareSvcType(item.name(),
1062  item.type()) ).isFailure()) {
1064  log << MSG::ERROR << "decodeExtSvcNameList: Cannot declare service "
1065  << item.type() << "/" << item.name() << endmsg;
1066  }
1067  }
1068  }
1069  return result;
1070 }
1071 
1072 //============================================================================
1073 // External Service List handler
1074 //============================================================================
1076  if ( !(decodeMultiThreadSvcNameList( )).isSuccess() ) {
1077  throw GaudiException("Failed to create copies of mt services",
1078  "MinimalEventLoopMgr::multiThreadSvcNameListHandler",
1080  }
1081 
1082 }
1083 
1084 //============================================================================
1085 // decodeMultiExtSvcNameList
1086 //============================================================================
1089  const auto& theNames = m_multiThreadSvcNameList.value( );
1090  for(int iCopy=0; iCopy<m_noOfEvtThreads; ++iCopy) {
1091  for (const auto& it : theNames ) {
1093  result = addMultiSvc(item, ServiceManager::DEFAULT_SVC_PRIORITY);
1094  //FIXME SHOULD CLONE?
1095  if( result.isFailure() ) {
1097  log << MSG::ERROR
1098  << "decodeMultiThreadSvcNameList: Cannot create service "
1099  << item.type() << "/" << item.name() << endmsg;
1100  } else {
1101  ON_VERBOSE {
1103  log << MSG::VERBOSE
1104  << "decodeMultiThreadSvcNameList: created service "
1105  << item.type() << "/" << item.name() << endmsg;
1106  }
1107  }
1108  }
1109  }
1110  return result;
1111 }
1112 //=============================================================================
1113 // declareMultiSvcType
1114 //=============================================================================
1116  const std::string& type) {
1119  if (0 == m_noOfEvtThreads) {
1120  result = svcManager()->declareSvcType(name, type);
1121  if( result.isFailure() ) {
1122  log << MSG::ERROR << "declareMultiSvcType: Cannot declare service "
1123  << type << "/" << name << endmsg;
1124  } else {
1125  ON_VERBOSE
1126  log << MSG::VERBOSE << "declareMultiSvcType: declared service "
1127  << type << "/" << name << endmsg;
1128  }
1129  } else {
1130  for(int iCopy=0; iCopy<m_noOfEvtThreads; ++iCopy) {
1131  std::string thrName(name + getGaudiThreadIDfromID(iCopy));
1132  result = svcManager()->declareSvcType(thrName, type);
1133  if( result.isFailure() ) {
1134  log << MSG::ERROR << "declareMultiSvcType: Cannot declare service "
1135  << type << "/" << thrName << endmsg;
1136  } else {
1137  ON_VERBOSE
1138  log << MSG::VERBOSE << "declareMultiSvcType: declared service "
1139  << type << "/" << thrName << endmsg;
1140  }
1141  }
1142  }
1143  return result;
1144 }
1145 //=============================================================================
1146 // addMultiSvc
1147 //=============================================================================
1149  int prio) {
1153  if (0 == m_noOfEvtThreads) {
1154  result = svcManager()->addService(typeName, prio);
1155  // result = svcManager()->addService(name, type, prio); // CHECKME???
1156  if( result.isFailure() ) {
1157  log << MSG::ERROR << "addMultiSvc: Cannot add service "
1158  << typeName.type() << "/" << typeName.name() << endmsg;
1159  } else {
1160  ON_VERBOSE
1161  log << MSG::VERBOSE << "addMultiSvc: added service "
1162  << typeName.type() << "/" << typeName.name() << endmsg;
1163  }
1164  } else {
1165  for(int iCopy=0; iCopy<m_noOfEvtThreads; ++iCopy) {
1166  const std::string &type = typeName.type();
1167  std::string thrName(typeName.name() + getGaudiThreadIDfromID(iCopy));
1168  result = svcManager()->addService(TypeNameString(thrName, type), prio);
1169  if( result.isFailure() ) {
1170  log << MSG::ERROR << "addMultiSvc: Cannot add service "
1171  << type << "/" << thrName << endmsg;
1172  } else {
1173  ON_VERBOSE
1174  log << MSG::VERBOSE << "addMultiSvc: added service "
1175  << type << "/" << thrName << endmsg;
1176  }
1177  }
1178  }
1179  return result;
1180 }
1181 
1182 //============================================================================
1183 // Dll List handler
1184 //============================================================================
1186  if ( !(decodeDllNameList( )).isSuccess() ) {
1187  throw GaudiException("Failed to load DLLs.",
1188  "MinimalEventLoopMgr::dllNameListHandler",
1190  }
1191 }
1192 
1193 //============================================================================
1194 // decodeDllNameList
1195 //============================================================================
1197 
1200 
1201  // Clean up multiple entries from DLL list
1202  // -------------------------------------------------------------------------
1203  std::vector<std::string> newList;
1204  std::map<std::string,unsigned int> dllInList, duplicateList;
1205  {for ( const auto it : m_dllNameList.value()) {
1206  if ( 0 == dllInList[it] ) {
1207  newList.push_back(it); // first instance of this module
1208  } else { ++duplicateList[it]; } // module listed multiple times
1209  ++dllInList[it]; // increment count for this module
1210  }}
1211  //m_dllNameList = newList; // update primary list to new, filtered list (do not use the
1212  // property itself otherwise we get called again infinitely)
1213  // List modules that were in there twice..
1214  ON_DEBUG if ( !duplicateList.empty() ) {
1215  log << MSG::DEBUG << "Removed duplicate entries for modules : ";
1216  for ( auto it = duplicateList.begin(); it != duplicateList.end(); ++it ) {
1217  log << it->first << "(" << 1+it->second << ")";
1218  if ( it != --duplicateList.end() ) log << ", ";
1219  }
1220  log << endmsg;
1221  }
1222  // -------------------------------------------------------------------------
1223 
1224  const std::vector<std::string>& theNames = newList;
1225 
1226  // only load the new dlls or previously failed dlls
1227  ON_DEBUG log << MSG::DEBUG << "Loading declared DLL's" << endmsg;
1228 
1229  std::vector<std::string> successNames, failNames;
1230  for (const auto& it : theNames) {
1231  if (std::find (m_okDlls.rbegin(), m_okDlls.rend(), it) == m_okDlls.rend()){
1232  // found a new module name
1233  StatusCode status = m_classManager->loadModule( it );
1234  if( status.isFailure() ) {
1235  failNames.push_back(it);
1236  result = StatusCode::FAILURE;
1237  }
1238  else {
1239  successNames.push_back(it);
1240  }
1241  }
1242  }
1243 
1244  // report back to the user and store the names of the succesfully loaded dlls
1245  if ( !successNames.empty() ) {
1246  log << MSG::INFO << "Successfully loaded modules : ";
1247  for (auto it = successNames.begin(); it != successNames.end(); it++) {
1248  log<< (*it);
1249  if( (it+1) != successNames.end()) log << ", ";
1250  // save name
1251  m_okDlls.push_back( *it );
1252  }
1253  log << endmsg;
1254  }
1255 
1256  if ( result == StatusCode::FAILURE ) {
1257  log << MSG::WARNING << "Failed to load modules: ";
1258  for (auto it = failNames.begin(); it != failNames.end(); it++) {
1259  log<< (*it);
1260  if( (it+1) != failNames.end()) log << ", ";
1261  }
1262  log << endmsg;
1263  }
1264  return result;
1265 }
1266 
1267 //============================================================================
1268 // Plugin debug level handler
1269 //============================================================================
1271 {
1272  // Setup debug level for the plugin system
1274  log << MSG::INFO
1275  << "Updating Gaudi::PluginService::SetDebug(level) to level="
1276  << (int)m_pluginDebugLevel
1277  << endmsg;
1279 }
1280 
1281 //============================================================================
1282 // Init loop check handler
1283 //============================================================================
1286 }
The ServiceManager class is in charge of the creation of concrete instances of Services.
void dllNameListHandler(Property &theProp)
Gaudi::StateMachine::State m_targetState
Internal State.
The AlgorithmManager class is in charge of the creation of concrete instances of Algorithms.
StatusCode initialize() override
std::string m_jobOptionsType
Source type (e.g. dbase, file...)
constexpr int FinalizationFailure
Error codes for operation failures.
Definition: AppReturnCode.h:32
StringArrayProperty m_createSvcNameList
void createSvcNameListHandler(Property &)
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
virtual StatusCode stopRun()=0
Schedule a stop of the current event processing.
StringProperty m_messageSvcType
MessageSvc type.
virtual StatusCode run()=0
Run the class implementation.
Define general base for Gaudi exception.
StatusCode decodeDllNameList()
StatusCode loadModule(const std::string &module, bool fireIncident=true) override
SmartIF< IRunable > m_runable
Reference to the runable object.
tuple itm
Definition: ana.py:57
MSG::Level level()
Retrieve output level.
Definition: MsgStream.h:112
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
int m_noOfEvtThreads
no of multiThreadSvc copies
bool m_codeCheck
Activate StatusCode checking.
static Time current(void)
Returns the current time.
Definition: Time.cpp:113
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:76
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:299
std::string m_appName
The name of the application.
IntegerProperty m_pluginDebugLevel
Debug level for the plugin system.
virtual StatusCode executeEvent(void *par=0)=0
Process single event.
static GAUDI_API void enableChecking()
Definition: StatusCode.cpp:19
std::vector< std::string > m_okDlls
names of successfully loaded dlls
std::map< std::string, std::string > m_environment
Environment variables to set.
State
Allowed states for classes implementing the state machine (ApplicationMgr, Algorithm, Service, AlgTool).
Definition: StateMachine.h:12
#define DECLARE_OBJECT_FACTORY(x)
Definition: ObjectFactory.h:17
StringArrayProperty m_dllNameList
List of DDL's names.
StatusCode nextEvent(int maxevt) override
SmartIF< IJobOptionsSvc > m_jobOptionsSvc
Reference to JobOption service.
AlgTypeAliasesMap & typeAliases()
Property manager helper class.
Definition: PropertyMgr.h:34
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.
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:86
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:25
GAUDI_API int setEnv(const std::string &name, const std::string &value, int overwrite=1)
Set an environment variables.
Definition: System.cpp:747
int m_outputLevel
Message output level.
StatusCode addMultiSvc(const Gaudi::Utils::TypeNameString &typeName, int prio)
add one or more copies of svc type/name as determined by NoOfThreads
int m_evtMax
Number of events to be processed.
virtual StatusCode nextEvent(int maxevt)=0
Process the next maxevt events.
IntegerProperty m_returnCode
Property to record the error conditions occurring during the running.
void multiThreadSvcNameListHandler(Property &theProp)
StatusCode service(const Gaudi::Utils::TypeNameString &name, T *&svc, bool createIf=true)
Templated method to access a service by name.
Definition: ISvcLocator.h:78
SimpleProperty< bool > BooleanProperty
Definition: Property.h:702
Interface ID class.
Definition: IInterface.h:30
SmartIF< IFace > as() const
return a new SmartIF instance to another interface
Definition: SmartIF.h:110
Helper class to parse a string of format "type/name".
Definition: TypeNameString.h:9
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).
std::string m_jobOptionsPath
The "file" to look for properties.
BooleanProperty m_extSvcCreates
LHCb or ATLAS defn of "ExtSvc".
auto end(reverse_wrapper< T > &w)
Definition: reverse.h:47
General service interface definition.
Definition: IService.h:18
VectorName m_svcMapping
Default mapping of services.
#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...
Definition of the basic interface.
Definition: IInterface.h:234
virtual StatusCode setMyProperties(const std::string &client, IProperty *me)=0
Override default properties of the calling client.
virtual StatusCode setProperty(const Property &p)=0
Set the property by property.
bool m_actHistory
Activate HistorySvc.
GAUDI_API bool isEnvSet(const char *var)
Check if an environment variable is set or not.
Definition: System.cpp:639
const std::vector< Property * > & getProperties() const override
get all properties
BooleanProperty m_loopCheck
For ServiceMgr initialization loop checking.
bool PyHelper() setProperty(IInterface *p, char *name, char *value)
Definition: Bootstrap.cpp:255
GAUDI_API std::string getEnv(const char *var)
get a particular environment variable (returning "UNKNOWN" if not set)
Definition: System.cpp:619
SimpleProperty< std::string > StringProperty
Definition: Property.h:718
SimpleProperty< int > IntegerProperty
Definition: Property.h:708
GAUDI_API std::string getGaudiThreadIDfromID(int iCopy)
helper function to extract Gaudi Thread ID from thread copy number
Definition: ThreadGaudi.cpp:16
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
virtual StatusCode initialize()=0
Initialization (from CONFIGURED to INITIALIZED).
const TYPE & value() const
explicit conversion
Definition: Property.h:341
StringArrayProperty m_multiThreadSvcNameList
List of external services names for which we want a copy per evt thread.
VectorName m_svcOptMapping
Default mapping of services.
StatusCode executeEvent(void *par) override
implementation of IEventProcessor::executeEvent(void*)
The Application Manager class.
std::string m_runableType
Runable type.
StatusCode queryInterface(const InterfaceID &iid, void **pinterface) override
StatusCode decodeExtSvcNameList()
SmartIF< PropertyMgr > m_propertyMgr
Reference to Property Manager.
void initLoopCheckHndlr(Property &)
bool m_propertiesPrint
flag to activate the printout of properties
Property base class allowing Property* collections to be "homogeneous".
Definition: Property.h:38
void SIGoHandler(Property &theProp)
GAUDIPS_API void SetDebug(int debugLevel)
Backward compatibility with Reflex.
SmartIF< DLLClassManager > m_classManager
Reference to the class manager.
StatusCode start() override
StatusCode restart() override
StatusCode configure() override
StringArrayProperty m_extSvcNameList
List of external services names.
StringProperty m_jobOptionsSvcType
JobOptionsSvc type.
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()
void evtLoopPropertyHandler(Property &theProp)
virtual StatusCode finalize()=0
Finalize (from INITIALIZED to CONFIGURED).
BooleanProperty m_stalledEventMonitoring
Property to enable/disable the monitoring and reporting of stalled events (enabled by default)...
GAUDI_API const std::string & hostName()
Host name.
Definition: System.cpp:440
std::string m_eventLoopMgr
Processing manager type.
tuple item
print s1,s2
Definition: ana.py:146
void SIExitHandler(Property &theProp)
MsgStream & fatal() const
shortcut for the method msgStream(MSG::FATAL)
StatusCode i_startup()
Internal startup routine.
StatusCode stop() override
std::string m_name
Name.
virtual void declareUpdateHandler(std::function< void(Property &)> fun)
set new callback for update
Definition: Property.cpp:71
static GAUDI_API void disableChecking()
Definition: StatusCode.cpp:23
#define ON_VERBOSE
StatusCode reinitialize() override
#define UNLIKELY(x)
Definition: Kernel.h:126
Gaudi::StateMachine::State m_state
Internal State.
Gaudi::StateMachine::State FSMState() const override
const std::string & name() const
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)
void ignore() const
Definition: StatusCode.h:108
constexpr int Success
Definition: AppReturnCode.h:16
StatusCode run() override
std::string typeName(const std::type_info &typ)
Definition: Dictionary.cpp:21
StatusCode decodeMultiThreadSvcNameList()
The IProperty is the basic interface for all components which have properties that can be set or get...
Definition: IProperty.h:21
SmartIF< IAlgManager > & algManager()
void extSvcNameListHandler(Property &theProp)
void pluginDebugPropertyHandler(Property &theProp)
BooleanProperty m_stopOnSignal
Property to enable/disable the "stop on signal" service (enabled by default).
static const InterfaceID & interfaceID()
Return an instance of InterfaceID identifying the interface.
Definition: IInterface.h:243
const std::string & name() const override
std::string m_appVersion
The version of the application.
SmartIF< IMessageSvc > m_messageSvc
Reference to the message service.
virtual void setOutputLevel(int new_level)=0
Set new global output level threshold.
Gaudi::StateMachine::State targetFSMState() const override
string type
Definition: gaudirun.py:151
std::string format(bool local, std::string spec="%c") const
Format the time using strftime.
Definition: Time.cpp:279
StatusCode declareMultiSvcType(const std::string &name, const std::string &type)
declare one or more copies of svc type/name as determined by NoOfThreads