00001 #include "FWCore/MessageLogger/interface/MessageSender.h" 00002 #include "FWCore/MessageLogger/interface/MessageLoggerQ.h" 00003 #include "FWCore/MessageLogger/interface/MessageDrop.h" 00004 00005 #define TRACE_DROP 00006 #ifdef TRACE_DROP 00007 #include <iostream> 00008 #endif 00009 00010 // Change log 00011 // 00012 // 1 mf 8/25/08 keeping the error summary information for 00013 // LoggedErrorsSummary() 00014 // 00015 00016 00017 using namespace edm; 00018 00019 bool MessageSender::errorSummaryIsBeingKept = false; // change log 1 00020 bool MessageSender::freshError = false; 00021 std::map<ErrorSummaryMapKey, unsigned int> MessageSender::errorSummaryMap; 00022 00023 MessageSender::MessageSender( ELseverityLevel const & sev, 00024 ELstring const & id, 00025 bool verbatim ) 00026 : errorobj_p( new ErrorObj(sev,id,verbatim) ) 00027 { 00028 //std::cout << "MessageSender ctor; new ErrorObj at: " << errorobj_p << '\n'; 00029 } 00030 00031 MessageSender::MessageSender( ELseverityLevel const & sev, 00032 ELstring const & id ) 00033 : errorobj_p( new ErrorObj(sev,id,false) ) 00034 { 00035 //std::cout << "MessageSender ctor; new ErrorObj at: " << errorobj_p << '\n'; 00036 } 00037 00038 00039 // This destructor must not be permitted to throw. A 00040 // boost::thread_resoruce_error is thrown at static destruction time, 00041 // if the MessageLogger library is loaded -- even if it is not used. 00042 MessageSender::~MessageSender() 00043 { 00044 try 00045 { 00046 //std::cout << "MessageSender dtor; ErrorObj at: " << errorobj_p << '\n'; 00047 00048 // surrender ownership of our ErrorObj, transferring ownership 00049 // (via the intermediate MessageLoggerQ) to the MessageLoggerScribe 00050 // that will (a) route the message text to its destination(s) 00051 // and will then (b) dispose of the ErrorObj 00052 00053 MessageDrop * drop = MessageDrop::instance(); 00054 if (drop) { 00055 errorobj_p->setModule(drop->moduleName); 00056 errorobj_p->setContext(drop->runEvent); 00057 } 00058 #ifdef TRACE_DROP 00059 if (!drop) std::cerr << "MessageSender::~MessageSender() - Null drop pointer \n"; 00060 #endif 00061 // change log 1 00062 if ( errorSummaryIsBeingKept && 00063 errorobj_p->xid().severity >= ELwarning ) 00064 { 00065 ELextendedID const & xid = errorobj_p->xid(); 00066 ErrorSummaryMapKey key (xid.id, xid.module); 00067 ErrorSummaryMapIterator i = errorSummaryMap.find(key); 00068 if (i != errorSummaryMap.end()) { 00069 ++(i->second); // same as ++errorSummaryMap[key] 00070 } else { 00071 errorSummaryMap[key] = 1; 00072 } 00073 freshError = true; 00074 } 00075 00076 MessageLoggerQ::MLqLOG(errorobj_p); 00077 } 00078 catch ( ... ) 00079 { 00080 // nothing to do 00081 00082 // for test that removal of thread-involved static works, 00083 // simply throw here, then run in trivial_main in totalview 00084 // and Next or Step so that the exception would be detected. 00085 // That test has been done 12/14/07. 00086 } 00087 }