00001
00002
00003
00004 #include "ApplicationMgr.h"
00005 #include "ServiceManager.h"
00006 #include "AlgorithmManager.h"
00007 #include "DLLClassManager.h"
00008
00009 #include "GaudiKernel/TypeNameString.h"
00010 #include "GaudiKernel/IService.h"
00011 #include "GaudiKernel/IRunable.h"
00012 #include "GaudiKernel/IMessageSvc.h"
00013 #include "GaudiKernel/IJobOptionsSvc.h"
00014
00015 #include "GaudiKernel/SmartIF.h"
00016 #include "GaudiKernel/MsgStream.h"
00017 #include "GaudiKernel/PropertyMgr.h"
00018 #include "GaudiKernel/ObjectFactory.h"
00019
00020 #include "GaudiKernel/GaudiException.h"
00021 #include "GaudiKernel/ThreadGaudi.h"
00022
00023 #include "GaudiKernel/StatusCode.h"
00024
00025 #include <algorithm>
00026 #include <cassert>
00027 #include <ctime>
00028 #include <limits>
00029
00030 DECLARE_OBJECT_FACTORY(ApplicationMgr)
00031
00032 static const char* s_eventloop = "EventLoop";
00033 static const char* s_runable = "Runable";
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 ApplicationMgr::ApplicationMgr(IInterface*): base_class() {
00045
00046 addRef();
00047
00048
00049 m_messageSvc = 0;
00050 m_jobOptionsSvc = 0;
00051
00052
00053 m_managers[IService::interfaceID().id()] = new ServiceManager(this);
00054 m_managers[IAlgorithm::interfaceID().id()] = new AlgorithmManager(this);
00055
00056 m_svcLocator = svcManager();
00057
00058
00059
00060 m_classManager = new DLLClassManager(this);
00061 m_propertyMgr = new PropertyMgr(this);
00062
00063 m_name = "ApplicationMgr";
00064 m_state = Gaudi::StateMachine::OFFLINE;
00065 m_targetState = Gaudi::StateMachine::OFFLINE;
00066
00067 m_propertyMgr->declareProperty("Go", m_SIGo = 0 );
00068 m_propertyMgr->declareProperty("Exit", m_SIExit = 0 );
00069 m_propertyMgr->declareProperty("Dlls", m_dllNameList );
00070 m_propertyMgr->declareProperty("ExtSvc", m_extSvcNameList );
00071 m_propertyMgr->declareProperty("CreateSvc", m_createSvcNameList );
00072 m_propertyMgr->declareProperty("ExtSvcCreates", m_extSvcCreates=true );
00073
00074 m_propertyMgr->declareProperty("SvcMapping", m_svcMapping );
00075 m_propertyMgr->declareProperty("SvcOptMapping", m_svcOptMapping );
00076
00077 m_propertyMgr->declareProperty("TopAlg", m_topAlgNameList );
00078 m_propertyMgr->declareProperty("OutStream", m_outStreamNameList );
00079 m_propertyMgr->declareProperty("OutStreamType", m_outStreamType = "OutputStream" );
00080 m_propertyMgr->declareProperty("MessageSvcType",m_messageSvcType= "MessageSvc" );
00081 m_propertyMgr->declareProperty("JobOptionsSvcType",
00082 m_jobOptionsSvcType = "JobOptionsSvc" );
00083 m_propertyMgr->declareProperty( s_runable, m_runableType = "AppMgrRunable");
00084 m_propertyMgr->declareProperty( s_eventloop, m_eventLoopMgr = "EventLoopMgr");
00085
00086 m_propertyMgr->declareProperty("HistogramPersistency", m_histPersName="NONE");
00087
00088
00089 m_propertyMgr->declareProperty("JobOptionsType", m_jobOptionsType = "FILE");
00090 m_propertyMgr->declareProperty("JobOptionsPath", m_jobOptionsPath = "");
00091 m_propertyMgr->declareProperty("EvtMax", m_evtMax = -1);
00092 m_propertyMgr->declareProperty("EvtSel", m_evtsel );
00093 m_propertyMgr->declareProperty("OutputLevel", m_outputLevel = MSG::INFO);
00094
00095 m_propertyMgr->declareProperty("MultiThreadExtSvc", m_multiThreadSvcNameList);
00096 m_propertyMgr->declareProperty("NoOfThreads", m_noOfEvtThreads = 0);
00097 m_propertyMgr->declareProperty("AppName", m_appName = "ApplicationMgr");
00098 m_propertyMgr->declareProperty("AppVersion", m_appVersion = "");
00099
00100 m_propertyMgr->declareProperty("AuditTools", m_auditTools = false);
00101 m_propertyMgr->declareProperty("AuditServices", m_auditSvcs = false);
00102 m_propertyMgr->declareProperty("AuditAlgorithms", m_auditAlgs = false);
00103
00104 m_propertyMgr->declareProperty("ActivateHistory", m_actHistory = false);
00105 m_propertyMgr->declareProperty("StatusCodeCheck", m_codeCheck = false);
00106
00107 m_propertyMgr->declareProperty("Environment", m_environment);
00108
00109
00110 m_propertyMgr->declareProperty("InitializationLoopCheck", m_loopCheck = true)
00111 ->declareUpdateHandler(&ApplicationMgr::initLoopCheckHndlr, this);
00112 svcManager()->setLoopCheckEnabled(m_loopCheck);
00113
00114
00115 m_propertyMgr->declareProperty
00116 ( "PropertiesPrint",
00117 m_propertiesPrint = false,
00118 "Flag to activate the printout of properties" );
00119
00120 m_propertyMgr->declareProperty("ReflexPluginDebugLevel", m_reflexDebugLevel = 0 );
00121
00122 m_propertyMgr->declareProperty("StopOnSignal", m_stopOnSignal = false,
00123 "Flag to enable/disable the signal handler that schedule a stop of the event loop");
00124
00125 m_propertyMgr->declareProperty("StalledEventMonitoring", m_stalledEventMonitoring = false,
00126 "Flag to enable/disable the monitoring and reporting of stalled events");
00127
00128 m_propertyMgr->declareProperty("ReturnCode", m_returnCode = 0,
00129 "Return code of the application. Set internally in case of error conditions.");
00130
00131
00132 m_SIGo.declareUpdateHandler ( &ApplicationMgr::SIGoHandler , this );
00133 m_SIExit.declareUpdateHandler( &ApplicationMgr::SIExitHandler , this );
00134 m_topAlgNameList.declareUpdateHandler(&ApplicationMgr::evtLoopPropertyHandler, this);
00135 m_outStreamNameList.declareUpdateHandler(&ApplicationMgr::evtLoopPropertyHandler, this);
00136 m_outStreamType.declareUpdateHandler(&ApplicationMgr::evtLoopPropertyHandler, this);
00137 m_reflexDebugLevel.declareUpdateHandler(&ApplicationMgr::reflexDebugPropertyHandler, this);
00138 m_svcMapping.push_back("EvtDataSvc/EventDataSvc");
00139 m_svcMapping.push_back("DetDataSvc/DetectorDataSvc");
00140 m_svcMapping.push_back("HistogramSvc/HistogramDataSvc");
00141 m_svcMapping.push_back("HbookCnv::PersSvc/HbookHistSvc");
00142 m_svcMapping.push_back("RootHistCnv::PersSvc/RootHistSvc");
00143 m_svcMapping.push_back("EvtPersistencySvc/EventPersistencySvc");
00144 m_svcMapping.push_back("DetPersistencySvc/DetectorPersistencySvc");
00145 m_svcMapping.push_back("HistogramPersistencySvc/HistogramPersistencySvc");
00146 }
00147
00148
00149
00150
00151 ApplicationMgr::~ApplicationMgr() {
00152 if( m_classManager ) m_classManager->release();
00153 if( m_propertyMgr ) m_propertyMgr->release();
00154 if( m_messageSvc ) m_messageSvc->release();
00155 if( m_jobOptionsSvc ) m_jobOptionsSvc->release();
00156 }
00157
00158
00159
00160
00161 StatusCode ApplicationMgr::queryInterface
00162 ( const InterfaceID& iid ,
00163 void** ppvi )
00164 {
00165 if ( 0 == ppvi ) { return StatusCode::FAILURE ; }
00166
00167
00168 StatusCode sc = base_class::queryInterface(iid,ppvi);
00169 if (sc.isSuccess()) return sc;
00170
00171
00172 if ( ISvcLocator ::interfaceID() . versionMatch ( iid ) )
00173 { return serviceLocator()-> queryInterface ( iid , ppvi ) ; }
00174 else if ( ISvcManager ::interfaceID() . versionMatch ( iid ) )
00175 { return svcManager() -> queryInterface ( iid , ppvi ) ; }
00176 else if ( IAlgManager ::interfaceID() . versionMatch ( iid ) )
00177 { return algManager() -> queryInterface ( iid , ppvi ) ; }
00178 else if ( IClassManager ::interfaceID() . versionMatch ( iid ) )
00179 { return m_classManager -> queryInterface ( iid , ppvi ) ; }
00180 else if ( IProperty ::interfaceID() . versionMatch ( iid ) )
00181 { return m_propertyMgr -> queryInterface ( iid , ppvi ) ; }
00182 else if ( IMessageSvc ::interfaceID() . versionMatch ( iid ) )
00183 {
00184 *ppvi = reinterpret_cast<void*>(m_messageSvc.get());
00185 if (m_messageSvc) {
00186 m_messageSvc->addRef();
00187 }
00188
00189
00190 return StatusCode::SUCCESS;
00191 }
00192 *ppvi = 0;
00193 return StatusCode::FAILURE;
00194 }
00195
00196
00197
00198
00199 StatusCode ApplicationMgr::i_startup() {
00200 StatusCode sc;
00201
00202
00203 m_classManager->loadModule("").ignore();
00204
00205
00206 SmartIF<IService> msgsvc = svcManager()->createService(Gaudi::Utils::TypeNameString("MessageSvc", m_messageSvcType));
00207 if( !msgsvc.isValid() ) {
00208 fatal() << "Error creating MessageSvc of type " << m_messageSvcType << endmsg;
00209 return sc;
00210 }
00211
00212 SmartIF<IService> jobsvc = svcManager()->createService(Gaudi::Utils::TypeNameString("JobOptionsSvc", m_jobOptionsSvcType));
00213 if( !jobsvc.isValid() ) {
00214 fatal() << "Error creating JobOptionsSvc" << endmsg;
00215 return sc;
00216 }
00217
00218 SmartIF<IProperty> jobOptsIProp(jobsvc);
00219 if ( !jobOptsIProp.isValid() ) {
00220 fatal() << "Error locating JobOptionsSvc" << endmsg;
00221 return sc;
00222 }
00223 sc = jobOptsIProp->setProperty( StringProperty("TYPE", m_jobOptionsType) );
00224 if( !sc.isSuccess() ) {
00225 fatal() << "Error setting TYPE option in JobOptionsSvc" << endmsg;
00226 return sc;
00227 }
00228
00229 if ( m_jobOptionsPath != "") {
00230 sc = jobOptsIProp->setProperty( StringProperty("PATH", m_jobOptionsPath) );
00231 if( !sc.isSuccess() ) {
00232 fatal() << "Error setting PATH option in JobOptionsSvc" << endmsg;
00233 return sc;
00234 }
00235 }
00236 else if ( 0 != getenv("JOBOPTPATH") ) {
00237 sc = jobOptsIProp->setProperty (StringProperty("PATH",
00238 getenv("JOBOPTPATH")));
00239 if( !sc.isSuccess() ) {
00240 fatal()
00241 << "Error setting PATH option in JobOptionsSvc from env"
00242 << endmsg;
00243 return sc;
00244 }
00245 }
00246 else {
00247 sc = jobOptsIProp->setProperty (StringProperty("PATH",
00248 "../options/job.opts"));
00249 if( !sc.isSuccess() ) {
00250 fatal()
00251 << "Error setting PATH option in JobOptionsSvc to default"
00252 << endmsg;
00253 return sc;
00254 }
00255 }
00256 jobOptsIProp->release();
00257
00258
00259
00260 SmartIF<IProperty> msgSvcIProp(msgsvc);
00261 msgSvcIProp->setProperty( IntegerProperty("OutputLevel", m_outputLevel)).ignore();
00262 msgSvcIProp->release();
00263
00264 sc = jobsvc->sysInitialize();
00265 if( !sc.isSuccess() ) {
00266 fatal() << "Error initializing JobOptionsSvc" << endmsg;
00267 return sc;
00268 }
00269 sc = msgsvc->sysInitialize();
00270 if( !sc.isSuccess() ) {
00271 fatal() << "Error initializing MessageSvc" << endmsg;
00272 return sc;
00273 }
00274
00275
00276 m_messageSvc = m_svcLocator->service("MessageSvc");
00277 if( !m_messageSvc.isValid() ) {
00278 fatal() << "Error retrieving MessageSvc." << endmsg;
00279 return sc;
00280 }
00281 m_jobOptionsSvc = m_svcLocator->service("JobOptionsSvc");
00282 if( !m_jobOptionsSvc.isValid() ) {
00283 fatal() << "Error retrieving JobOptionsSvc." << endmsg;
00284 return sc;
00285 }
00286
00287 return sc;
00288 }
00289
00290
00291
00292
00293 StatusCode ApplicationMgr::configure() {
00294
00295 MsgStream tlog( m_messageSvc, name() );
00296 if( Gaudi::StateMachine::CONFIGURED == m_state ) {
00297 tlog << MSG::INFO << "Already Configured" << endmsg;
00298 return StatusCode::SUCCESS;
00299 }
00300 else if( Gaudi::StateMachine::OFFLINE != m_state ) {
00301 tlog << MSG::FATAL
00302 << "configure: Invalid state \"" << m_state << "\"" << endmsg;
00303 return StatusCode::FAILURE;
00304 }
00305 m_targetState = Gaudi::StateMachine::CONFIGURED;
00306
00307 StatusCode sc;
00308 sc = i_startup();
00309 if ( !sc.isSuccess() ) {
00310 return sc;
00311 }
00312
00313 MsgStream log( m_messageSvc, name() );
00314
00315
00316 log << MSG::DEBUG << "Getting my own properties" << endmsg;
00317 sc = m_jobOptionsSvc->setMyProperties( name(), m_propertyMgr );
00318 if( !sc.isSuccess() ) {
00319 log << MSG::WARNING << "Problems getting my properties from JobOptionsSvc"
00320 << endmsg;
00321 return sc;
00322 }
00323
00324
00325 if( m_outputLevel != MSG::NIL && !m_appName.empty() ) {
00326 assert(m_messageSvc != 0);
00327 m_messageSvc->setOutputLevel( name(), m_outputLevel );
00328
00329 log << MSG::ALWAYS
00330 << std::endl
00331 << "=================================================================="
00332 << "=================================================================="
00333 << std::endl
00334 << " "
00335 << " Welcome to " << m_appName;
00336
00337 if( "" != m_appVersion ) {
00338 log << MSG::ALWAYS << " version " << m_appVersion;
00339 }
00340 else {
00341 log << MSG::ALWAYS << " $Revision: 1.77 $";
00342 }
00343
00344
00345 time_t t;
00346 std::time( &t );
00347 tm* localt = std::localtime( &t );
00348
00349 log << MSG::ALWAYS
00350 << std::endl
00351 << " "
00352 << " running on " << System::hostName()
00353 << " on " << std::asctime( localt )
00354 << "=================================================================="
00355 << "=================================================================="
00356 << endmsg;
00357 }
00358
00359
00360 if ( m_propertiesPrint )
00361 {
00362 typedef std::vector<Property*> Properties;
00363 const Properties& properties = m_propertyMgr->getProperties() ;
00364 log << MSG::ALWAYS
00365 << "List of ALL properties of "
00366 << System::typeinfoName ( typeid( *this ) ) << "/" << this->name()
00367 << " #properties = " << properties.size() << endmsg ;
00368 for ( Properties::const_iterator property = properties.begin() ;
00369 properties.end() != property ; ++property )
00370 { log << "Property ['Name': Value] = " << ( **property) << endmsg ; }
00371 }
00372
00373
00374 if (m_codeCheck) {
00375 StatusCode::enableChecking();
00376 sc = addMultiSvc("StatusCodeSvc", -9999);
00377 if ( sc.isFailure() ) {
00378 log << MSG::FATAL << "Error adding StatusCodeSvc for multiple threads" << endmsg;
00379 return StatusCode::FAILURE;
00380 }
00381 } else {
00382 StatusCode::disableChecking();
00383 }
00384
00385
00386 std::map<std::string,std::string>::iterator var;
00387 for ( var = m_environment.begin(); var != m_environment.end(); ++var ) {
00388 const std::string &name = var->first;
00389 const std::string &value = var->second;
00390 std::string old = System::getEnv(name.c_str());
00391 if ( !old.empty() && (old != "UNKNOWN" )) {
00392 log << MSG::WARNING;
00393 }
00394 else {
00395 log << MSG::DEBUG;
00396 }
00397 log << "Setting " << name << " = " << value << endmsg;
00398 System::setEnv(name,value);
00399 }
00400
00401
00402 VectorName::const_iterator j;
00403 for(j=m_svcMapping.begin(); j != m_svcMapping.end(); ++j) {
00404 Gaudi::Utils::TypeNameString itm(*j);
00405 if ( declareMultiSvcType(itm.name(), itm.type()).isFailure() ) {
00406 log << MSG::ERROR << "configure: declaring svc type:'" << *j << "' failed." << endmsg;
00407 return StatusCode::FAILURE;
00408 }
00409 }
00410 for(j=m_svcOptMapping.begin(); j != m_svcOptMapping.end(); ++j) {
00411 Gaudi::Utils::TypeNameString itm(*j);
00412 if ( declareMultiSvcType(itm.name(), itm.type()).isFailure() ) {
00413 log << MSG::ERROR << "configure: declaring svc type:'" << *j << "' failed." << endmsg;
00414 return StatusCode::FAILURE;
00415 }
00416 }
00417
00418
00419
00420 sc = decodeDllNameList( );
00421 if ( sc.isFailure( ) ) {
00422 log << MSG::ERROR << "Failure loading declared DLL's" << endmsg;
00423 return sc;
00424 }
00425
00426
00427
00428 sc = decodeExtSvcNameList();
00429 if ( sc.isFailure( ) ) {
00430 log << MSG::ERROR << "Failure during external service association" << endmsg;
00431 return sc;
00432 }
00433
00434 sc = decodeMultiThreadSvcNameList( );
00435 if ( sc.isFailure( ) ) {
00436 log << MSG::ERROR << "Failure during multi thread service creation"
00437 << endmsg;
00438 return sc;
00439 }
00440
00441 sc = decodeCreateSvcNameList();
00442 if ( sc.isFailure( ) ) {
00443 log << MSG::ERROR << "Failure during external service creation" << endmsg;
00444 return sc;
00445 }
00446
00447
00448
00449
00450
00451 Gaudi::Utils::TypeNameString evtloop_item(m_eventLoopMgr);
00452 sc = addMultiSvc(evtloop_item, 100);
00453 if( !sc.isSuccess() ) {
00454 log << MSG::FATAL << "Error adding :" << m_eventLoopMgr << endmsg;
00455 return sc;
00456 }
00457
00458 if (m_noOfEvtThreads == 0) {
00459 m_runable = m_svcLocator->service(m_runableType);
00460 if( !m_runable.isValid() ) {
00461 log << MSG::FATAL
00462 << "Error retrieving Runable:" << m_runableType
00463 << "\n Check option ApplicationMgr." << s_runable << endmsg;
00464 return sc;
00465 }
00466 m_processingMgr = m_svcLocator->service(evtloop_item);
00467 if( !m_processingMgr.isValid() ) {
00468 log << MSG::FATAL
00469 << "Error retrieving Processing manager:" << m_eventLoopMgr
00470 << "\n Check option ApplicationMgr." << s_eventloop
00471 << "\n No events will be processed." << endmsg;
00472 return sc;
00473 }
00474 }
00475
00476
00477 m_extSvcNameList.declareUpdateHandler (&ApplicationMgr::extSvcNameListHandler,
00478 this);
00479 m_createSvcNameList.declareUpdateHandler (&ApplicationMgr::createSvcNameListHandler,
00480 this);
00481 m_multiThreadSvcNameList.declareUpdateHandler
00482 (&ApplicationMgr::multiThreadSvcNameListHandler, this);
00483 m_dllNameList.declareUpdateHandler (&ApplicationMgr::dllNameListHandler,
00484 this );
00485
00486 if (m_actHistory) {
00487
00488 sc = svcManager()->addService("HistorySvc",std::numeric_limits<int>::max());
00489 if ( sc.isFailure() ) {
00490 log << MSG::FATAL << "Error adding HistorySvc" << endmsg;
00491 return StatusCode::FAILURE;
00492 }
00493
00494 if (m_noOfEvtThreads > 0) {
00495 sc = addMultiSvc("HistorySvc",std::numeric_limits<int>::max());
00496 if ( sc.isFailure() ) {
00497 log << MSG::FATAL << "Error adding HistorySvc for multiple threads"
00498 << endmsg;
00499 return StatusCode::FAILURE;
00500 }
00501 }
00502 }
00503
00504 log << MSG::INFO << "Application Manager Configured successfully" << endmsg;
00505 m_state = m_targetState;
00506 return StatusCode::SUCCESS;
00507 }
00508
00509
00510
00511
00512 StatusCode ApplicationMgr::initialize() {
00513
00514 MsgStream log( m_messageSvc, name() );
00515 StatusCode sc;
00516
00517
00518
00519 if (m_stopOnSignal) {
00520
00521 std::string svcname("Gaudi::Utils::StopSignalHandler");
00522 sc = svcManager()->addService(svcname);
00523 if ( sc.isFailure() ) {
00524 log << MSG::INFO << "Cannot instantiate " << svcname << "signals will be ignored" << endmsg;
00525 }
00526 }
00527
00528 if (m_stalledEventMonitoring) {
00529
00530 std::string svcname("StalledEventMonitor");
00531 sc = svcManager()->addService(svcname);
00532 if ( sc.isFailure() ) {
00533 log << MSG::INFO << "Cannot instantiate " << svcname << "signals will be ignored" << endmsg;
00534 }
00535 }
00536
00537 if( m_state == Gaudi::StateMachine::INITIALIZED ) {
00538 log << MSG::INFO << "Already Initialized!" << endmsg;
00539 return StatusCode::SUCCESS;
00540 }
00541 else if( m_state != Gaudi::StateMachine::CONFIGURED ) {
00542 log << MSG::FATAL
00543 << "initialize: Invalid state \"" << m_state << "\"" << endmsg;
00544 return StatusCode::FAILURE;
00545 }
00546 m_targetState = Gaudi::StateMachine::INITIALIZED;
00547
00548
00549
00550
00551 sc = svcManager()->initialize();
00552 if( !sc.isSuccess() ) return sc;
00553
00554
00555
00556
00557 log << MSG::INFO << "Application Manager Initialized successfully" << endmsg;
00558 m_state = m_targetState;
00559
00560 return sc;
00561 }
00562
00563
00564
00565
00566 StatusCode ApplicationMgr::start() {
00567
00568 MsgStream log( m_messageSvc, name() );
00569 StatusCode sc;
00570
00571 if( m_state == Gaudi::StateMachine::RUNNING ) {
00572 log << MSG::INFO << "Already Initialized!" << endmsg;
00573 return StatusCode::SUCCESS;
00574 }
00575 else if( m_state != Gaudi::StateMachine::INITIALIZED ) {
00576 log << MSG::FATAL
00577 << "start: Invalid state \"" << m_state << "\"" << endmsg;
00578 return StatusCode::FAILURE;
00579 }
00580 m_targetState = Gaudi::StateMachine::RUNNING;
00581
00582
00583
00584
00585 sc = svcManager()->start();
00586 if( !sc.isSuccess() ) return sc;
00587
00588
00589
00590
00591 log << MSG::INFO << "Application Manager Started successfully" << endmsg;
00592 m_state = m_targetState;
00593
00594 return sc;
00595 }
00596
00597
00598
00599
00600 StatusCode ApplicationMgr::nextEvent(int maxevt) {
00601 if( m_state != Gaudi::StateMachine::RUNNING ) {
00602 MsgStream log( m_messageSvc, name() );
00603 log << MSG::FATAL << "nextEvent: Invalid state \"" << m_state << "\""
00604 << endmsg;
00605 return StatusCode::FAILURE;
00606 }
00607 if (!m_processingMgr.isValid()) {
00608 MsgStream log( m_messageSvc, name() );
00609 log << MSG::FATAL << "No event processing manager specified. Check option:"
00610 << s_eventloop << endmsg;
00611 return StatusCode::FAILURE;
00612 }
00613 return m_processingMgr->nextEvent(maxevt);
00614 }
00615
00616
00617
00618
00619 StatusCode ApplicationMgr::stop() {
00620
00621 MsgStream log( m_messageSvc, name() );
00622 StatusCode sc;
00623
00624 if( m_state == Gaudi::StateMachine::INITIALIZED ) {
00625 log << MSG::INFO << "Already Initialized!" << endmsg;
00626 return StatusCode::SUCCESS;
00627 }
00628 else if( m_state != Gaudi::StateMachine::RUNNING ) {
00629 log << MSG::FATAL
00630 << "stop: Invalid state \"" << m_state << "\"" << endmsg;
00631 return StatusCode::FAILURE;
00632 }
00633 m_targetState = Gaudi::StateMachine::INITIALIZED;
00634
00635
00636 sc = algManager()->stop();
00637 if( !sc.isSuccess() ) return sc;
00638
00639
00640
00641
00642 sc = svcManager()->stop();
00643 if( !sc.isSuccess() ) return sc;
00644
00645
00646
00647
00648 log << MSG::INFO << "Application Manager Stopped successfully" << endmsg;
00649 m_state = m_targetState;
00650
00651 return sc;
00652 }
00653
00654
00655
00656
00657 StatusCode ApplicationMgr::finalize() {
00658 MsgStream log( m_messageSvc, name() );
00659 if( m_state == Gaudi::StateMachine::CONFIGURED ) {
00660 log << MSG::INFO << "Already Finalized" << endmsg;
00661 return StatusCode::SUCCESS;
00662 }
00663 else if( m_state != Gaudi::StateMachine::INITIALIZED ) {
00664 log << MSG::FATAL << "finalize: Invalid state \"" << m_state << "\""
00665 << endmsg;
00666 return StatusCode::FAILURE;
00667 }
00668 m_targetState = Gaudi::StateMachine::CONFIGURED;
00669
00670
00671 m_svcLocator->service<IProperty>("MessageSvc")->setProperty(BooleanProperty("enableSuppression", false)).ignore();
00672
00673
00674 StatusCode sc = algManager()->finalize();
00675
00676
00677
00678 sc = svcManager()->finalize();
00679
00680
00681
00682
00683 if (m_codeCheck) {
00684 StatusCode::disableChecking();
00685 }
00686
00687 log << MSG::INFO << "Application Manager Finalized successfully" << endmsg;
00688
00689 m_state = m_targetState;
00690 return sc;
00691 }
00692
00693
00694
00695
00696 StatusCode ApplicationMgr::terminate() {
00697 MsgStream log( m_messageSvc, name() );
00698
00699 if( m_state == Gaudi::StateMachine::OFFLINE ) {
00700 log << MSG::INFO << "Already Offline" << endmsg;
00701 return StatusCode::SUCCESS;
00702 }
00703 else if( m_state != Gaudi::StateMachine::CONFIGURED ) {
00704 log << MSG::FATAL << "terminate: Invalid state \"" << m_state << "\""
00705 << endmsg;
00706 return StatusCode::FAILURE;
00707 }
00708
00709 m_targetState = Gaudi::StateMachine::OFFLINE;
00710
00711
00712 log << MSG::INFO << "Application Manager Terminated successfully" << endmsg;
00713
00714 {
00715 SmartIF<IProperty> prop(m_messageSvc);
00716 if (prop.isValid()) {
00717 prop->setProperty(BooleanProperty("AuditFinalize", false));
00718 }
00719 }
00720 {
00721 SmartIF<IProperty> prop(m_jobOptionsSvc);
00722 if (prop.isValid()) {
00723 prop->setProperty(BooleanProperty("AuditFinalize", false));
00724 }
00725 }
00726
00727
00728 SmartIF<IService> svc(m_messageSvc);
00729 if ( !svc.isValid() ) {
00730 log << MSG::ERROR << "Could not get the IService interface of the MessageSvc" << endmsg;
00731 } else {
00732 svc->sysFinalize().ignore();
00733 }
00734
00735
00736 svc = m_jobOptionsSvc;
00737 if ( !svc.isValid() ) {
00738 log << MSG::ERROR << "Could not get the IService interface of the JobOptionsSvc" << endmsg;
00739 } else {
00740 svc->sysFinalize().ignore();
00741 }
00742
00743 m_state = m_targetState;
00744 return StatusCode::SUCCESS;
00745 }
00746
00747
00748
00749
00750 StatusCode ApplicationMgr::GoToState(Gaudi::StateMachine::State state, bool ignoreFailures) {
00751 StatusCode sc = StatusCode(StatusCode::SUCCESS,true);
00752
00753 switch (state) {
00754
00755 case Gaudi::StateMachine::OFFLINE:
00756 switch (m_state) {
00757 case Gaudi::StateMachine::OFFLINE : return StatusCode::SUCCESS; break;
00758 case Gaudi::StateMachine::CONFIGURED : return terminate(); break;
00759 default:
00760 sc = GoToState(Gaudi::StateMachine::CONFIGURED);
00761 if (sc.isSuccess()) {
00762 return terminate();
00763 } break;
00764 } break;
00765
00766 case Gaudi::StateMachine::CONFIGURED:
00767 switch (m_state) {
00768 case Gaudi::StateMachine::CONFIGURED : return StatusCode::SUCCESS; break;
00769 case Gaudi::StateMachine::OFFLINE : return configure(); break;
00770 case Gaudi::StateMachine::INITIALIZED : return finalize(); break;
00771 default:
00772 sc = GoToState(Gaudi::StateMachine::INITIALIZED);
00773 if (sc.isSuccess()) {
00774 return finalize();
00775 } break;
00776 } break;
00777
00778 case Gaudi::StateMachine::INITIALIZED:
00779 switch (m_state) {
00780 case Gaudi::StateMachine::INITIALIZED : return StatusCode::SUCCESS; break;
00781 case Gaudi::StateMachine::CONFIGURED : return initialize(); break;
00782 case Gaudi::StateMachine::RUNNING : return stop(); break;
00783 default:
00784 sc = GoToState(Gaudi::StateMachine::CONFIGURED);
00785 if (sc.isSuccess()) {
00786 return initialize();
00787 } break;
00788 } break;
00789
00790 case Gaudi::StateMachine::RUNNING:
00791 switch (m_state) {
00792 case Gaudi::StateMachine::RUNNING : return StatusCode::SUCCESS; break;
00793 case Gaudi::StateMachine::INITIALIZED : return start(); break;
00794 default:
00795 sc = GoToState(Gaudi::StateMachine::INITIALIZED);
00796 if (sc.isSuccess()) {
00797 return start();
00798 } break;
00799 } break;
00800
00801 }
00802
00803
00804
00805 if (ignoreFailures){
00806
00807 m_state = state;
00808 return StatusCode::SUCCESS;
00809 }
00810
00811 return sc;
00812 }
00813
00814
00815
00816
00817 StatusCode ApplicationMgr::run() {
00818 StatusCode sc = StatusCode::SUCCESS;
00819
00820 sc = GoToState(Gaudi::StateMachine::RUNNING);
00821 if ( sc.isSuccess() ) {
00822 MsgStream log(m_messageSvc, name());
00823 if ( m_runable != 0 ) {
00824 sc = m_runable->run();
00825 if ( !sc.isSuccess() ) {
00826 log << MSG::FATAL << "Application execution failed. Ending the job."
00827 << endmsg;
00828 }
00829 } else {
00830 log << MSG::FATAL << "Application has no runable object. Check option:"
00831 << s_runable << endmsg;
00832 }
00833 }
00834 if (sc.isSuccess()) {
00835 sc = GoToState(Gaudi::StateMachine::OFFLINE);
00836 }
00837
00838 if (sc.isFailure()) {
00839 GoToState(Gaudi::StateMachine::OFFLINE,true).ignore();
00840 }
00841 return sc;
00842 }
00843
00844
00845
00846
00847 StatusCode ApplicationMgr::executeEvent(void* par) {
00848 MsgStream log( m_messageSvc, name() );
00849 if( m_state == Gaudi::StateMachine::RUNNING ) {
00850 if ( m_processingMgr.isValid() ) {
00851 return m_processingMgr->executeEvent(par);
00852 }
00853 }
00854 log << MSG::FATAL << "executeEvent: Invalid state \"" << FSMState() << "\""
00855 <<endmsg;
00856 return StatusCode::FAILURE;
00857 }
00858
00859
00860
00861
00862 StatusCode ApplicationMgr::executeRun(int evtmax) {
00863 MsgStream log( m_messageSvc, name() );
00864 if( m_state == Gaudi::StateMachine::RUNNING ) {
00865 if ( m_processingMgr.isValid() ) {
00866 return m_processingMgr->executeRun(evtmax);
00867 }
00868 log << MSG::WARNING << "No EventLoop Manager specified " << endmsg;
00869 return StatusCode::SUCCESS;
00870 }
00871 log << MSG::FATAL << "executeRun: Invalid state \"" << FSMState() << "\""
00872 << endmsg;
00873 return StatusCode::FAILURE;
00874 }
00875
00876
00877
00878
00879 StatusCode ApplicationMgr::stopRun() {
00880 MsgStream log( m_messageSvc, name() );
00881 if( m_state == Gaudi::StateMachine::RUNNING ) {
00882 if ( m_processingMgr.isValid() ) {
00883 return m_processingMgr->stopRun();
00884 }
00885 log << MSG::WARNING << "No EventLoop Manager specified " << endmsg;
00886 return StatusCode::SUCCESS;
00887 }
00888 log << MSG::FATAL << "stopRun: Invalid state \"" << FSMState() << "\""
00889 << endmsg;
00890 return StatusCode::FAILURE;
00891 }
00892
00893 const std::string& ApplicationMgr::name() const {
00894 return m_name;
00895 }
00896
00897
00898 Gaudi::StateMachine::State ApplicationMgr::FSMState( ) const {
00899 return m_state;
00900 }
00901
00902 Gaudi::StateMachine::State ApplicationMgr::targetFSMState( ) const {
00903 return m_targetState;
00904 }
00905
00906
00907
00908
00909
00910 StatusCode ApplicationMgr::reinitialize() {
00911 StatusCode retval = StatusCode::SUCCESS;
00912 StatusCode sc;
00913 if ( m_state < Gaudi::StateMachine::INITIALIZED ) {
00914 throw GaudiException("Cannot reinitialize application if not INITIALIZED or RUNNING",
00915 "ApplicationMgr::reinitialize", StatusCode::FAILURE);
00916 }
00917 if ( m_state == Gaudi::StateMachine::RUNNING ) {
00918 retval = GoToState(Gaudi::StateMachine::INITIALIZED);
00919 }
00920 sc = svcManager()->reinitialize();
00921 if (sc.isFailure()) retval = sc;
00922 sc = algManager()->reinitialize();
00923 if (sc.isFailure()) retval = sc;
00924 return retval;
00925 }
00926
00927
00928
00929
00930 StatusCode ApplicationMgr::restart() {
00931 StatusCode retval = StatusCode::SUCCESS;
00932 StatusCode sc;
00933 if ( m_state != Gaudi::StateMachine::RUNNING ) {
00934 throw GaudiException("Cannot restart application if not RUNNING",
00935 "ApplicationMgr::restart", StatusCode::FAILURE);
00936 }
00937 sc = svcManager()->restart();
00938 if (sc.isFailure()) retval = sc;
00939 sc = algManager()->restart();
00940 if (sc.isFailure()) retval = sc;
00941 return retval;
00942 }
00943
00944
00945
00946
00947 void ApplicationMgr::SIGoHandler( Property& ) {
00948
00949 MsgStream log (m_messageSvc, name());
00950 StatusCode sc;
00951
00952
00953 sc = reinitialize();
00954
00955 executeRun(m_evtMax);
00956
00957 return;
00958 }
00959
00960
00961
00962
00963 void ApplicationMgr::SIExitHandler( Property& ) {
00964 StatusCode status;
00965 status = finalize();
00966 status = terminate();
00967 ::exit( 0 );
00968 }
00969
00970
00971
00972
00973 void ApplicationMgr::evtLoopPropertyHandler( Property& p ) {
00974 if ( m_processingMgr.isValid() ) {
00975 SmartIF<IProperty> props(m_processingMgr);
00976 if ( props.isValid() ) {
00977 props->setProperty( p ).ignore();
00978 }
00979 }
00980 }
00981
00982
00983
00984
00985 void ApplicationMgr::createSvcNameListHandler( Property& ) {
00986 if ( !(decodeCreateSvcNameList()).isSuccess() ) {
00987 throw GaudiException("Failed to create ext services",
00988 "MinimalEventLoopMgr::createSvcNameListHandler",
00989 StatusCode::FAILURE);
00990 }
00991 }
00992
00993
00994
00995 StatusCode ApplicationMgr::decodeCreateSvcNameList() {
00996 StatusCode result = StatusCode::SUCCESS;
00997 const std::vector<std::string>& theNames = m_createSvcNameList.value( );
00998 VectorName::const_iterator it(theNames.begin());
00999 VectorName::const_iterator et(theNames.end());
01000 while(result.isSuccess() && it != et) {
01001 Gaudi::Utils::TypeNameString item(*it++);
01002 if( (result = svcManager()->addService(item, 10) ).isFailure()) {
01003 MsgStream log( m_messageSvc, m_name );
01004 log << MSG::ERROR << "decodeCreateSvcNameList: Cannot create service "
01005 << item.type() << "/" << item.name() << endmsg;
01006 } else {
01007 MsgStream log( m_messageSvc, m_name );
01008 log << MSG::DEBUG << "decodeCreateSvcNameList: Created service "
01009 << item.type() << "/" << item.name() << endmsg;
01010 }
01011 }
01012 return result;
01013 }
01014
01015
01016
01017
01018 void ApplicationMgr::extSvcNameListHandler( Property& ) {
01019 if ( !(decodeExtSvcNameList( )).isSuccess() ) {
01020 throw GaudiException("Failed to declare ext services",
01021 "MinimalEventLoopMgr::extSvcNameListHandler",
01022 StatusCode::FAILURE);
01023 }
01024 }
01025
01026
01027
01028
01029 StatusCode ApplicationMgr::decodeExtSvcNameList( ) {
01030 StatusCode result = StatusCode::SUCCESS;
01031
01032 std::vector<std::string> theNames = m_extSvcNameList.value( );
01033
01034 VectorName::const_iterator it(theNames.begin());
01035 VectorName::const_iterator et(theNames.end());
01036 while(result.isSuccess() && it != et) {
01037 Gaudi::Utils::TypeNameString item(*it++);
01038 if (m_extSvcCreates == true) {
01039 if ( (result = svcManager()->addService(item, 10)).isFailure()) {
01040 MsgStream log( m_messageSvc, m_name );
01041 log << MSG::ERROR << "decodeExtSvcNameList: Cannot create service "
01042 << item.type() << "/" << item.name() << endmsg;
01043 }
01044 } else {
01045 if( ( result = svcManager()->declareSvcType(item.name(),
01046 item.type()) ).isFailure()) {
01047 MsgStream log( m_messageSvc, m_name );
01048 log << MSG::ERROR << "decodeExtSvcNameList: Cannot declare service "
01049 << item.type() << "/" << item.name() << endmsg;
01050 }
01051 }
01052 }
01053 return result;
01054 }
01055
01056
01057
01058
01059 void ApplicationMgr::multiThreadSvcNameListHandler( Property& ) {
01060 if ( !(decodeMultiThreadSvcNameList( )).isSuccess() ) {
01061 throw GaudiException("Failed to create copies of mt services",
01062 "MinimalEventLoopMgr::multiThreadSvcNameListHandler",
01063 StatusCode::FAILURE);
01064 }
01065
01066 }
01067
01068
01069
01070
01071 StatusCode ApplicationMgr::decodeMultiThreadSvcNameList( ) {
01072 StatusCode result = StatusCode::SUCCESS;
01073 const std::vector<std::string>& theNames = m_multiThreadSvcNameList.value( );
01074 for(int iCopy=0; iCopy<m_noOfEvtThreads; ++iCopy) {
01075 for (VectorName::const_iterator it = theNames.begin();
01076 it != theNames.end();
01077 ++it) {
01078 Gaudi::Utils::TypeNameString item(*it);
01079 result = addMultiSvc(item, 10);
01080
01081 if( result.isFailure() ) {
01082 MsgStream log( m_messageSvc, m_name );
01083 log << MSG::ERROR
01084 << "decodeMultiThreadSvcNameList: Cannot create service "
01085 << item.type() << "/" << item.name() << endmsg;
01086 } else {
01087 MsgStream log( m_messageSvc, m_name );
01088 log << MSG::VERBOSE
01089 << "decodeMultiThreadSvcNameList: created service "
01090 << item.type() << "/" << item.name() << endmsg;
01091 }
01092 }
01093 }
01094 return result;
01095 }
01096
01097
01098
01099 StatusCode ApplicationMgr::declareMultiSvcType(const std::string& name,
01100 const std::string& type) {
01101 StatusCode result = StatusCode::SUCCESS;
01102 MsgStream log( m_messageSvc, m_name );
01103 if (0 == m_noOfEvtThreads) {
01104 result = svcManager()->declareSvcType(name, type);
01105 if( result.isFailure() ) {
01106 log << MSG::ERROR << "declareMultiSvcType: Cannot declare service "
01107 << type << "/" << name << endmsg;
01108 } else {
01109 log << MSG::VERBOSE << "declareMultiSvcType: declared service "
01110 << type << "/" << name << endmsg;
01111 }
01112 } else {
01113 for(int iCopy=0; iCopy<m_noOfEvtThreads; ++iCopy) {
01114 std::string thrName(name + getGaudiThreadIDfromID(iCopy));
01115 result = svcManager()->declareSvcType(thrName, type);
01116 if( result.isFailure() ) {
01117 log << MSG::ERROR << "declareMultiSvcType: Cannot declare service "
01118 << type << "/" << thrName << endmsg;
01119 } else {
01120 log << MSG::VERBOSE << "declareMultiSvcType: declared service "
01121 << type << "/" << thrName << endmsg;
01122 }
01123 }
01124 }
01125 return result;
01126 }
01127
01128
01129
01130 StatusCode ApplicationMgr::addMultiSvc(const Gaudi::Utils::TypeNameString &typeName,
01131 int prio) {
01132 using Gaudi::Utils::TypeNameString;
01133 StatusCode result = StatusCode::SUCCESS;
01134 MsgStream log( m_messageSvc, m_name );
01135 if (0 == m_noOfEvtThreads) {
01136 result = svcManager()->addService(typeName, prio);
01137
01138 if( result.isFailure() ) {
01139 log << MSG::ERROR << "addMultiSvc: Cannot add service "
01140 << typeName.type() << "/" << typeName.name() << endmsg;
01141 } else {
01142 log << MSG::VERBOSE << "addMultiSvc: added service "
01143 << typeName.type() << "/" << typeName.name() << endmsg;
01144 }
01145 } else {
01146 for(int iCopy=0; iCopy<m_noOfEvtThreads; ++iCopy) {
01147 const std::string &type = typeName.type();
01148 std::string thrName(typeName.name() + getGaudiThreadIDfromID(iCopy));
01149 result = svcManager()->addService(TypeNameString(thrName, type), prio);
01150 if( result.isFailure() ) {
01151 log << MSG::ERROR << "addMultiSvc: Cannot add service "
01152 << type << "/" << thrName << endmsg;
01153 } else {
01154 log << MSG::VERBOSE << "addMultiSvc: added service "
01155 << type << "/" << thrName << endmsg;
01156 }
01157 }
01158 }
01159 return result;
01160 }
01161
01162
01163
01164
01165 void ApplicationMgr::dllNameListHandler( Property& ) {
01166 if ( !(decodeDllNameList( )).isSuccess() ) {
01167 throw GaudiException("Failed to load DLLs.",
01168 "MinimalEventLoopMgr::dllNameListHandler",
01169 StatusCode::FAILURE);
01170 }
01171 }
01172
01173
01174
01175
01176 StatusCode ApplicationMgr::decodeDllNameList() {
01177
01178 MsgStream log( m_messageSvc, m_name );
01179 StatusCode result = StatusCode::SUCCESS;
01180
01181
01182
01183 std::vector<std::string> newList;
01184 std::map<std::string,unsigned int> dllInList, duplicateList;
01185 {for ( std::vector<std::string>::const_iterator it = m_dllNameList.value().begin();
01186 it != m_dllNameList.value().end(); ++it ) {
01187 if ( 0 == dllInList[*it] ) {
01188 newList.push_back(*it);
01189 } else { ++duplicateList[*it]; }
01190 ++dllInList[*it];
01191 }}
01192
01193
01194
01195 if ( !duplicateList.empty() ) {
01196 log << MSG::DEBUG << "Removed duplicate entries for modules : ";
01197 for ( std::map<std::string,unsigned int>::const_iterator it = duplicateList.begin();
01198 it != duplicateList.end(); ++it ) {
01199 log << it->first << "(" << 1+it->second << ")";
01200 if ( it != --duplicateList.end() ) log << ", ";
01201 }
01202 log << endmsg;
01203 }
01204
01205
01206 const std::vector<std::string>& theNames = newList;
01207
01208
01209 log << MSG::DEBUG << "Loading declared DLL's" << endmsg;
01210
01211 std::vector<std::string> successNames, failNames;
01212 std::vector<std::string>::const_iterator it;
01213
01214 for (it = theNames.begin(); it != theNames.end(); it++) {
01215 if (std::find (m_okDlls.rbegin(), m_okDlls.rend(), *it) == m_okDlls.rend()){
01216
01217 StatusCode status = m_classManager->loadModule( (*it) );
01218 if( status.isFailure() ) {
01219 failNames.push_back(*it);
01220 result = StatusCode::FAILURE;
01221 }
01222 else {
01223 successNames.push_back(*it);
01224 }
01225 }
01226 }
01227
01228
01229 if ( !successNames.empty() ) {
01230 log << MSG::INFO << "Successfully loaded modules : ";
01231 for (it = successNames.begin(); it != successNames.end(); it++) {
01232 log<< (*it);
01233 if( (it+1) != successNames.end()) log << ", ";
01234
01235 m_okDlls.push_back( *it );
01236 }
01237 log << endmsg;
01238 }
01239
01240 if ( result == StatusCode::FAILURE ) {
01241 log << MSG::WARNING << "Failed to load modules: ";
01242 for (it = failNames.begin(); it != failNames.end(); it++) {
01243 log<< (*it);
01244 if( (it+1) != failNames.end()) log << ", ";
01245 }
01246 log << endmsg;
01247 }
01248 return result;
01249 }
01250
01251
01252
01253
01254 void ApplicationMgr::reflexDebugPropertyHandler( Property& )
01255 {
01256
01257 MsgStream log (m_messageSvc, name());
01258 log << MSG::INFO
01259 << "Updating ROOT::Reflex::PluginService::SetDebug(level) to level="
01260 << (int)m_reflexDebugLevel
01261 << endmsg;
01262 ROOT::Reflex::PluginService::SetDebug(m_reflexDebugLevel);
01263 }
01264
01265
01266
01267
01268 void ApplicationMgr::initLoopCheckHndlr(Property&) {
01269 svcManager()->setLoopCheckEnabled(m_loopCheck);
01270 }