39 #define __MSXML_LIBRARY_DEFINED__
42 #define QPIFILE ( ( strrchr(__FILE__, '\\') != NULL ) ? strrchr(__FILE__, '\\') + 1 : __FILE__ )
44 #define QPIFILE (__FILE__)
47 #if defined( WIN32 ) && defined ( _DEBUG ) && defined( CHECK_MEM_LEAKS )
49 #define MEM_CHECKPOINT_INIT() \
51 _CrtMemState state1, state2; \
52 _CrtMemCheckpoint( &state1 ); \
53 _CrtMemState memDiff; \
56 #define MEM_CHECKPOINT_COLLECT() \
57 _CrtMemCheckpoint( &state2 );
59 #define MEM_CHECKPOINT_END( clause, module ) \
61 MEM_CHECKPOINT_COLLECT() \
62 if ( _CrtMemDifference( &memDiff, &state1, &state2 ) ) \
64 _CrtDbgReport( _CRT_WARN, QPIFILE, __LINE__, module, \
65 "Memory leaks detected during "##clause". Dumping objects... \n" ); \
66 _CrtMemDumpAllObjectsSince( &state1 ); \
67 _CrtMemDumpStatistics( &memDiff ); \
68 _CrtDbgReport( _CRT_WARN, QPIFILE, __LINE__, module, "Dumping done. \n" ); \
72 #define MEM_CHECKPOINT_END_REPORT( clause, module ) \
74 if ( _CrtMemDifference( &memDiff, &state1, &state2 ) ) \
76 _CrtDbgReport( _CRT_WARN, QPIFILE, __LINE__, module, \
77 "Memory leaks detected during "##clause". Dumping objects... \n" ); \
78 _CrtMemDumpAllObjectsSince( &state1 ); \
79 _CrtMemDumpStatistics( &memDiff ); \
80 _CrtDbgReport( _CRT_WARN, QPIFILE, __LINE__, module, "Dumping done. \n" ); \
83 #define MEM_CHECKPOINT_END_FAIL( clause, module ) \
85 MEM_CHECKPOINT_COLLECT() \
86 if ( _CrtMemDifference( &memDiff, &state1, &state2 ) ) \
88 _CrtDbgReport( _CRT_WARN, QPIFILE, __LINE__, module, \
89 "Memory leaks detected during "##clause". Dumping objects... \n" ); \
90 _CrtMemDumpAllObjectsSince( &state1 ); \
91 _CrtMemDumpStatistics( &memDiff ); \
92 _CrtDbgReport( _CRT_WARN, QPIFILE, __LINE__, module, "Dumping done. \n" ); \
93 CPPUNIT_FAIL( "Memory leaks detected during "##clause ); \
98 #define MEM_CHECKPOINT_INIT() {
99 #define MEM_CHECKPOINT_END( clause, module ) }
100 #define MEM_CHECKPOINT_END_REPORT( clause, module ) }
101 #define MEM_CHECKPOINT_END_FAIL( clause, module ) }
102 #define MEM_CHECKPOINT_COLLECT()
105 #define cnull std::ofstream( "DebugOutput.out", ios::app )
117 static pthread_once_t KeysCreate;
118 static pthread_key_t StreamKey;
119 static pthread_key_t LinesKey;
120 static pthread_key_t NamesKey;
121 static pthread_key_t ExtraFilesKey;
123 static string Prefix;
124 static unsigned long MaxLines;
125 static unsigned long MaxExtraFiles;
127 static FileOutputter m_Instance;
129 static bool m_Terminated;
130 static pthread_mutex_t m_OutputtersSyncMutex;
132 static void CreateKeys();
133 static void DeleteStreams(
void* data );
134 static void DeleteLines(
void* data );
135 static void DeleteNames(
void* data );
136 static void DeleteExtraFiles(
void* data );
138 static ostream& internalGetStream();
144 static void setLogMaxLines(
const unsigned long maxLines = 0 );
146 static void setLogPrefix(
const string prefix =
"Unnamed" );
148 static ostream& getStream();
149 static bool wasTerminated();
150 static void setTerminated(
const bool value );
152 static void setLogMaxExtraFiles(
const unsigned long maxLogs = 0 );
157 #define DEBUG_GLOBAL( expr ) { if ( !FileOutputter::wasTerminated() ) { FileOutputter::getStream() << "DEBUG [" << QPIFILE << "] - " << __LINE__ << " : " << expr << endl << flush; } }
158 #define DEBUG( expr ) DEBUG_GLOBAL( expr )
161 #define DEBUG_PRINT_STACK ;
163 #define DEBUG_PRINT_STACK ;
166 #ifdef EXTENDED_DEBUG
167 #define DEBUG2( expr ) DEBUG( expr )
168 #define DEBUG_GLOBAL2( expr ) DEBUG_GLOBAL( expr )
170 #define DEBUG2( expr ) ;
171 #define DEBUG_GLOBAL2( expr ) ;
176 #define TRACE_SERVICE( expr ) { stringstream _errormessage; _errormessage << expr; OutputDebugString( TEXT( _errormessage.str().c_str() ) ); FileOutputter::getStream() << "TRACE [" << QPIFILE << "] - " << __LINE__ << " : " << expr << endl << flush; }
177 #define TRACE_GLOBAL( expr ) TRACE_SERVICE( expr )
178 #define TRACE( expr ) TRACE_SERVICE( expr )
179 #define TRACE_NOLOG( expr ) \
183 stringstream _errormessage; _errormessage << expr; OutputDebugString( TEXT( _errormessage.str().c_str() ) ); FileOutputter::getStream() << "TRACE [" << QPIFILE << "] - " << __LINE__ << " : " << expr << endl << flush; \
187 #define DEBUG_NOLOG( expr ) { cout << "DEBUG [" << QPIFILE << "] - " << __LINE__ << " : " << expr << endl << flush; }
189 #define TRACE_GLOBAL( expr ) { if ( !FileOutputter::wasTerminated() ) { FileOutputter::getStream() << "TRACE [" << QPIFILE << "] - " << __LINE__ << " : " << expr << endl << flush; } }
190 #define TRACE( expr ) TRACE_GLOBAL( expr )
191 #define TRACE_SERVICE( expr ) TRACE_GLOBAL( expr )
192 #define TRACE_NOLOG( expr ) \
196 FileOutputter::getStream() << "TRACE [" << QPIFILE << "] - " << __LINE__ << " : " << expr << endl << flush; \
201 cerr << "TRACE [" << QPIFILE << "] - " << __LINE__ << " : " << expr << endl << flush; \
204 #define DEBUG_NOLOG( expr ) { cout << "DEBUG [" << QPIFILE << "] - " << __LINE__ << " : " << expr << endl << flush; }
205 #endif // WIN32_SERVICE
207 #else //DEBUG_ENABLED
209 #define DEBUG( expr ) ;
210 #define DEBUG2( expr ) ;
211 #define DEBUG_GLOBAL( expr ) ;
212 #define DEBUG_GLOBAL2( expr ) ;
213 #define DEBUG_PRINT_STACK ;
214 #define TRACE_GLOBAL( expr ) ;
215 #define TRACE( expr ) ;
216 #define TRACE_NOLOG( expr ) ;
218 #endif //DEBUG_ENABLED
220 #endif // QPAYTRACE_H