#ifndef XRC_DEBUG_H
#define XRC_DEBUG_H
/******************************************************************************/
/* */
/* X r d C l i e n t D e b u g . h h */
/* */
/* Author: Fabrizio Furano (INFN Padova, 2004) */
/* Adapted from TXNetFile (root.cern.ch) originally done by */
/* Alvise Dorigo, Fabrizio Furano */
/* INFN Padova, 2003 */
/* */
/* This file is part of the XRootD software suite. */
/* */
/* XRootD is free software: you can redistribute it and/or modify it under */
/* the terms of the GNU Lesser General Public License as published by the */
/* Free Software Foundation, either version 3 of the License, or (at your */
/* option) any later version. */
/* */
/* XRootD is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */
/* License for more details. */
/* */
/* You should have received a copy of the GNU Lesser General Public License */
/* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
/* COPYING (GPL license). If not, see . */
/* */
/* The copyright holder's institutional names and contributor's names may not */
/* be used to endorse or promote products derived from this software without */
/* specific prior written permission of the institution or contributor. */
/******************************************************************************/
//////////////////////////////////////////////////////////////////////////
// //
// Singleton used to handle the debug level and the log output //
// //
//////////////////////////////////////////////////////////////////////////
#include
#include "XrdClient/XrdClientConst.hh"
#include "XrdSys/XrdSysPthread.hh"
#include "XrdClient/XrdClientEnv.hh"
#include "XrdSys/XrdSysHeaders.hh"
#include "XrdSys/XrdSysLogger.hh"
#include "XrdSys/XrdSysError.hh"
using namespace std;
#define DebugLevel() XrdClientDebug::Instance()->GetDebugLevel()
#define DebugSetLevel(l) XrdClientDebug::Instance()->SetLevel(l)
#define Info(lvl, where, what) { \
XrdClientDebug::Instance()->Lock();\
if (XrdClientDebug::Instance()->GetDebugLevel() >= lvl) {\
ostringstream outs;\
outs << where << ": " << what; \
XrdClientDebug::Instance()->TraceStream((short)lvl, outs);\
}\
XrdClientDebug::Instance()->Unlock();\
}
#define Error(where, what) { \
ostringstream outs;\
outs << where << ": " << what; \
XrdClientDebug::Instance()->TraceStream((short)XrdClientDebug::kNODEBUG, outs);\
}
class XrdClientDebug {
private:
short fDbgLevel;
XrdSysLogger *fOucLog;
XrdSysError *fOucErr;
static XrdClientDebug *fgInstance;
XrdSysRecMutex fMutex;
protected:
XrdClientDebug();
~XrdClientDebug();
public:
enum {
kNODEBUG = 0,
kUSERDEBUG = 1,
kHIDEBUG = 2,
kDUMPDEBUG = 3
};
short GetDebugLevel() {
XrdSysMutexHelper m(fMutex);
return fDbgLevel;
}
static XrdClientDebug *Instance();
inline void SetLevel(int l) {
XrdSysMutexHelper m(fMutex);
fDbgLevel = l;
}
inline void TraceStream(short DbgLvl, ostringstream &s) {
XrdSysMutexHelper m(fMutex);
if (DbgLvl <= GetDebugLevel())
fOucErr->Emsg("", s.str().c_str() );
s.str("");
}
// ostringstream outs; // Declare an output string stream.
inline void TraceString(short DbgLvl, char * s) {
XrdSysMutexHelper m(fMutex);
if (DbgLvl <= GetDebugLevel())
fOucErr->Emsg("", s);
}
inline void Lock() { fMutex.Lock(); }
inline void Unlock() { fMutex.UnLock(); }
};
#endif