Gaudi Framework, version v21r7p1

Home   Generated: 15 Feb 2010

ApplicationMgr.cpp

Go to the documentation of this file.
00001 // $Id: ApplicationMgr.cpp,v 1.77 2008/11/10 15:29:09 marcocle Exp $
00002 
00003 // Include files
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 // Implementation class for the Application Manager. In this way the
00037 // ApplicationMgr class is a fully insulated concrete class. Clients
00038 // (main programs) will not need to re-compile if there are changes
00039 // in the implementation
00040 
00041 //=======================================================================
00042 // Constructor
00043 //=======================================================================
00044 ApplicationMgr::ApplicationMgr(IInterface*): base_class() {
00045   // IInterface initialization
00046   addRef(); // Initial count set to 1
00047 
00048   // Initialize two basic services: messagesvc & joboptions
00049   m_messageSvc        = 0;
00050   m_jobOptionsSvc     = 0;
00051 
00052   // Instantiate component managers
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   // Instantiate internal services
00059   // SvcLocator/Factory HAS to be already instantiated
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   // Declare Job Options Service properties and set default
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   // ServiceMgr Initialization loop checking
00110   m_propertyMgr->declareProperty("InitializationLoopCheck", m_loopCheck = true)
00111     ->declareUpdateHandler(&ApplicationMgr::initLoopCheckHndlr, this);
00112   svcManager()->setLoopCheckEnabled(m_loopCheck);
00113 
00114   // Flag to activate the printout of properties
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   // Add action handlers to the appropriate properties
00123   m_SIGo.declareUpdateHandler  ( &ApplicationMgr::SIGoHandler         , this );
00124   m_SIExit.declareUpdateHandler( &ApplicationMgr::SIExitHandler       , this );
00125   m_topAlgNameList.declareUpdateHandler(&ApplicationMgr::evtLoopPropertyHandler, this);
00126   m_outStreamNameList.declareUpdateHandler(&ApplicationMgr::evtLoopPropertyHandler, this);
00127   m_outStreamType.declareUpdateHandler(&ApplicationMgr::evtLoopPropertyHandler, this);
00128   m_reflexDebugLevel.declareUpdateHandler(&ApplicationMgr::reflexDebugPropertyHandler, this);
00129   m_svcMapping.push_back("EvtDataSvc/EventDataSvc");
00130   m_svcMapping.push_back("DetDataSvc/DetectorDataSvc");
00131   m_svcMapping.push_back("HistogramSvc/HistogramDataSvc");
00132   m_svcMapping.push_back("HbookCnv::PersSvc/HbookHistSvc");
00133   m_svcMapping.push_back("RootHistCnv::PersSvc/RootHistSvc");
00134   m_svcMapping.push_back("EvtPersistencySvc/EventPersistencySvc");
00135   m_svcMapping.push_back("DetPersistencySvc/DetectorPersistencySvc");
00136   m_svcMapping.push_back("HistogramPersistencySvc/HistogramPersistencySvc");
00137 }
00138 
00139 //============================================================================
00140 // destructor
00141 //============================================================================
00142 ApplicationMgr::~ApplicationMgr() {
00143   if( m_classManager ) m_classManager->release();
00144   if( m_propertyMgr ) m_propertyMgr->release();
00145   if( m_messageSvc ) m_messageSvc->release();
00146   if( m_jobOptionsSvc ) m_jobOptionsSvc->release();
00147 }
00148 
00149 //============================================================================
00150 // IInterface implementation: queryInterface::addRef()
00151 //============================================================================
00152 StatusCode ApplicationMgr::queryInterface
00153 ( const InterfaceID& iid  ,
00154   void**             ppvi )
00155 {
00156   if ( 0 == ppvi ) { return StatusCode::FAILURE ; }
00157 
00158   // try to find own/direct interfaces:
00159   StatusCode sc = base_class::queryInterface(iid,ppvi);
00160   if (sc.isSuccess()) return sc;
00161 
00162   // find indirect interfaces :
00163   if      ( ISvcLocator     ::interfaceID() . versionMatch ( iid ) )
00164   { return serviceLocator()-> queryInterface ( iid , ppvi ) ; }
00165   else if ( ISvcManager     ::interfaceID() . versionMatch ( iid ) )
00166   { return svcManager()    -> queryInterface ( iid , ppvi ) ; }
00167   else if ( IAlgManager     ::interfaceID() . versionMatch ( iid ) )
00168   { return algManager()    -> queryInterface ( iid , ppvi ) ; }
00169   else if ( IClassManager   ::interfaceID() . versionMatch ( iid ) )
00170   { return m_classManager  -> queryInterface ( iid , ppvi ) ; }
00171   else if ( IProperty       ::interfaceID() . versionMatch ( iid ) )
00172   { return m_propertyMgr   -> queryInterface ( iid , ppvi ) ; }
00173   else if ( IMessageSvc     ::interfaceID() . versionMatch ( iid ) )
00174   {
00175     *ppvi = reinterpret_cast<void*>(m_messageSvc.get());
00176     if (m_messageSvc) {
00177       m_messageSvc->addRef();
00178     }
00179     // Note that 0 can be a valid IMessageSvc pointer value (when used for
00180     // MsgStream).
00181     return StatusCode::SUCCESS;
00182   }
00183   else
00184   { *ppvi = 0 ; return StatusCode::FAILURE; }              // RETURN
00185   // increment the reference counter:
00186   addRef ();
00187   //
00188   return StatusCode::SUCCESS ;
00189 }
00190 
00191 //============================================================================
00192 // ApplicationMgr::i_startup()
00193 //============================================================================
00194 StatusCode ApplicationMgr::i_startup() {
00195   StatusCode  sc;
00196 
00197   // declare factories in current module
00198   m_classManager->loadModule("").ignore();
00199 
00200   // Create the Message service
00201   SmartIF<IService> msgsvc = svcManager()->createService(Gaudi::Utils::TypeNameString("MessageSvc", m_messageSvcType));
00202   if( !msgsvc.isValid() )  {
00203     fatal() << "Error creating MessageSvc of type " << m_messageSvcType << endmsg;
00204     return sc;
00205   }
00206   // Create the Job Options service
00207   SmartIF<IService> jobsvc = svcManager()->createService(Gaudi::Utils::TypeNameString("JobOptionsSvc", m_jobOptionsSvcType));
00208   if( !jobsvc.isValid() )   {
00209     fatal() << "Error creating JobOptionsSvc" << endmsg;
00210     return sc;
00211   }
00212 
00213   SmartIF<IProperty> jobOptsIProp(jobsvc);
00214   if ( !jobOptsIProp.isValid() )   {
00215     fatal() << "Error locating JobOptionsSvc" << endmsg;
00216     return sc;
00217   }
00218   sc = jobOptsIProp->setProperty( StringProperty("TYPE", m_jobOptionsType) );
00219   if( !sc.isSuccess() )   {
00220     fatal() << "Error setting TYPE option in JobOptionsSvc" << endmsg;
00221     return sc;
00222   }
00223 
00224   if ( m_jobOptionsPath != "") {         // The command line takes precedence
00225     sc = jobOptsIProp->setProperty( StringProperty("PATH", m_jobOptionsPath) );
00226     if( !sc.isSuccess() )   {
00227       fatal() << "Error setting PATH option in JobOptionsSvc" << endmsg;
00228       return sc;
00229     }
00230   }
00231   else if ( 0 != getenv("JOBOPTPATH") ) {// Otherwise the Environment JOBOPTPATH
00232     sc = jobOptsIProp->setProperty (StringProperty("PATH",
00233                                                    getenv("JOBOPTPATH")));
00234     if( !sc.isSuccess() )   {
00235       fatal()
00236            << "Error setting PATH option in JobOptionsSvc from env"
00237            << endmsg;
00238       return sc;
00239     }
00240   }
00241   else {                                   // Otherwise the default
00242     sc = jobOptsIProp->setProperty (StringProperty("PATH",
00243                                                    "../options/job.opts"));
00244     if( !sc.isSuccess() )   {
00245       fatal()
00246            << "Error setting PATH option in JobOptionsSvc to default"
00247            << endmsg;
00248       return sc;
00249     }
00250   }
00251   jobOptsIProp->release();
00252 
00253   // Sets my default the Output Level of the Message service to be
00254   // the same as this
00255   SmartIF<IProperty> msgSvcIProp(msgsvc);
00256   msgSvcIProp->setProperty( IntegerProperty("OutputLevel", m_outputLevel)).ignore();
00257   msgSvcIProp->release();
00258 
00259   sc = jobsvc->sysInitialize();
00260   if( !sc.isSuccess() )   {
00261     fatal() << "Error initializing JobOptionsSvc" << endmsg;
00262     return sc;
00263   }
00264   sc = msgsvc->sysInitialize();
00265   if( !sc.isSuccess() )  {
00266     fatal() << "Error initializing MessageSvc" << endmsg;
00267     return sc;
00268   }
00269 
00270   // Get the useful interface from Message anf JobOptions services
00271   m_messageSvc = m_svcLocator->service("MessageSvc");
00272   if( !m_messageSvc.isValid() )  {
00273     fatal() << "Error retrieving MessageSvc." << endmsg;
00274     return sc;
00275   }
00276   m_jobOptionsSvc = m_svcLocator->service("JobOptionsSvc");
00277   if( !m_jobOptionsSvc.isValid() )  {
00278     fatal() << "Error retrieving JobOptionsSvc." << endmsg;
00279     return sc;
00280   }
00281 
00282   return sc;
00283 }
00284 
00285 //============================================================================
00286 // IAppMgrUI implementation: ApplicationMgr::configure()
00287 //============================================================================
00288 StatusCode ApplicationMgr::configure() {
00289   // Check if the state is compatible with the transition
00290   MsgStream tlog( m_messageSvc, name() );
00291   if( Gaudi::StateMachine::CONFIGURED == m_state ) {
00292     tlog << MSG::INFO << "Already Configured" << endmsg;
00293     return StatusCode::SUCCESS;
00294   }
00295   else if( Gaudi::StateMachine::OFFLINE != m_state ) {
00296     tlog << MSG::FATAL
00297          << "configure: Invalid state \""  << m_state << "\"" << endmsg;
00298     return StatusCode::FAILURE;
00299   }
00300   m_targetState = Gaudi::StateMachine::CONFIGURED;
00301 
00302   StatusCode  sc;
00303   sc = i_startup();
00304   if ( !sc.isSuccess() )    {
00305     return sc;
00306   }
00307 
00308   MsgStream log( m_messageSvc, name() );
00309 
00310   // Get my own options using the Job options service
00311   log << MSG::DEBUG << "Getting my own properties" << endmsg;
00312   sc = m_jobOptionsSvc->setMyProperties( name(), m_propertyMgr );
00313   if( !sc.isSuccess() ) {
00314     log << MSG::WARNING << "Problems getting my properties from JobOptionsSvc"
00315         << endmsg;
00316     return sc;
00317   }
00318 
00319   // Check current outputLevel to eventually inform the MessageSvc
00320   if( m_outputLevel != MSG::NIL && !m_appName.empty() ) {
00321     assert(m_messageSvc != 0);
00322     m_messageSvc->setOutputLevel( name(), m_outputLevel );
00323     // Print a welcome message
00324     log << MSG::ALWAYS
00325         << std::endl
00326         << "=================================================================="
00327         << "=================================================================="
00328         << std::endl
00329         << "                                "
00330         << "                   Welcome to " << m_appName;
00331 
00332     if( "" != m_appVersion ) {
00333       log << MSG::ALWAYS << " version " << m_appVersion;
00334     }
00335     else {
00336       log << MSG::ALWAYS << " $Revision: 1.77 $";
00337     }
00338 
00339     // Add the host name and current time to the message
00340     time_t t;
00341     std::time( &t );
00342     tm* localt = std::localtime( &t );
00343 
00344     log << MSG::ALWAYS
00345         << std::endl
00346         << "                                "
00347         << "          running on " << System::hostName()
00348         << " on " << std::asctime( localt )
00349         << "=================================================================="
00350         << "=================================================================="
00351         << endmsg;
00352   }
00353 
00354   // print all own properties if the options "PropertiesPrint" is set to true
00355   if ( m_propertiesPrint )
00356   {
00357     typedef std::vector<Property*> Properties;
00358     const Properties& properties = m_propertyMgr->getProperties() ;
00359     log << MSG::ALWAYS
00360         << "List of ALL properties of "
00361         << System::typeinfoName ( typeid( *this ) ) << "/" << this->name()
00362         << "  #properties = " << properties.size() << endmsg ;
00363     for ( Properties::const_iterator property = properties.begin() ;
00364           properties.end() != property ; ++property )
00365     { log << "Property ['Name': Value] = " << ( **property) << endmsg ; }
00366   }
00367 
00368   // Check if StatusCode need to be checked
00369   if (m_codeCheck) {
00370     StatusCode::enableChecking();
00371     sc = addMultiSvc("StatusCodeSvc", -9999);
00372     if ( sc.isFailure() ) {
00373       log << MSG::FATAL << "Error adding StatusCodeSvc for multiple threads" << endmsg;
00374       return StatusCode::FAILURE;
00375     }
00376   } else {
00377     StatusCode::disableChecking();
00378   }
00379 
00380   // set the requested environment variables
00381   std::map<std::string,std::string>::iterator var;
00382   for ( var = m_environment.begin(); var != m_environment.end(); ++var ) {
00383     const std::string &name  = var->first;
00384     const std::string &value = var->second;
00385     std::string old = System::getEnv(name.c_str());
00386     if ( !old.empty() && (old != "UNKNOWN" )) {
00387       log << MSG::WARNING;
00388     }
00389     else {
00390       log << MSG::DEBUG;
00391     }
00392     log << "Setting " << name << " = " << value << endmsg;
00393     System::setEnv(name,value);
00394   }
00395 
00396   //Declare Service Types
00397   VectorName::const_iterator j;
00398   for(j=m_svcMapping.begin(); j != m_svcMapping.end(); ++j)  {
00399     Gaudi::Utils::TypeNameString itm(*j);
00400     if ( declareMultiSvcType(itm.name(), itm.type()).isFailure() )  {
00401       log << MSG::ERROR << "configure: declaring svc type:'" << *j << "' failed." << endmsg;
00402       return StatusCode::FAILURE;
00403     }
00404   }
00405   for(j=m_svcOptMapping.begin(); j != m_svcOptMapping.end(); ++j)  {
00406     Gaudi::Utils::TypeNameString itm(*j);
00407     if ( declareMultiSvcType(itm.name(), itm.type()).isFailure() )  {
00408       log << MSG::ERROR << "configure: declaring svc type:'" << *j << "' failed." << endmsg;
00409       return StatusCode::FAILURE;
00410     }
00411   }
00412 
00413   //--------------------------------------------------------------------------
00414   // Declare other Services and Algorithms by loading DLL's
00415   sc = decodeDllNameList( );
00416   if ( sc.isFailure( ) ) {
00417     log << MSG::ERROR << "Failure loading declared DLL's" << endmsg;
00418     return sc;
00419   }
00420 
00421   //--------------------------------------------------------------------------
00422   // Deal with the services explicitely declared by the user.
00423   sc = decodeExtSvcNameList();
00424   if ( sc.isFailure( ) ) {
00425     log << MSG::ERROR << "Failure during external service association" << endmsg;
00426     return sc;
00427   }
00428 
00429   sc = decodeMultiThreadSvcNameList( );
00430   if ( sc.isFailure( ) ) {
00431     log << MSG::ERROR << "Failure during multi thread service creation"
00432         << endmsg;
00433     return sc;
00434   }
00435 
00436   sc = decodeCreateSvcNameList();
00437   if ( sc.isFailure( ) ) {
00438     log << MSG::ERROR << "Failure during external service creation" << endmsg;
00439     return sc;
00440   }
00441 
00442 
00443   //--------------------------------------------------------------------------
00444   // Retrieve intrinsic services. If needed configure them.
00445   //--------------------------------------------------------------------------
00446   Gaudi::Utils::TypeNameString evtloop_item(m_eventLoopMgr);
00447   sc = addMultiSvc(evtloop_item, 100);
00448   if( !sc.isSuccess() )  {
00449     log << MSG::FATAL << "Error adding :" << m_eventLoopMgr << endmsg;
00450     return sc;
00451   }
00452 
00453   if (m_noOfEvtThreads == 0) {
00454     m_runable = m_svcLocator->service(m_runableType);
00455     if( !m_runable.isValid() )  {
00456       log << MSG::FATAL
00457           << "Error retrieving Runable:" << m_runableType
00458           << "\n Check option ApplicationMgr." << s_runable << endmsg;
00459       return sc;
00460     }
00461     m_processingMgr = m_svcLocator->service(evtloop_item);
00462     if( !m_processingMgr.isValid() )  {
00463       log << MSG::FATAL
00464           << "Error retrieving Processing manager:" << m_eventLoopMgr
00465           << "\n Check option ApplicationMgr." << s_eventloop
00466           << "\n No events will be processed." << endmsg;
00467       return sc;
00468     }
00469   }
00470 
00471   // Establish Update Handlers for ExtSvc and DLLs Properties
00472   m_extSvcNameList.declareUpdateHandler (&ApplicationMgr::extSvcNameListHandler,
00473                                          this);
00474   m_createSvcNameList.declareUpdateHandler (&ApplicationMgr::createSvcNameListHandler,
00475                                          this);
00476   m_multiThreadSvcNameList.declareUpdateHandler
00477     (&ApplicationMgr::multiThreadSvcNameListHandler, this);
00478   m_dllNameList.declareUpdateHandler (&ApplicationMgr::dllNameListHandler,
00479                                       this );
00480 
00481   if (m_actHistory) {
00482     // Create HistorySvc with a priority to ensure it's initialized last, finalized first
00483     sc = svcManager()->addService("HistorySvc",std::numeric_limits<int>::max());
00484     if ( sc.isFailure() ) {
00485       log << MSG::FATAL << "Error adding HistorySvc" << endmsg;
00486       return StatusCode::FAILURE;
00487     }
00488 
00489     if (m_noOfEvtThreads > 0) {
00490       sc = addMultiSvc("HistorySvc",std::numeric_limits<int>::max());
00491       if ( sc.isFailure() ) {
00492         log << MSG::FATAL << "Error adding HistorySvc for multiple threads"
00493             << endmsg;
00494         return StatusCode::FAILURE;
00495       }
00496     }
00497   }
00498 
00499   log << MSG::INFO << "Application Manager Configured successfully" << endmsg;
00500   m_state = m_targetState;
00501   return StatusCode::SUCCESS;
00502 }
00503 
00504 //============================================================================
00505 // IAppMgrUI implementation: ApplicationMgr::initialize()
00506 //============================================================================
00507 StatusCode ApplicationMgr::initialize() {
00508 
00509   MsgStream log( m_messageSvc, name() );
00510   StatusCode sc;
00511 
00512   if( m_state == Gaudi::StateMachine::INITIALIZED ) {
00513     log << MSG::INFO << "Already Initialized!" << endmsg;
00514     return StatusCode::SUCCESS;
00515   }
00516   else if( m_state != Gaudi::StateMachine::CONFIGURED ) {
00517     log << MSG::FATAL
00518          << "initialize: Invalid state \""  << m_state << "\"" << endmsg;
00519     return StatusCode::FAILURE;
00520   }
00521   m_targetState = Gaudi::StateMachine::INITIALIZED;
00522 
00523   //--------------------------------------------------------------------------
00524   // Initialize the list of top Services
00525   //--------------------------------------------------------------------------
00526   sc = svcManager()->initialize();
00527   if( !sc.isSuccess() ) return sc;
00528 
00529   //--------------------------------------------------------------------------
00530   // Final steps: Inform user and change internal state
00531   //--------------------------------------------------------------------------
00532   log << MSG::INFO << "Application Manager Initialized successfully"  << endmsg;
00533   m_state = m_targetState;
00534 
00535   return sc;
00536 }
00537 
00538 //============================================================================
00539 // IAppMgrUI implementation: ApplicationMgr::start()
00540 //============================================================================
00541 StatusCode ApplicationMgr::start() {
00542 
00543   MsgStream log( m_messageSvc, name() );
00544   StatusCode sc;
00545 
00546   if( m_state == Gaudi::StateMachine::RUNNING ) {
00547     log << MSG::INFO << "Already Initialized!" << endmsg;
00548     return StatusCode::SUCCESS;
00549   }
00550   else if( m_state != Gaudi::StateMachine::INITIALIZED ) {
00551     log << MSG::FATAL
00552          << "start: Invalid state \""  << m_state << "\"" << endmsg;
00553     return StatusCode::FAILURE;
00554   }
00555   m_targetState = Gaudi::StateMachine::RUNNING;
00556 
00557   //--------------------------------------------------------------------------
00558   // Initialize the list of top Services
00559   //--------------------------------------------------------------------------
00560   sc = svcManager()->start();
00561   if( !sc.isSuccess() ) return sc;
00562 
00563   //--------------------------------------------------------------------------
00564   // Final steps: Inform user and change internal state
00565   //--------------------------------------------------------------------------
00566   log << MSG::INFO << "Application Manager Started successfully"  << endmsg;
00567   m_state = m_targetState;
00568 
00569   return sc;
00570 }
00571 
00572 //============================================================================
00573 // IAppMgrUI implementation: ApplicationMgr::nextEvent(int)
00574 //============================================================================
00575 StatusCode ApplicationMgr::nextEvent(int maxevt)    {
00576   if( m_state != Gaudi::StateMachine::RUNNING ) {
00577     MsgStream log( m_messageSvc, name() );
00578     log << MSG::FATAL << "nextEvent: Invalid state \"" << m_state << "\""
00579         << endmsg;
00580     return StatusCode::FAILURE;
00581   }
00582   if (!m_processingMgr.isValid())   {
00583     MsgStream log( m_messageSvc, name() );
00584     log << MSG::FATAL << "No event processing manager specified. Check option:"
00585         << s_eventloop << endmsg;
00586     return StatusCode::FAILURE;
00587   }
00588   return m_processingMgr->nextEvent(maxevt);
00589 }
00590 
00591 //============================================================================
00592 // IAppMgrUI implementation: ApplicationMgr::stop()
00593 //============================================================================
00594 StatusCode ApplicationMgr::stop() {
00595 
00596   MsgStream log( m_messageSvc, name() );
00597   StatusCode sc;
00598 
00599   if( m_state == Gaudi::StateMachine::INITIALIZED ) {
00600     log << MSG::INFO << "Already Initialized!" << endmsg;
00601     return StatusCode::SUCCESS;
00602   }
00603   else if( m_state != Gaudi::StateMachine::RUNNING ) {
00604     log << MSG::FATAL
00605          << "stop: Invalid state \""  << m_state << "\"" << endmsg;
00606     return StatusCode::FAILURE;
00607   }
00608   m_targetState = Gaudi::StateMachine::INITIALIZED;
00609 
00610   // Stop independently managed Algorithms
00611   sc = algManager()->stop();
00612   if( !sc.isSuccess() ) return sc;
00613 
00614   //--------------------------------------------------------------------------
00615   // Stop the list of top Services
00616   //--------------------------------------------------------------------------
00617   sc = svcManager()->stop();
00618   if( !sc.isSuccess() ) return sc;
00619 
00620   //--------------------------------------------------------------------------
00621   // Final steps: Inform user and change internal state
00622   //--------------------------------------------------------------------------
00623   log << MSG::INFO << "Application Manager Stopped successfully"  << endmsg;
00624   m_state = m_targetState;
00625 
00626   return sc;
00627 }
00628 
00629 //============================================================================
00630 // IAppMgrUI implementation: ApplicationMgr::finalize()
00631 //============================================================================
00632 StatusCode ApplicationMgr::finalize() {
00633   MsgStream log( m_messageSvc, name() );
00634   if( m_state == Gaudi::StateMachine::CONFIGURED ) {
00635     log << MSG::INFO << "Already Finalized" << endmsg;
00636     return StatusCode::SUCCESS;
00637   }
00638   else if( m_state != Gaudi::StateMachine::INITIALIZED ) {
00639     log << MSG::FATAL << "finalize: Invalid state \"" << m_state << "\""
00640         << endmsg;
00641     return StatusCode::FAILURE;
00642   }
00643   m_targetState = Gaudi::StateMachine::CONFIGURED;
00644 
00645   // disable message suppression in finalize
00646   m_svcLocator->service<IProperty>("MessageSvc")->setProperty(BooleanProperty("enableSuppression", false)).ignore();
00647 
00648   // Finalize independently managed Algorithms
00649   StatusCode sc = algManager()->finalize();
00650 
00651 
00652   // Finalize all Services
00653   sc = svcManager()->finalize();
00654 
00655   //svcManager()->removeService( (IService*) m_processingMgr.get() );
00656   //svcManager()->removeService( (IService*) m_runable.get() );
00657 
00658   if (m_codeCheck) {
00659     StatusCode::disableChecking();
00660   }
00661 
00662   log << MSG::INFO << "Application Manager Finalized successfully" << endmsg;
00663 
00664   m_state = m_targetState;
00665   return sc;
00666 }
00667 
00668 //============================================================================
00669 // IAppMgrUI implementation: ApplicationMgr::terminate()
00670 //============================================================================
00671 StatusCode ApplicationMgr::terminate() {
00672   MsgStream log( m_messageSvc, name() );
00673 
00674   if( m_state == Gaudi::StateMachine::OFFLINE ) {
00675     log << MSG::INFO << "Already Offline" << endmsg;
00676     return StatusCode::SUCCESS;
00677   }
00678   else if( m_state != Gaudi::StateMachine::CONFIGURED ) {
00679     log << MSG::FATAL << "terminate: Invalid state \"" << m_state << "\""
00680         << endmsg;
00681     return StatusCode::FAILURE;
00682   }
00683   // release all Services
00684   m_targetState = Gaudi::StateMachine::OFFLINE;
00685 
00686 
00687   log << MSG::INFO << "Application Manager Terminated successfully" << endmsg;
00688 
00689   { // Force a disable the auditing of finalize for MessageSvc
00690     SmartIF<IProperty> prop(m_messageSvc);
00691     if (prop.isValid()) {
00692       prop->setProperty(BooleanProperty("AuditFinalize", false));
00693     }
00694   }
00695   { // Force a disable the auditing of finalize for JobOptionsSvc
00696     SmartIF<IProperty> prop(m_jobOptionsSvc);
00697     if (prop.isValid()) {
00698       prop->setProperty(BooleanProperty("AuditFinalize", false));
00699     }
00700   }
00701 
00702   // finalize MessageSvc
00703   SmartIF<IService> svc(m_messageSvc);
00704   if ( !svc.isValid() ) {
00705     log << MSG::ERROR << "Could not get the IService interface of the MessageSvc" << endmsg;
00706   } else {
00707     svc->sysFinalize().ignore();
00708   }
00709 
00710   // finalize JobOptionsSvc
00711   svc = m_jobOptionsSvc;
00712   if ( !svc.isValid() ) {
00713     log << MSG::ERROR << "Could not get the IService interface of the JobOptionsSvc" << endmsg;
00714   } else {
00715     svc->sysFinalize().ignore();
00716   }
00717 
00718   m_state = m_targetState;
00719   return StatusCode::SUCCESS;
00720 }
00721 
00722 //============================================================================
00723 // Reach the required state going through all the needed transitions
00724 //============================================================================
00725 StatusCode ApplicationMgr::GoToState(Gaudi::StateMachine::State state, bool ignoreFailures) {
00726   StatusCode sc = StatusCode(StatusCode::SUCCESS,true);
00727 
00728   switch (state) {
00729 
00730   case Gaudi::StateMachine::OFFLINE:
00731     switch (m_state) {
00732     case Gaudi::StateMachine::OFFLINE    : return StatusCode::SUCCESS; break;
00733     case Gaudi::StateMachine::CONFIGURED : return terminate(); break;
00734     default: // Gaudi::StateMachine::INITIALIZED or Gaudi::StateMachine::RUNNING
00735       sc = GoToState(Gaudi::StateMachine::CONFIGURED);
00736       if (sc.isSuccess()) {
00737         return terminate();
00738       } break;
00739     } break;
00740 
00741   case Gaudi::StateMachine::CONFIGURED:
00742     switch (m_state) {
00743     case Gaudi::StateMachine::CONFIGURED  : return StatusCode::SUCCESS; break;
00744     case Gaudi::StateMachine::OFFLINE     : return configure(); break;
00745     case Gaudi::StateMachine::INITIALIZED : return finalize(); break;
00746     default: // Gaudi::StateMachine::RUNNING
00747       sc = GoToState(Gaudi::StateMachine::INITIALIZED);
00748       if (sc.isSuccess()) {
00749         return finalize();
00750       } break;
00751     } break;
00752 
00753   case Gaudi::StateMachine::INITIALIZED:
00754     switch (m_state) {
00755     case Gaudi::StateMachine::INITIALIZED : return StatusCode::SUCCESS; break;
00756     case Gaudi::StateMachine::CONFIGURED  : return initialize(); break;
00757     case Gaudi::StateMachine::RUNNING     : return stop(); break;
00758     default: // Gaudi::StateMachine::OFFLINE
00759       sc = GoToState(Gaudi::StateMachine::CONFIGURED);
00760       if (sc.isSuccess()) {
00761         return initialize();
00762       } break;
00763     } break;
00764 
00765   case Gaudi::StateMachine::RUNNING:
00766     switch (m_state) {
00767     case Gaudi::StateMachine::RUNNING     : return StatusCode::SUCCESS; break;
00768     case Gaudi::StateMachine::INITIALIZED : return start(); break;
00769     default: // Gaudi::StateMachine::OFFLINE or Gaudi::StateMachine::CONFIGURED
00770       sc = GoToState(Gaudi::StateMachine::INITIALIZED);
00771       if (sc.isSuccess()) {
00772         return start();
00773       } break;
00774     } break;
00775 
00776   }
00777 
00778   // If I get here, there has been a problem in the recursion
00779 
00780   if (ignoreFailures){
00781     // force the new state
00782     m_state = state;
00783     return StatusCode::SUCCESS;
00784   }
00785 
00786   return sc;
00787 }
00788 
00789 //============================================================================
00790 // IAppMgrUI implementation: ApplicationMgr::run()
00791 //============================================================================
00792 StatusCode ApplicationMgr::run() {
00793   StatusCode sc = StatusCode::SUCCESS;
00794 
00795   sc = GoToState(Gaudi::StateMachine::RUNNING);
00796   if ( sc.isSuccess() ) {
00797     MsgStream log(m_messageSvc, name());
00798     if ( m_runable != 0 ) { // loop over the events
00799       sc = m_runable->run();
00800       if ( !sc.isSuccess() ) {
00801         log << MSG::FATAL << "Application execution failed. Ending the job."
00802             << endmsg;
00803       }
00804     } else {
00805       log << MSG::FATAL << "Application has no runable object. Check option:"
00806           << s_runable << endmsg;
00807     }
00808   }
00809   if (sc.isSuccess()) { // try to close cleanly
00810     sc = GoToState(Gaudi::StateMachine::OFFLINE);
00811   }
00812   // either the runable failed of the stut-down
00813   if (sc.isFailure()) { // try to close anyway (but keep the StatusCode unchanged)
00814     GoToState(Gaudi::StateMachine::OFFLINE,true).ignore();
00815   }
00816   return sc;
00817 }
00818 
00819 //============================================================================
00820 // IEventProcessor implementation: executeEvent(void* par)
00821 //============================================================================
00822 StatusCode ApplicationMgr::executeEvent(void* par)    {
00823   MsgStream log( m_messageSvc, name() );
00824   if( m_state == Gaudi::StateMachine::RUNNING ) {
00825     if ( m_processingMgr.isValid() )    {
00826       return m_processingMgr->executeEvent(par);
00827     }
00828   }
00829   log << MSG::FATAL << "executeEvent: Invalid state \"" << FSMState() << "\""
00830       <<endmsg;
00831   return StatusCode::FAILURE;
00832 }
00833 
00834 //============================================================================
00835 // IEventProcessor implementation: executeRun(int)
00836 //============================================================================
00837 StatusCode ApplicationMgr::executeRun(int evtmax)    {
00838   MsgStream log( m_messageSvc, name() );
00839   if( m_state == Gaudi::StateMachine::RUNNING ) {
00840     if ( m_processingMgr.isValid() )    {
00841       return m_processingMgr->executeRun(evtmax);
00842     }
00843     log << MSG::WARNING << "No EventLoop Manager specified " << endmsg;
00844     return StatusCode::SUCCESS;
00845   }
00846   log << MSG::FATAL << "executeRun: Invalid state \"" << FSMState() << "\""
00847       << endmsg;
00848   return StatusCode::FAILURE;
00849 }
00850 
00851 //============================================================================
00852 // IEventProcessor implementation: stopRun(int)
00853 //============================================================================
00854 StatusCode ApplicationMgr::stopRun()    {
00855   MsgStream log( m_messageSvc, name() );
00856   if( m_state == Gaudi::StateMachine::RUNNING ) {
00857     if ( m_processingMgr.isValid() )    {
00858       return m_processingMgr->stopRun();
00859     }
00860     log << MSG::WARNING << "No EventLoop Manager specified " << endmsg;
00861     return StatusCode::SUCCESS;
00862   }
00863   log << MSG::FATAL << "stopRun: Invalid state \"" << FSMState() << "\""
00864       << endmsg;
00865   return StatusCode::FAILURE;
00866 }
00867 // Implementation of IAppMgrUI::name
00868 const std::string& ApplicationMgr::name() const {
00869   return m_name;
00870 }
00871 
00872 // implementation of IService::state
00873 Gaudi::StateMachine::State ApplicationMgr::FSMState( ) const {
00874   return m_state;
00875 }
00876 // implementation of IService::state
00877 Gaudi::StateMachine::State ApplicationMgr::targetFSMState( ) const {
00878   return m_targetState;
00879 }
00880 
00881 
00882 //============================================================================
00883 // implementation of IService::reinitilaize
00884 //============================================================================
00885 StatusCode ApplicationMgr::reinitialize() {
00886   StatusCode retval = StatusCode::SUCCESS;
00887   StatusCode sc;
00888   if ( m_state < Gaudi::StateMachine::INITIALIZED ) {
00889     throw GaudiException("Cannot reinitialize application if not INITIALIZED or RUNNING",
00890                          "ApplicationMgr::reinitialize", StatusCode::FAILURE);
00891   }
00892   if ( m_state == Gaudi::StateMachine::RUNNING ) {
00893     retval = GoToState(Gaudi::StateMachine::INITIALIZED);
00894   }
00895   sc = svcManager()->reinitialize();
00896   if (sc.isFailure()) retval = sc;
00897   sc = algManager()->reinitialize();
00898   if (sc.isFailure()) retval = sc;
00899   return retval;
00900 }
00901 
00902 //============================================================================
00903 // implementation of IService::reinitiaize
00904 //============================================================================
00905 StatusCode ApplicationMgr::restart() {
00906   StatusCode retval = StatusCode::SUCCESS;
00907   StatusCode sc;
00908   if ( m_state != Gaudi::StateMachine::RUNNING ) {
00909     throw GaudiException("Cannot restart application if not RUNNING",
00910                          "ApplicationMgr::restart", StatusCode::FAILURE);
00911   }
00912   sc = svcManager()->restart();
00913   if (sc.isFailure()) retval = sc;
00914   sc = algManager()->restart();
00915   if (sc.isFailure()) retval = sc;
00916   return retval;
00917 }
00918 
00919 //============================================================================
00920 // SI Go Handler
00921 //============================================================================
00922 void ApplicationMgr::SIGoHandler( Property& ) {
00923 
00924   MsgStream log (m_messageSvc, name());
00925   StatusCode sc;
00926 
00927   // Re-initialize everything
00928   sc = reinitialize();
00929   // Execute a number of events
00930   executeRun(m_evtMax);
00931 
00932   return;
00933 }
00934 
00935 //============================================================================
00936 // SI Exit Handler
00937 //============================================================================
00938 void ApplicationMgr::SIExitHandler( Property& ) {
00939   StatusCode status;
00940   status = finalize();
00941   status = terminate();
00942   ::exit( 0 );
00943 }
00944 
00945 //============================================================================
00946 // Handle properties of the event loop manager (Top alg/Output stream list)
00947 //============================================================================
00948 void ApplicationMgr::evtLoopPropertyHandler( Property& p ) {
00949   if ( m_processingMgr.isValid() )    {
00950     SmartIF<IProperty> props(m_processingMgr);
00951     if ( props.isValid() )    {
00952       props->setProperty( p ).ignore();
00953     }
00954   }
00955 }
00956 
00957 //============================================================================
00958 // External Service List handler
00959 //============================================================================
00960 void ApplicationMgr::createSvcNameListHandler( Property& /* theProp */ ) {
00961   if ( !(decodeCreateSvcNameList()).isSuccess() ) {
00962     throw GaudiException("Failed to create ext services",
00963                          "MinimalEventLoopMgr::createSvcNameListHandler",
00964                          StatusCode::FAILURE);
00965   }
00966 }
00967 //============================================================================
00968 //  decodeCreateSvcNameList
00969 //============================================================================
00970 StatusCode ApplicationMgr::decodeCreateSvcNameList() {
00971   StatusCode result = StatusCode::SUCCESS;
00972   const std::vector<std::string>& theNames = m_createSvcNameList.value( );
00973   VectorName::const_iterator it(theNames.begin());
00974   VectorName::const_iterator et(theNames.end());
00975   while(result.isSuccess() && it != et) {
00976     Gaudi::Utils::TypeNameString item(*it++);
00977     if( (result = svcManager()->addService(item, 10) ).isFailure()) {
00978       MsgStream log( m_messageSvc, m_name );
00979       log << MSG::ERROR << "decodeCreateSvcNameList: Cannot create service "
00980           << item.type() << "/" << item.name() << endmsg;
00981     } else {
00982       MsgStream log( m_messageSvc, m_name );
00983       log << MSG::DEBUG << "decodeCreateSvcNameList: Created service "
00984           << item.type() << "/" << item.name() << endmsg;
00985     }
00986   }
00987   return result;
00988 }
00989 
00990 //============================================================================
00991 // External Service List handler
00992 //============================================================================
00993 void ApplicationMgr::extSvcNameListHandler( Property& /* theProp */ ) {
00994   if ( !(decodeExtSvcNameList( )).isSuccess() ) {
00995     throw GaudiException("Failed to declare ext services",
00996                          "MinimalEventLoopMgr::extSvcNameListHandler",
00997                          StatusCode::FAILURE);
00998   }
00999 }
01000 
01001 //============================================================================
01002 //  decodeExtSvcNameList
01003 //============================================================================
01004 StatusCode ApplicationMgr::decodeExtSvcNameList( ) {
01005   StatusCode result = StatusCode::SUCCESS;
01006 
01007   std::vector<std::string> theNames = m_extSvcNameList.value( );
01008 
01009   VectorName::const_iterator it(theNames.begin());
01010   VectorName::const_iterator et(theNames.end());
01011   while(result.isSuccess() && it != et) {
01012     Gaudi::Utils::TypeNameString item(*it++);
01013     if (m_extSvcCreates == true) {
01014       if ( (result = svcManager()->addService(item, 10)).isFailure()) {
01015         MsgStream log( m_messageSvc, m_name );
01016         log << MSG::ERROR << "decodeExtSvcNameList: Cannot create service "
01017             << item.type() << "/" << item.name() << endmsg;
01018       }
01019     } else {
01020       if( ( result = svcManager()->declareSvcType(item.name(),
01021                                                   item.type()) ).isFailure()) {
01022         MsgStream log( m_messageSvc, m_name );
01023         log << MSG::ERROR << "decodeExtSvcNameList: Cannot declare service "
01024             << item.type() << "/" << item.name() << endmsg;
01025       }
01026     }
01027   }
01028   return result;
01029 }
01030 
01031 //============================================================================
01032 // External Service List handler
01033 //============================================================================
01034 void ApplicationMgr::multiThreadSvcNameListHandler( Property& /* theProp */ ) {
01035   if ( !(decodeMultiThreadSvcNameList( )).isSuccess() ) {
01036     throw GaudiException("Failed to create copies of mt services",
01037                          "MinimalEventLoopMgr::multiThreadSvcNameListHandler",
01038                          StatusCode::FAILURE);
01039   }
01040 
01041 }
01042 
01043 //============================================================================
01044 //  decodeMultiExtSvcNameList
01045 //============================================================================
01046 StatusCode ApplicationMgr::decodeMultiThreadSvcNameList( ) {
01047   StatusCode result = StatusCode::SUCCESS;
01048   const std::vector<std::string>& theNames = m_multiThreadSvcNameList.value( );
01049   for(int iCopy=0; iCopy<m_noOfEvtThreads; ++iCopy) {
01050     for (VectorName::const_iterator it = theNames.begin();
01051          it != theNames.end();
01052          ++it) {
01053       Gaudi::Utils::TypeNameString item(*it);
01054       result = addMultiSvc(item, 10);
01055       //FIXME SHOULD CLONE?
01056       if( result.isFailure() ) {
01057         MsgStream log( m_messageSvc, m_name );
01058         log << MSG::ERROR
01059             << "decodeMultiThreadSvcNameList: Cannot create service "
01060             << item.type() << "/" << item.name() << endmsg;
01061       } else {
01062         MsgStream log( m_messageSvc, m_name );
01063         log << MSG::VERBOSE
01064             << "decodeMultiThreadSvcNameList: created service "
01065             << item.type() << "/" << item.name() << endmsg;
01066       }
01067     }
01068   }
01069   return result;
01070 }
01071 //=============================================================================
01072 //  declareMultiSvcType
01073 //=============================================================================
01074 StatusCode ApplicationMgr::declareMultiSvcType(const std::string& name,
01075                                                const std::string& type) {
01076   StatusCode result = StatusCode::SUCCESS;
01077   MsgStream log( m_messageSvc, m_name );
01078   if (0 == m_noOfEvtThreads) {
01079     result = svcManager()->declareSvcType(name, type);
01080     if( result.isFailure() ) {
01081       log << MSG::ERROR << "declareMultiSvcType: Cannot declare service "
01082           << type << "/" << name << endmsg;
01083     } else {
01084       log << MSG::VERBOSE << "declareMultiSvcType: declared service "
01085           << type << "/" << name << endmsg;
01086     }
01087   } else {
01088     for(int iCopy=0; iCopy<m_noOfEvtThreads; ++iCopy) {
01089       std::string thrName(name + getGaudiThreadIDfromID(iCopy));
01090       result = svcManager()->declareSvcType(thrName, type);
01091       if( result.isFailure() ) {
01092         log << MSG::ERROR << "declareMultiSvcType: Cannot declare service "
01093             << type << "/" << thrName << endmsg;
01094       } else {
01095         log << MSG::VERBOSE << "declareMultiSvcType: declared service "
01096             << type << "/" << thrName << endmsg;
01097       }
01098     }
01099   }
01100   return result;
01101 }
01102 //=============================================================================
01103 //  addMultiSvc
01104 //=============================================================================
01105 StatusCode ApplicationMgr::addMultiSvc(const Gaudi::Utils::TypeNameString &typeName,
01106                                        int prio) {
01107   using Gaudi::Utils::TypeNameString;
01108   StatusCode result = StatusCode::SUCCESS;
01109   MsgStream log( m_messageSvc, m_name );
01110   if (0 == m_noOfEvtThreads) {
01111     result = svcManager()->addService(typeName, prio);
01112     // result = svcManager()->addService(name, type, prio); // CHECKME???
01113     if( result.isFailure() ) {
01114       log << MSG::ERROR << "addMultiSvc: Cannot add service "
01115           << typeName.type() << "/" << typeName.name() << endmsg;
01116     } else {
01117       log << MSG::VERBOSE << "addMultiSvc: added service "
01118           << typeName.type() << "/" << typeName.name() << endmsg;
01119     }
01120   } else {
01121     for(int iCopy=0; iCopy<m_noOfEvtThreads; ++iCopy) {
01122       const std::string &type = typeName.type();
01123       std::string thrName(typeName.name() + getGaudiThreadIDfromID(iCopy));
01124       result = svcManager()->addService(TypeNameString(thrName, type), prio);
01125       if( result.isFailure() ) {
01126         log << MSG::ERROR << "addMultiSvc: Cannot add service "
01127             << type << "/" << thrName << endmsg;
01128       } else {
01129         log << MSG::VERBOSE << "addMultiSvc: added service "
01130             << type << "/" << thrName << endmsg;
01131       }
01132     }
01133   }
01134   return result;
01135 }
01136 
01137 //============================================================================
01138 // Dll List handler
01139 //============================================================================
01140 void ApplicationMgr::dllNameListHandler( Property& /* theProp */ ) {
01141   if ( !(decodeDllNameList( )).isSuccess() ) {
01142     throw GaudiException("Failed to load DLLs.",
01143                          "MinimalEventLoopMgr::dllNameListHandler",
01144                          StatusCode::FAILURE);
01145   }
01146 }
01147 
01148 //============================================================================
01149 //  decodeDllNameList
01150 //============================================================================
01151 StatusCode ApplicationMgr::decodeDllNameList() {
01152 
01153   MsgStream log( m_messageSvc, m_name );
01154   StatusCode result = StatusCode::SUCCESS;
01155 
01156   // Clean up multiple entries from DLL list
01157   // -------------------------------------------------------------------------
01158   std::vector<std::string> newList;
01159   std::map<std::string,unsigned int> dllInList, duplicateList;
01160   {for ( std::vector<std::string>::const_iterator it = m_dllNameList.value().begin();
01161         it != m_dllNameList.value().end(); ++it ) {
01162     if ( 0 == dllInList[*it] ) {
01163       newList.push_back(*it);        // first instance of this module
01164     } else { ++duplicateList[*it]; } // module listed multiple times
01165     ++dllInList[*it];                // increment count for this module
01166   }}
01167   //m_dllNameList = newList; // update primary list to new, filtered list (do not use the
01168                              // property itself otherwise we get called again infinitely)
01169   // List modules that were in there twice..
01170   if ( !duplicateList.empty() ) {
01171     log << MSG::DEBUG << "Removed duplicate entries for modules : ";
01172     for ( std::map<std::string,unsigned int>::const_iterator it = duplicateList.begin();
01173           it != duplicateList.end(); ++it ) {
01174       log << it->first << "(" << 1+it->second << ")";
01175       if ( it != --duplicateList.end() ) log << ", ";
01176     }
01177     log << endmsg;
01178   }
01179   // -------------------------------------------------------------------------
01180 
01181   const std::vector<std::string>& theNames = newList;
01182 
01183   // only load the new dlls or previously failed dlls
01184   log << MSG::DEBUG << "Loading declared DLL's" << endmsg;
01185 
01186   std::vector<std::string> successNames, failNames;
01187   std::vector<std::string>::const_iterator it;
01188 
01189   for (it = theNames.begin(); it != theNames.end(); it++) {
01190     if (std::find (m_okDlls.rbegin(), m_okDlls.rend(), *it) == m_okDlls.rend()){
01191       // found a new module name
01192       StatusCode status = m_classManager->loadModule( (*it) );
01193       if( status.isFailure() ) {
01194         failNames.push_back(*it);
01195         result = StatusCode::FAILURE;
01196       }
01197       else {
01198         successNames.push_back(*it);
01199       }
01200     }
01201   }
01202 
01203   // report back to the user and store the names of the succesfully loaded dlls
01204   if ( !successNames.empty() ) {
01205     log << MSG::INFO << "Successfully loaded modules : ";
01206     for (it = successNames.begin(); it != successNames.end(); it++) {
01207       log<< (*it);
01208       if( (it+1) != successNames.end())  log << ", ";
01209       // save name
01210       m_okDlls.push_back( *it );
01211     }
01212     log << endmsg;
01213   }
01214 
01215   if ( result == StatusCode::FAILURE ) {
01216     log << MSG::WARNING << "Failed to load modules: ";
01217     for (it = failNames.begin(); it != failNames.end(); it++) {
01218       log<< (*it);
01219       if( (it+1) != failNames.end())  log << ", ";
01220     }
01221     log << endmsg;
01222   }
01223   return result;
01224 }
01225 
01226 //============================================================================
01227 // Reflex debug level handler
01228 //============================================================================
01229 void ApplicationMgr::reflexDebugPropertyHandler( Property& )
01230 {
01231   // Setup debug level for Reflex plugin system
01232   MsgStream log (m_messageSvc, name());
01233   log << MSG::INFO
01234       << "Updating ROOT::Reflex::PluginService::SetDebug(level) to level="
01235       << (int)m_reflexDebugLevel
01236       << endmsg;
01237   ROOT::Reflex::PluginService::SetDebug(m_reflexDebugLevel);
01238 }
01239 
01240 //============================================================================
01241 // Reflex debug level handler
01242 //============================================================================
01243 void ApplicationMgr::initLoopCheckHndlr(Property&) {
01244   svcManager()->setLoopCheckEnabled(m_loopCheck);
01245 }

Generated at Mon Feb 15 17:27:29 2010 for Gaudi Framework, version v21r7p1 by Doxygen version 1.5.6 written by Dimitri van Heesch, © 1997-2004