]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/BASE/AliHLTErrorGuard.h
ALIROOT-5600 - skip non-participating detector modules
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTErrorGuard.h
CommitLineData
9c564685 1//-*- Mode: C++ -*-
2// $Id$
3
4#ifndef ALIHLTERRORGUARD_H
5#define ALIHLTERRORGUARD_H
6//* This file is property of and copyright by the ALICE HLT Project *
7//* ALICE Experiment at CERN, All rights reserved. *
8//* See cxx source for full Copyright notice *
9
10/// @file AliHLTErrorGuard.h
11/// @author Matthias Richter
12/// @date 01.07.2010
13/// @brief Helper class for suppression of error floods.
14
15#include "AliHLTLogging.h"
16#include "TString.h"
17#include "Varargs.h"
18
19/**
20 * @class AliHLTErrorGuard
21 * Helper class for suppression of error message floods caused by error messages
22 * occurring rather frequently, e.g. for every event. The class suppresses the
23 * printout after an adjustable number of occurences and prints an error summary
24 * when the instance gets out of scope.
25 *
26 * Examples:
27 * <pre>
28 * if (nastyerror) {
29 * ALIHLTERRORGUARD(5, "nasty error, first occurence in event %d", event);
30 * }
31 * </pre>
32 * <pre>
33 * if (nastyerror) {
34 * static AliHLTErrorGuard g("classname", "functionname", "message");
b692a39e 35 * (++g).Throw(5);
9c564685 36 * }
37 * </pre>
38 * Both examples will throw the error for the first 5 occurrences. The macro
39 * ALIHLTERRORGUARD handles also class and function name, source file and line
40 * number, and supports variable messages through variadic macros.
41 *
42 * The second example illustrates usage of the class directly. The 'static'
43 * attribute causes the object not to be destroyed at run time, only when the
44 * program is terminated the object is deleted. This will print the error summary
45 * at the very end of the program execution.
46 *
47 * @ingroup alihlt_base
48 */
49class AliHLTErrorGuard : public AliHLTLogging {
50 public:
51 /// constructor
52 AliHLTErrorGuard(const char* classname, const char* functionname, const char* message, const char* file=NULL, int line=0)
53 : fClass(classname), fFunction(functionname), fFile(file?file:""), fMessage(message), fLine(line), fOccurrence(0) {}
54
55 /// set variable message
56 void SetMessage( int dummy, ... )
57 {
58 va_list args;
59 va_start(args, dummy);
60 fMessage=AliHLTLogging::BuildLogString(NULL, args );
61 va_end(args);
62 }
63
64 /// destructor
65 virtual ~AliHLTErrorGuard() {
66 Throw(-1, "Postponed message: %s - %d time(s)");
67 }
68
69 /// prefix increment operator
70 AliHLTErrorGuard& operator++() {fOccurrence++; return *this;}
71
72 int GetOccurrence() const {return fOccurrence;}
73
74 void Throw(int maxoccurrence=1, const char* format="%s") {
75 if (fOccurrence<=maxoccurrence || maxoccurrence<0)
76 LoggingVarargs(kHLTLogError, fClass.Data(), fFunction.Data(), fFile.Data(), fLine, format, fMessage.Data(), GetOccurrence());
77 }
78
79 protected:
80
81 private:
82 /** standard constructor prohibited */
83 AliHLTErrorGuard();
84 /** copy constructor prohibited */
85 AliHLTErrorGuard(const AliHLTErrorGuard&);
86 /** assignment operator prohibited */
87 AliHLTErrorGuard& operator=(const AliHLTErrorGuard&);
88
89 TString fClass; //! transient
90 TString fFunction; //! transient
91 TString fFile; //! transient
92 TString fMessage; //! transient
93 int fLine; //!transient
94 int fOccurrence; //!transient
95
96 ClassDef(AliHLTErrorGuard, 0)
97};
98
99#define ALIHLTERRORGUARD( max, ... ) { \
100 static AliHLTErrorGuard g(Class_Name() , FUNCTIONNAME() , "", __FILE__, __LINE__); \
101 if (g.GetOccurrence()==0) g.SetMessage( 0, __VA_ARGS__ ); \
102 (++g).Throw(max); \
103}
104
105#endif