1 /*! 2 \class StMessMgr 3 \author G. Van Buren, BNL 4 5 This class provides the interface for STAR offline messaging. 6 It is an abstract class which is inherited by the StMessageManager 7 class. StMessageManager implements the functionality for managing 8 messages, which are instances of the class StMessage. For more 9 details refer to the StMessageManager class. 10 \sa http://www.star.bnl.gov/STAR/comp/pkg/dev/StRoot/StUtilities/doc/StMessMgr.html 11 12 */ 13 14 #ifndef ClassStMessMgr 15 #define ClassStMessMgr 16 17 #ifdef __ROOT__ 18 #include "Rtypes.h" 19 #endif 20 21 #ifndef __CINT__ 22 #ifdef LOGGERMESSAGE 23 #error An attempt to redefine the LOGGERMESSAGE macro 24 #else 25 # define LOGGERMESSAGE(MESSAGELEVEL) \ 26 if (StMessMgr::CurrentMessager()->_NAME3_(is,MESSAGELEVEL,Enabled)()) \ 27 StMessMgr::CurrentMessager()->MESSAGELEVEL("","O",__FUNCTION__, __LINE__) 28 29 # define LOG_INFO LOGGERMESSAGE(Info) 30 # define LOG_WARN LOGGERMESSAGE(Warning) 31 # define LOG_ERROR LOGGERMESSAGE(Error) 32 # define LOG_FATAL LOGGERMESSAGE(Fatal) 33 # define LOG_DEBUG LOGGERMESSAGE(Debug) 34 # define LOG_QA LOGGERMESSAGE(QAInfo) 35 # define LOG_UCM LOGGERMESSAGE(UCMInfo) 36 37 #define STAR_INFO(name) \ 38 GetLogger(_QUITE_(name))->MESSAGELEVEL(__FUNCTION__, __LINE__) 39 40 #define MSG_INFO(name) \ 41 GetLogger(_QUITE_(name))->MESSAGELEVEL(__FUNCTION__, __LINE__) 42 #endif 43 #endif 44 45 #ifndef __CINT__ 46 #include "StarCallf77.h" 47 #define Message_ F77_NAME(message,MESSAGE) 48 #define Msg_Enable_ F77_NAME(msg_enable,MSG_ENABLE) 49 #define Msg_Enabled_ F77_NAME(msg_enabled,MSG_ENABLED) 50 #define Msg_Disable_ F77_NAME(msg_disable,MSG_DISABLE) 51 #define StMessage_ F77_NAME(stmessage,STMESSAGE) 52 #define StInfo_ F77_NAME(stinfo,STINFO) 53 #define StWarning_ F77_NAME(stwarning,STWARNING) 54 #define StError_ F77_NAME(sterror,STERROR) 55 #define StDebug_ F77_NAME(stdebug,STDEBUG) 56 #define QAInfo_ F77_NAME(qainfo,QAINFO) 57 #define UCMInfo_ F77_NAME(ucminfo,UCMINFO) 58 #define StInfoOpt_ F77_NAME(stinfoopt,STINFOOPT) 59 #define StWarningOpt_ F77_NAME(stwarningopt,STWARNINGOPT) 60 #define StErrorOpt_ F77_NAME(sterroropt,STERROROPT) 61 #define StDebugOpt_ F77_NAME(stdebugopt,STDEBUGOPT) 62 #define QAInfoOpt_ F77_NAME(qainfoopt,QAINFOOPT) 63 #define UCMInfoOpt_ F77_NAME(ucminfoopt,UCMINFOOPT) 64 #define StMessAddType_ F77_NAME(stmessaddtype,STMESSADDTYPE) 65 extern "C" { 66 void type_of_call Message_(const char* mess, int *lines, int *id, size_t len); 67 void type_of_call Msg_Enable_(const char* mess, size_t len); 68 int type_of_call Msg_Enabled_(const char* mess, int *id, size_t len); 69 void type_of_call Msg_Disable_(const char* mess, size_t len); 70 void type_of_call MessageOut(const char* msg); 71 void type_of_call StMessage_(const char* mess, const char* type, 72 const char* opt, size_t len1, 73 size_t len2, size_t len3); 74 void type_of_call StInfo_(const char* mess, size_t len); 75 void type_of_call StWarning_(const char* mess, size_t len); 76 void type_of_call StError_(const char* mess, size_t len); 77 void type_of_call StDebug_(const char* mess, size_t len); 78 void type_of_call QAInfo_(const char* mess, size_t len); 79 void type_of_call UCMInfo_(const char* mess, size_t len); 80 void type_of_call StInfoOpt_(const char* mess, const char* opt, 81 size_t len1, size_t len2); 82 void type_of_call StWarningOpt_(const char* mess, const char* opt, 83 size_t len1, size_t len2); 84 void type_of_call StErrorOpt_(const char* mess, const char* opt, 85 size_t len1, size_t len2); 86 void type_of_call StDebugOpt_(const char* mess, const char* opt, 87 size_t len1, size_t len2); 88 void type_of_call QAInfoOpt_(const char* mess, const char* opt, 89 size_t len1, size_t len2); 90 void type_of_call UCMInfoOpt_(const char* mess, const char* opt, 91 size_t len1, size_t len2); 92 void type_of_call StMessAddType_(const char* type, const char* text, 93 size_t len1, size_t len2); 94 } 95 #endif 96 97 98 99 class StMessage; 100 101 #ifndef ClassMessVec 102 class messVec; 103 #endif 104 105 #include <Stsstream.h> 106 #include <Stiostream.h> 107 108 class StMessMgr : public ostrstream { 109 friend ostream& operator<<(ostream& ,StMessage*); 110 friend ostream& operator++(StMessMgr&); 111 friend ostream& operator-(StMessMgr&); 112 friend ostream& operator--(StMessMgr&); 113 friend ostream& operator~(StMessMgr&); 114 friend class StBFChain; 115 116 private: 117 118 protected: 119 virtual void IgnoreRepeats() =0; 120 virtual void AllowRepeats() =0; 121 // fake operator= to follish the bug in the RootCint 122 StMessMgr& operator=(const StMessMgr&){ return *this;} 123 public: 124 enum ESTARMakerErrorLevels { 125 kAll=-5, kFatal, kError, kWarning, kInfo, kDefault, kDebug, kDebug2 126 }; 127 StMessMgr(); 128 StMessMgr(const StMessMgr&){;} 129 virtual ~StMessMgr(){;} 130 // operator << 131 132 virtual std::ostream& OperatorShift(std::ostream& os, StMessage* stm) = 0; 133 134 // Generic Messages: 135 virtual ostrstream& Message(const char* mess="", const char* type="", 136 const char* opt=0,const char *sourceFileName=0, int lineNumber=-1)= 0; 137 virtual void Print() =0; 138 virtual int PrintList(messVec* list) =0; 139 virtual int PrintAll() =0; 140 virtual StMessage* FindMessage(const char* s1, const char s2[]="", 141 const char* s3="", const char* s4="", messVec* list=0) =0; 142 virtual messVec* FindMessageList(const char* s1, const char* s2="", 143 const char* s3="", const char* s4="", messVec* list=0) =0; 144 virtual int RemoveMessage(StMessage* mess) =0; 145 virtual int RemoveMessage(const char* s1, const char* s2="", 146 const char* s3="", const char* s4="") =0; 147 virtual void SetLimit(const char* str, int n=0) =0; 148 virtual int GetLimit(const char* str) =0; 149 virtual void ListLimits() =0; 150 virtual void RemoveLimit(const char* str) =0; 151 virtual void SetLevel(Int_t logLevel) =0; 152 virtual Int_t GetLevel(Int_t logLevel) const =0; 153 virtual const char *GetName() const = 0; 154 virtual void SwitchOff(const char* str) =0; 155 virtual void SwitchOn(const char* str) =0; 156 virtual void FixOn(const char* str) =0; 157 virtual void NoLimits() =0; 158 virtual void Summary(size_t nTerms=1) =0; 159 virtual void MemorySummary() =0; 160 virtual void MemoryOn() =0; 161 virtual void MemoryOff() =0; 162 virtual int AddType(const char* type, const char* text) =0; 163 virtual int ListTypes() =0; 164 virtual void Close() {} // Close the messenger streams 165 //Optimization 166 /* 167 * <p>If you are worried about speed, then you should write 168 * <pre> 169 * if(logger->isDebugEnabled()) { 170 * logger->debug("debug message"); 171 * } 172 * </pre> 173 * 174 * <p>This way you will not incur the cost of parameter 175 * construction if debugging is disabled for <code>logger</code>. On 176 * the other hand, if the <code>logger 177 </code> is debug enabled, you 178 * will incur the cost of evaluating whether the logger is debug 179 * enabled twice. Once in <code>isDebugEnabled</code> and once in 180 * the <code>debug</code>. This is an insignificant overhead 181 * since evaluating a logger takes about 1%% of the time it 182 * takes to actually log. 183 * 184 * @return bool - <code>true</code> if this logger is debug 185 * enabled, <code>false</code> otherwise. 186 * */ 187 virtual bool isDebugEnabled() const; 188 virtual bool isWarnEnabled() const; 189 virtual bool isWarningEnabled() const; 190 virtual bool isErrorEnabled() const; 191 virtual bool isInfoEnabled() const; 192 virtual bool isFatalEnabled() const; 193 virtual bool isEnabledFor() const; 194 virtual bool isQAInfoEnabled() const; 195 virtual bool isUCMInfoEnabled()const; 196 197 198 199 // Manager factory 200 public: 201 static StMessMgr* CurrentMessager(); 202 static StMessMgr* Instance(); 203 static StMessMgr* Instance(const char *); 204 static StMessMgr* SetCurrentMessager(StMessMgr *mgr=0); 205 protected: 206 virtual StMessMgr* Instantiate(); 207 virtual StMessMgr* Instantiate(const char *); 208 209 public: 210 // Info Messages: 211 virtual ostrstream& Info(const char* mess="", const char* opt="O",const char *sourceFileName=0, int lineNumber=-1)=0; 212 virtual int PrintInfos() =0; 213 virtual const messVec* GetInfos() =0; 214 virtual StMessage* FindInfo(const char* s1, const char* s2="", 215 const char* s3="", const char* s4="") =0; 216 virtual messVec* FindInfoList(const char* s1, const char* s2="", 217 const char* s3="", const char* s4="") =0; 218 219 // Warning Messages: 220 virtual ostrstream& Warning(const char* mess="", const char* opt="E",const char *sourceFileName=0, int lineNumber=-1)= 0; 221 virtual int PrintWarnings() =0; 222 virtual const messVec* GetWarnings() =0; 223 virtual StMessage* FindWarning(const char* s1, const char* s2="", 224 const char* s3="", const char* s4="") =0; 225 virtual messVec* FindWarningList(const char* s1, const char* s2="", 226 const char* s3="", const char* s4="") =0; 227 228 // Error Messages: 229 virtual ostrstream& Error(const char* mess="", const char* opt="E",const char *sourceFileName=0, int lineNumber=-1) = 0; 230 virtual int PrintErrors() =0; 231 virtual const messVec* GetErrors() =0; 232 virtual StMessage* FindError(const char* s1, const char* s2="", 233 const char* s3="", const char* s4="") =0; 234 virtual messVec* FindErrorList(const char* s1, const char* s2="", 235 const char* s3="", const char* s4="") =0; 236 237 // Debug Messages: 238 virtual ostrstream& Debug(const char* mess="", const char* opt="OT",const char *sourceFileName=0, int lineNumber=-1)= 0; 239 virtual int PrintDebug() =0; 240 virtual const messVec* GetDebugs() =0; 241 virtual StMessage* FindDebug(const char* s1, const char* s2="", 242 const char* s3="", const char* s4="") =0; 243 virtual messVec* FindDebugList(const char* s1, const char* s2="", 244 const char* s3="", const char* s4="") =0; 245 246 // QAInfo Messages: 247 virtual ostrstream& QAInfo(const char* mess="", const char* opt="OS",const char *sourceFileName=0, int lineNumber=-1) = 0; 248 virtual int PrintQAInfo() =0; 249 virtual const messVec* GetQAInfos() =0; 250 virtual StMessage* FindQAInfo(const char* s1, const char* s2="", 251 const char* s3="", const char* s4="") =0; 252 virtual messVec* FindQAInfoList(const char* s1, const char* s2="", 253 const char* s3="", const char* s4="") =0; 254 255 // UCMInfo Messages: 256 virtual ostrstream& UCMInfo(const char* mess="", const char* opt="OS",const char *sourceFileName=0, int lineNumber=-1) = 0; 257 virtual int PrintUCMInfo() =0; 258 virtual const messVec* GetUCMInfos() =0; 259 virtual StMessage* FindUCMInfo(const char* s1, const char* s2="", 260 const char* s3="", const char* s4="") =0; 261 virtual messVec* FindUCMInfoList(const char* s1, const char* s2="", 262 const char* s3="", const char* s4="") =0; 263 264 // "As is" Messages: 265 virtual ostrstream& out(const char* mess="") = 0; 266 virtual ostrstream& err(const char* mess="") = 0; 267 268 virtual void PrintInfo() =0; 269 // Fatal Messages: 270 virtual ostrstream& Fatal(const char* mess="", const char* opt="OT",const char *sourceFileName=0, int lineNumber=-1)= 0; 271 272 #ifdef __ROOT__ 273 ClassDef(StMessMgr,0) 274 #endif 275 }; 276 277 //______________________________________________________________________________ 278 // 279 // StTurnLogger - an aux class to simply "save/restore the "current" logger 280 //______________________________________________________________________________ 281 class StTurnLogger 282 { 283 private: 284 StMessMgr* fMessager; // hold the messager to restore it at dtor 285 public: 286 StTurnLogger(StMessMgr* msg=0); 287 StTurnLogger(const StTurnLogger& push); 288 ~StTurnLogger(); 289 }; 290 291 // Global pointers: 292 R__EXTERN StMessMgr* gMessMgr; 293 R__EXTERN StMessage* gMessage; 294 R__EXTERN StMessage* endm; 295 // R__EXTERN StMessMgr& gMess; 296 297 //______________________________________________________________________________ 298 inline StTurnLogger::StTurnLogger(StMessMgr* msg): fMessager(0) 299 { 300 if (msg) fMessager = StMessMgr::SetCurrentMessager(msg); 301 } 302 303 //______________________________________________________________________________ 304 inline StTurnLogger::StTurnLogger(const StTurnLogger& push) : fMessager(push.fMessager) 305 { ((StTurnLogger*)&push)->fMessager=0; } 306 307 //______________________________________________________________________________ 308 inline StTurnLogger::~StTurnLogger() 309 {if (fMessager) StMessMgr::SetCurrentMessager(fMessager);} 310 311 312 //______________________________________________________________________________ 313 inline ostream& operator<<(ostream& os, StMessage* stm) { 314 return gMessMgr->OperatorShift(os,stm); 315 } 316 317 //______________________________________________________________________________ 318 inline ostream& operator++(StMessMgr&) { 319 return gMessMgr->Info(); 320 } 321 //______________________________________________________________________________ 322 inline ostream& operator--(StMessMgr&) { 323 return gMessMgr->Error(); 324 } 325 //______________________________________________________________________________ 326 inline ostream& operator~(StMessMgr&) { 327 return gMessMgr->out(); 328 } 329 //______________________________________________________________________________ 330 inline ostream& operator-(StMessMgr&) { 331 return gMessMgr->err(); 332 } 333 334 335 336 337 #endif 338 339 // $Id: StMessMgr.h,v 1.13 2009/06/22 22:36:02 fine Exp $ 340