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 using namespace std;
00009
00011
00012 inline void toupper(std::string &s)
00013 {
00014 std::transform(s.begin(), s.end(), s.begin(),
00015 (int(*)(int)) toupper);
00016 }
00017
00018 StatusCodeSvc::StatusCodeSvc(const std::string& name, ISvcLocator* svc )
00019 : base_class( name, svc )
00020 {
00021
00022 declareProperty("Filter",m_pFilter);
00023 declareProperty("AbortOnError",m_abort=false);
00024 declareProperty("SuppressCheck", m_suppress=false);
00025 declareProperty("IgnoreDicts",m_dict=true);
00026
00027 }
00028
00029
00030
00031 StatusCodeSvc::~StatusCodeSvc() {
00032
00033 }
00034
00035
00036
00037
00038 StatusCode
00039 StatusCodeSvc::initialize() {
00040
00041 StatusCode sc = Service::initialize();
00042 if (!sc.isSuccess()) return sc;
00043
00044 MsgStream log( msgSvc(), name() );
00045 log << MSG::INFO << "initialize" << endmsg;
00046
00047 std::vector<std::string>::const_iterator itr;
00048 for (itr = m_pFilter.value().begin(); itr != m_pFilter.value().end(); ++itr) {
00049
00050
00051 string fnc,lib;
00052 parseFilter(*itr,fnc,lib);
00053
00054 if (fnc != "") {
00055 filterFnc(fnc);
00056 m_filterfnc.insert(fnc);
00057 }
00058
00059 if (lib != "") {
00060 filterLib(lib);
00061 m_filterlib.insert(lib);
00062 }
00063
00064 }
00065
00066 return StatusCode::SUCCESS;
00067
00068 }
00069
00070
00071
00072 StatusCode
00073 StatusCodeSvc::reinitialize() {
00074
00075 MsgStream log( msgSvc(), name() );
00076 log << MSG::INFO << "reinitialize" << endmsg;
00077
00078 return StatusCode::SUCCESS;
00079
00080 }
00081
00082
00083 StatusCode
00084 StatusCodeSvc::finalize() {
00085
00086 if (m_dat.size() > 0) {
00087 MsgStream log( msgSvc(), name() );
00088
00089 log << MSG::INFO << "listing all unchecked return codes:" << endmsg;
00090
00091 list();
00092
00093 }
00094
00095 return StatusCode::SUCCESS;
00096
00097 }
00098
00099
00100
00101
00102
00103 void
00104 StatusCodeSvc::regFnc(const std::string& fnc, const std::string& lib) {
00105
00106 if (m_state == Gaudi::StateMachine::OFFLINE ||
00107 m_state == Gaudi::StateMachine::CONFIGURED) {
00108 return;
00109 }
00110
00111 if (m_dict && lib.rfind("Dict.so") == (lib.length()-7) ) {
00112 return;
00113 }
00114
00115 {
00116 const string rlib = lib.substr(lib.rfind("/") + 1);
00117
00118 if (m_filterfnc.find(fnc) != m_filterfnc.end() ||
00119 m_filterlib.find(rlib) != m_filterlib.end() ) {
00120 return;
00121 }
00122 }
00123
00124 if (m_abort) {
00125 MsgStream log( msgSvc(), name() );
00126 log << MSG::FATAL << "Unchecked StatusCode in " << fnc << " from lib "
00127 << lib << endmsg;
00128 abort();
00129 }
00130
00131 string key = fnc + lib;
00132
00133 map<string,StatCodeDat>::iterator itr = m_dat.find(key);
00134
00135 if (itr != m_dat.end()) {
00136 itr->second.count += 1;
00137 } else {
00138
00139 const string rlib = lib.substr(lib.rfind("/") + 1);
00140
00141 StatCodeDat dat;
00142 dat.fnc = fnc;
00143 dat.lib = rlib;
00144 dat.count = 1;
00145
00146 m_dat[key] = dat;
00147 }
00148
00149 }
00150
00151
00152
00153 void
00154 StatusCodeSvc::list() const {
00155
00156 MsgStream log( msgSvc(), name() );
00157 log << MSG::INFO << endl;
00158
00159 map<string,StatCodeDat>::const_iterator itr;
00160
00161 #if defined (__GNUC__) && ( __GNUC__ <= 2 )
00162 std::ostrstream os;
00163 #else
00164 std::ostringstream os;
00165 #endif
00166
00167 os << "Num | Function | Source Library" << endl;
00168 os << "----+--------------------------------+-------------------"
00169 << "-----------------------" << endl;
00170
00171
00172 for(itr = m_dat.begin(); itr != m_dat.end(); ++itr ) {
00173 StatCodeDat dat = itr->second;
00174
00175 os.width(3);
00176 os.setf(ios_base::right,ios_base::adjustfield);
00177 os << dat.count;
00178
00179 os << " | ";
00180 os.width(30);
00181 os.setf(ios_base::left,ios_base::adjustfield);
00182 os << dat.fnc;
00183
00184 os << " | ";
00185 os.setf(ios_base::left,ios_base::adjustfield);
00186 os << dat.lib;
00187
00188 os << endl;
00189
00190 }
00191
00192
00193 log << os.str() << endmsg;
00194
00195 }
00196
00197
00198
00199 void
00200 StatusCodeSvc::filterFnc(const std::string& str) {
00201
00202 std::map<std::string, StatCodeDat>::iterator itr;
00203 for (itr = m_dat.begin(); itr != m_dat.end(); ++itr ) {
00204 if (itr->second.fnc == str) {
00205 m_dat.erase(itr);
00206 return;
00207 }
00208
00209 }
00210
00211 }
00212
00213
00214 void
00215 StatusCodeSvc::filterLib(const std::string& str) {
00216
00217 std::map<std::string, StatCodeDat>::iterator itr;
00218 for (itr = m_dat.begin(); itr != m_dat.end(); ++itr ) {
00219 if (itr->second.lib == str) {
00220 m_dat.erase(itr);
00221 return;
00222 }
00223
00224 }
00225
00226 }
00227
00228
00229
00230 void
00231 StatusCodeSvc::parseFilter(const string& str, string& fnc, string& lib) {
00232
00233
00234 string::size_type loc = str.find("=");
00235 if (loc == std::string::npos) {
00236 fnc = str;
00237 lib = "";
00238 } else {
00239 string key,val;
00240 key = str.substr(0,loc);
00241 val = str.substr(loc+1,str.length()-loc-1);
00242
00243 toupper(key);
00244
00245 if (key == "FCN" || key == "FNC") {
00246 fnc = val;
00247 lib = "";
00248 } else if (key == "LIB") {
00249 fnc = "";
00250 lib = val;
00251 } else {
00252 fnc = "";
00253 lib = "";
00254
00255 MsgStream log( msgSvc(), name() );
00256 log << MSG::WARNING << "ignoring unknown token in Filter: " << str
00257 << endmsg;
00258 }
00259 }
00260
00261 }
00262
00263
00264
00265 DECLARE_SERVICE_FACTORY(StatusCodeSvc)