Gaudi Framework, version v20r3

Generated: 24 Nov 2008

StatusCodeSvc.cpp

Go to the documentation of this file.
00001 #include "StatusCodeSvc.h"
00002 #include "GaudiKernel/MsgStream.h"
00003 #include "GaudiKernel/SvcFactory.h"
00004 #include "GaudiKernel/StatusCode.h"
00005 
00006 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00007 
00008 DECLARE_SERVICE_FACTORY(StatusCodeSvc)
00009 
00010 using namespace std;
00011 //
00013 //
00014 
00015 StatusCodeSvc::StatusCodeSvc(const std::string& name, ISvcLocator* svc )
00016   : Service( name, svc )
00017 {
00018 
00019   declareProperty("Filter",m_pFilter);
00020   declareProperty("AbortOnError",m_abort=false);
00021   declareProperty("SuppressCheck", m_suppress=false);
00022 
00023 }
00024 
00025 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00026 
00027 StatusCodeSvc::~StatusCodeSvc() {
00028   
00029 }
00030 
00031 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00032 
00033 StatusCode StatusCodeSvc::queryInterface(const InterfaceID& riid, 
00034                                       void** ppvInterface) 
00035 {
00036   StatusCode sc = StatusCode::FAILURE;
00037   if ( ppvInterface ) {
00038     *ppvInterface = 0;
00039     
00040     if ( IStatusCodeSvc::interfaceID().versionMatch(riid) )    {
00041       //    if ( riid == IID_StatusCodeSvc ) {
00042       *ppvInterface = static_cast<IStatusCodeSvc*>(this);
00043       sc = StatusCode::SUCCESS;
00044       addRef();
00045     }
00046     else
00047       sc = Service::queryInterface( riid, ppvInterface );    
00048   }
00049   return sc;
00050 }
00051 
00052 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00053 
00054 
00055 StatusCode
00056 StatusCodeSvc::initialize() {
00057 
00058   StatusCode sc = Service::initialize();
00059   if (!sc.isSuccess()) return sc;
00060   
00061   MsgStream log( msgSvc(), name() );
00062   log << MSG::INFO << "initialize" << endreq;
00063 
00064   std::vector<std::string>::const_iterator itr;
00065   for (itr = m_pFilter.value().begin(); itr != m_pFilter.value().end(); ++itr) {
00066     // we need to do this if someone has gotten to regFnc before initialize
00067     filterFnc(*itr);
00068 
00069     m_filter.insert(*itr);
00070   }
00071 
00072   return StatusCode::SUCCESS;
00073 
00074 }
00075 
00076 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00077 
00078 StatusCode
00079 StatusCodeSvc::reinitialize() {
00080 
00081   MsgStream log( msgSvc(), name() );
00082   log << MSG::INFO << "reinitialize" << endreq;
00083 
00084   return StatusCode::SUCCESS;
00085 
00086 }
00087 
00088 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00089 StatusCode
00090 StatusCodeSvc::finalize() {
00091 
00092   if (m_dat.size() > 0) {
00093     MsgStream log( msgSvc(), name() );
00094 
00095     log << MSG::INFO << "listing all unchecked return codes:" << endreq;
00096     
00097     list();
00098 
00099   }
00100 
00101   return StatusCode::SUCCESS;
00102 
00103 }
00104 
00105 
00106 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00107 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00108 
00109 void
00110 StatusCodeSvc::regFnc(const std::string& fnc, const std::string& lib) {
00111 
00112   if (m_filter.find(fnc) != m_filter.end()) {
00113     return;
00114   }
00115 
00116   if (m_abort) {
00117     MsgStream log( msgSvc(), name() );
00118     log << MSG::FATAL << "Unchecked StatusCode in " << fnc << " from lib "
00119         << lib << endreq;
00120     abort();
00121   }
00122 
00123   string key = fnc + lib;
00124 
00125   map<string,StatCodeDat>::iterator itr = m_dat.find(key);
00126 
00127   if (itr != m_dat.end()) {
00128     itr->second.count += 1;
00129   } else {
00130 
00131     int i1 = lib.rfind("/",lib.length());
00132     string rlib = lib.substr(i1+1,lib.length()-i1-1);
00133 
00134     StatCodeDat dat;
00135     dat.fnc = fnc;
00136     dat.lib = rlib;
00137     dat.count = 1;
00138 
00139     m_dat[key] = dat;
00140   }
00141 
00142 }
00143 
00144 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00145 
00146 void
00147 StatusCodeSvc::list() const {
00148 
00149   MsgStream log( msgSvc(), name() );
00150   log << MSG::INFO << endl;
00151 
00152   map<string,StatCodeDat>::const_iterator itr;
00153 
00154 #if defined (__GNUC__) && ( __GNUC__ <= 2 )
00155   std::ostrstream os;
00156 #else
00157   std::ostringstream os;
00158 #endif
00159 
00160   os << "Num | Function                       | Source Library" << endl;
00161   os << "----+--------------------------------+-------------------" 
00162      << "-----------------------" << endl;
00163 
00164 
00165   for(itr = m_dat.begin(); itr != m_dat.end(); ++itr ) {
00166     StatCodeDat dat = itr->second;
00167 
00168     os.width(3);
00169     os.setf(ios_base::right,ios_base::adjustfield);
00170     os << dat.count;
00171 
00172     os << " | ";
00173     os.width(30);
00174     os.setf(ios_base::left,ios_base::adjustfield);
00175     os << dat.fnc;
00176 
00177     os << " | ";
00178     os.setf(ios_base::left,ios_base::adjustfield);
00179     os << dat.lib;
00180 
00181     os << endl;
00182 
00183   }
00184 
00185 
00186   log << os.str() << endreq;
00187    
00188 }
00189 
00190 
00191 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00192 void
00193 StatusCodeSvc::filterFnc(std::string str) {
00194 
00195   std::map<std::string, StatCodeDat>::iterator itr;
00196   for (itr = m_dat.begin(); itr != m_dat.end(); ++itr ) {
00197     if (itr->second.fnc == str) {
00198       m_dat.erase(itr);
00199       return;
00200     }
00201       
00202   }
00203 
00204 }

Generated at Mon Nov 24 14:38:49 2008 for Gaudi Framework, version v20r3 by Doxygen version 1.5.6 written by Dimitri van Heesch, © 1997-2004