3 /**************************************************************************
4 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
6 * Authors: Matthias Richter <Matthias.Richter@ift.uib.no> *
7 * Timm Steinbeck <timm@kip.uni-heidelberg.de> *
8 * for The ALICE Off-line Project. *
10 * Permission to use, copy, modify and distribute this software and its *
11 * documentation strictly for non-commercial purposes is hereby granted *
12 * without fee, provided that the above copyright notice appears in all *
13 * copies and that both the copyright notice and this permission notice *
14 * appear in the supporting documentation. The authors make no claims *
15 * about the suitability of this software for any purpose. It is *
16 * provided "as is" without express or implied warranty. *
17 **************************************************************************/
19 /** @file AliHLTLogging.cxx
20 @author Matthias Richter, Timm Steinbeck
22 @brief Implementation of HLT logging primitives.
29 #include "AliHLTStdIncludes.h"
30 #include "AliHLTLogging.h"
33 // global logging buffer
34 #define LOG_BUFFER_SIZE 100
35 char gAliHLTLoggingBuffer[LOG_BUFFER_SIZE]="";
36 char gAliHLTLoggingOriginBuffer[LOG_BUFFER_SIZE]="";
38 /** ROOT macro for the implementation of ROOT specific class methods */
39 ClassImp(AliHLTLogging)
41 AliHLTLogging::AliHLTLogging()
43 //fLocalLogFilter(kHLTLogDefault),
44 fLocalLogFilter(kHLTLogAll),
45 fpDefaultKeyword(NULL),
46 fpCurrentKeyword(NULL)
50 AliHLTLogging::AliHLTLogging(const AliHLTLogging&)
52 fLocalLogFilter(kHLTLogAll),
53 fpDefaultKeyword(NULL),
54 fpCurrentKeyword(NULL)
56 HLTFatal("copy constructor untested");
59 AliHLTLogging& AliHLTLogging::operator=(const AliHLTLogging&)
61 HLTFatal("assignment operator untested");
65 AliHLTComponentLogSeverity AliHLTLogging::fGlobalLogFilter=kHLTLogAll;
66 AliHLTfctLogging AliHLTLogging::fLoggingFunc=NULL;
68 AliHLTLogging::~AliHLTLogging()
72 int AliHLTLogging::Init(AliHLTfctLogging pFun)
74 if (fLoggingFunc!=NULL && fLoggingFunc!=pFun) {
75 (*fLoggingFunc)(NULL/*fParam*/, kHLTLogWarning, "AliHLTLogging::Init", "no key", "overriding previously initialized logging function");
81 int AliHLTLogging::Message(void *param, AliHLTComponentLogSeverity severity, const char* origin, const char* keyword, const char* message) {
84 // this is currently just to get rid of the warning "unused parameter"
86 const char* strSeverity="";
88 case kHLTLogBenchmark:
89 strSeverity="benchmark";
98 strSeverity="warning";
109 TString out="HLT Log ";
111 if (origin) {out+=": "; out+=origin;}
112 out+=" "; out+=message;
113 if (keyword!=NULL && strcmp(keyword, HLT_DEFAULT_LOG_KEYWORD)!=0) {
114 out+=" ("; out+=keyword; out +=")";
116 cout << out.Data() << endl;
120 const char* AliHLTLogging::BuildLogString(const char *format, va_list ap) {
122 int iBufferSize=LOG_BUFFER_SIZE;
123 char* tgtBuffer=gAliHLTLoggingBuffer;
126 #if (defined LOG_PREFIX)
127 tgtLen = snprintf(tgtBuffer, iBufferSize, LOG_PREFIX); // add logging prefix
130 tgtBuffer+=tgtLen; iBufferSize-=tgtLen;
131 tgtLen = vsnprintf(tgtBuffer, iBufferSize, format, ap);
134 // if (tgtLen<LOG_BUFFER_SIZE-1) {
135 // *tgtBuffer++='\n'; // add newline if space in buffer
137 *tgtBuffer=0; // terminate the buffer
140 return gAliHLTLoggingBuffer;
143 int AliHLTLogging::Logging(AliHLTComponentLogSeverity severity, const char* origin, const char* keyword, const char* format, ... ) {
144 int iResult=CheckFilter(severity);
147 va_start(args, format);
149 iResult = (*fLoggingFunc)(NULL/*fParam*/, severity, origin, keyword, AliHLTLogging::BuildLogString(format, args ));
151 iResult = Message(NULL/*fParam*/, severity, origin, keyword, AliHLTLogging::BuildLogString(format, args ));
157 int AliHLTLogging::LoggingVarargs( AliHLTComponentLogSeverity severity, const char* origin_class, const char* origin_func, ... ) const
159 int iResult=CheckFilter(severity);
161 int iMaxSize=LOG_BUFFER_SIZE-1;
163 const char* separator="";
164 gAliHLTLoggingOriginBuffer[iPos]=0;
166 if ((int)strlen(origin_class)<iMaxSize-iPos) {
167 strcpy(&gAliHLTLoggingOriginBuffer[iPos], origin_class);
168 iPos+=strlen(origin_class);
173 if ((int)strlen(origin_func)+(int)strlen(separator)<iMaxSize-iPos) {
174 strcpy(&gAliHLTLoggingOriginBuffer[iPos], separator);
175 iPos+=strlen(separator);
176 strcpy(&gAliHLTLoggingOriginBuffer[iPos], origin_func);
177 iPos+=strlen(origin_func);
181 va_start(args, origin_func);
182 const char* format = va_arg(args, const char*);
184 const char* message=format;
185 const char* qualifier=NULL;
186 if ((qualifier=strchr(format, '%'))!=NULL) {
187 message=AliHLTLogging::BuildLogString(format, args);
190 iResult=(*fLoggingFunc)(NULL/*fParam*/, severity, gAliHLTLoggingOriginBuffer, GetKeyword(), message);
192 iResult=Message(NULL/*fParam*/, severity, gAliHLTLoggingOriginBuffer, GetKeyword(), message);
199 int AliHLTLogging::CheckFilter(AliHLTComponentLogSeverity severity) const
201 int iResult=severity==kHLTLogNone || (severity&fGlobalLogFilter)>0 && (severity&fLocalLogFilter)>0;