]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliLog.h
Introduced the checking of QA results from previous step before entering the event...
[u/mrichter/AliRoot.git] / STEER / AliLog.h
index e7939c57fc4a543f8cf975820f2c57ad8b881b4d..64e041c494537284e4bf2518f5a61b76f236575f 100644 (file)
@@ -21,6 +21,8 @@ class AliLog: public TObject {
   static AliLog* Instance() {return fgInstance;}
 
   enum EType_t {kFatal = 0, kError, kWarning, kInfo, kDebug, kMaxType};
+  typedef void (*AliLogNotification)(EType_t type, const char* message );
+
 
   static void  EnableDebug(Bool_t enabled);
   static void  SetGlobalLogLevel(EType_t type);
@@ -38,6 +40,10 @@ class AliLog: public TObject {
   static void  SetErrorOutput(EType_t type);
   static void  SetFileOutput(const char* fileName);
   static void  SetFileOutput(EType_t type, const char* fileName);
+  static void  SetStreamOutput(ostream* stream);
+  static void  SetStreamOutput(EType_t type, ostream* stream);
+  static void  SetLogNotification(AliLogNotification pCallBack);
+  static void  SetLogNotification(EType_t type, AliLogNotification pCallBack);
   static void  Flush();
 
   static void  SetHandleRootMessages(Bool_t on);
@@ -96,6 +102,8 @@ class AliLog: public TObject {
                               const char* module, const char* className,
                               const char* function, 
                               const char* file, Int_t line);
+
+  void           PrintString(Int_t type, FILE* stream, const char* format, ...);
   void           PrintRepetitions();
 
   Int_t          RedirectTo(FILE* stream, EType_t type, UInt_t level,
@@ -120,7 +128,7 @@ class AliLog: public TObject {
   Int_t          fOutputTypes[kMaxType];     // types of output streams
   TString        fFileNames[kMaxType];       // file names
   FILE*          fOutputFiles[kMaxType];     //! log output files
-  ofstream*      fOutputStreams[kMaxType];   //! log output streams
+  ostream*       fOutputStreams[kMaxType];   //! log output streams
 
   Bool_t         fPrintType[kMaxType];       // print type on/off
   Bool_t         fPrintModule[kMaxType];     // print module on/off
@@ -137,6 +145,7 @@ class AliLog: public TObject {
   TString        fLastFunction;              //! function name of last message
   TString        fLastFile;                  //! file name of last message
   Int_t          fLastLine;                  //! line number of last message
+  AliLogNotification fCallBacks[kMaxType];   //! external notification callback
 
   ClassDef(AliLog, 1)   // class for logging debug, info and error messages
 };
@@ -181,9 +190,44 @@ class AliLog: public TObject {
 #define AliDebugClass(level, message)
 #define AliDebugGeneral(scope, level, message)
 #else
-#define AliDebug(level, message) {if (AliLog::IsDebugEnabled()) AliLog::Debug(level, message, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__);}
-#define AliDebugClass(level, message) {if (AliLog::IsDebugEnabled()) AliLog::Debug(level, message, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__);}
-#define AliDebugGeneral(scope, level, message) {if (AliLog::IsDebugEnabled()) AliLog::Debug(level, message, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__);}
+/** @defn AliDebug 
+    @param N Debug level - always evaluated 
+    @param A Argument Form(including paranthesis) - the message to
+    print.  Note, that @a A should contain balanced paranthesis, like 
+    @verbatim 
+      AliDebug(1, Form("Failed to decode line %d of %s", line, filename));
+    @endverbatim 
+    The point is, if the current log level isn't high enough, as
+    returned by the AliLog object, then we do not want to evalute the
+    call to Form, since that is an expensive call.  We should always
+    put macros like this into a @c do ... @c while loop, since that
+    makes sure that evaluations are local, and that we can safely put
+    a @c ; after the macro call.  Note, that @c do ... @c while loop
+    and the call with extra paranthis, are an old tricks used by many
+    C coders (see for example Bison, the Linux kernel, and the like).
+    Christian Holm Christensen
+*/
+#define AliDebug(N, A) \
+  do { \
+    if (!AliLog::IsDebugEnabled() || \
+      AliLog::GetDebugLevel(MODULENAME(), ClassName()) < N)  break; \
+    AliLog::Debug(N, A, MODULENAME(), ClassName(), FUNCTIONNAME(), \
+                 __FILE__, __LINE__); } while (false)
+//#define AliDebug(level, message) {if (AliLog::IsDebugEnabled()) AliLog::Debug(level, message, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__);}
+#define AliDebugClass(N, A) \
+  do { \
+    if (!AliLog::IsDebugEnabled() || \
+      AliLog::GetDebugLevel(MODULENAME(), Class()->GetName()) < N)  break; \
+    AliLog::Debug(N, A, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), \
+                 __FILE__, __LINE__); } while (false)
+//#define AliDebugClass(level, message) {if (AliLog::IsDebugEnabled()) AliLog::Debug(level, message, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__);}
+#define AliDebugGeneral(scope, N, A) \
+  do { \
+    if (!AliLog::IsDebugEnabled() || \
+      AliLog::GetDebugLevel(MODULENAME(), scope) < N)  break; \
+    AliLog::Debug(N, A, MODULENAME(), scope, FUNCTIONNAME(), \
+                 __FILE__, __LINE__); } while (false)
+//#define AliDebugGeneral(scope, level, message) {if (AliLog::IsDebugEnabled()) AliLog::Debug(level, message, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__);}
 #endif
 
 // redirection to debug