xref: /haiku/headers/private/file_systems/DebugSupport.h (revision da8162be21b36442f34a731873d2358a0d63c25a)
1 /*
2  * Copyright 2003-2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Copyright 200?, Axel Dörfler, axeld@pinc-software.de.
4  * Distributed under the terms of the MIT License.
5  */
6 #ifndef DEBUG_SUPPORT_H
7 #define DEBUG_SUPPORT_H
8 
9 
10 #include <string.h>
11 
12 
13 #if !USER
14 #	include <KernelExport.h>
15 #	include <OS.h>
16 #endif
17 #include <SupportDefs.h>
18 
19 
20 // define all macros we work with -- undefined macros are set to defaults
21 #ifndef USER
22 #	define USER 0
23 #endif
24 #ifndef DEBUG
25 #	define DEBUG 0
26 #endif
27 #if !DEBUG
28 #	undef DEBUG_PRINT
29 #	define DEBUG_PRINT 0
30 #endif
31 #ifndef DEBUG_PRINT
32 #	define DEBUG_PRINT 0
33 #endif
34 #ifndef DEBUG_APP
35 #	define DEBUG_APP	"unknown"
36 #endif
37 #ifndef DEBUG_PRINT_FILE
38 #	define DEBUG_PRINT_FILE "/var/log/" DEBUG_APP ".log"
39 #endif
40 
41 
42 // define the debug output function
43 #if USER
44 #	include <stdio.h>
45 #	if DEBUG_PRINT
46 #		define __out dbg_printf
47 #		define __outv dbg_vprintf
48 #	else
49 #		define __out printf
50 #		define __outv vprintf
51 #	endif
52 #else
53 #	include <KernelExport.h>
54 #	include <null.h>
55 #	if DEBUG_PRINT
56 #		define __out dbg_printf
57 #		define __outv dbg_vprintf
58 #	else
59 #		define __out dprintf
60 #		define __outv dvprintf
61 #	endif
62 #endif
63 
64 
65 // define the PANIC() macro
66 #ifndef PANIC
67 #	if USER
68 #		define PANIC(str)	debugger(str)
69 #	else
70 #		define PANIC(str)	panic(str)
71 #	endif
72 #endif
73 
74 
75 // functions exported by this module
76 status_t init_debugging();
77 status_t exit_debugging();
78 void dbg_printf_begin();
79 void dbg_printf_end();
80 #if DEBUG_PRINT
81 	void dbg_vprintf(const char* format, va_list args);
82 	void dbg_printf(const char* format,...);
83 #else
dbg_vprintf(const char *,va_list)84 	static inline void dbg_vprintf(const char*, va_list) {}
dbg_printf(const char *,...)85 	static inline void dbg_printf(const char*,...) {}
86 #endif
87 
88 
89 // Short overview of the debug output macros:
90 //	PRINT()
91 //		general messages that shouldn't appear in a release build
92 //	FATAL()
93 //		fatal messages, when something has really gone wrong
94 //	ERROR()
95 //		non-fatal error messages
96 //	WARN()
97 //		warning messages
98 //	INFORM()
99 //		general information, as disk size, etc.
100 //	REPORT_ERROR(status_t)
101 //		prints out error information
102 //	RETURN_ERROR(status_t)
103 //		calls REPORT_ERROR() and return the value
104 //	D()
105 //		the statements in D() are only included if DEBUG is defined
106 
107 
108 #define DEBUG_THREAD	find_thread(NULL)
109 #define DEBUG_CONTEXT(x)													\
110 {																			\
111 	dbg_printf_begin();														\
112 	__out(DEBUG_APP ": [%" B_PRIdBIGTIME ": %5" B_PRId32 "] ",				\
113 		system_time(), DEBUG_THREAD);										\
114 	x;																		\
115 	dbg_printf_end();														\
116 }
117 #define DEBUG_CONTEXT_FUNCTION(prefix, x)									\
118 {																			\
119 	dbg_printf_begin();														\
120 	__out(DEBUG_APP ": [%" B_PRIdBIGTIME ": %5" B_PRId32 "] %s" prefix,		\
121 		system_time(), DEBUG_THREAD, __PRETTY_FUNCTION__);					\
122 	x;																		\
123 	dbg_printf_end();														\
124 }
125 #define DEBUG_CONTEXT_LINE(x)												\
126 {																			\
127 	dbg_printf_begin();														\
128 	__out(DEBUG_APP ": [%" B_PRIdBIGTIME ": %5" B_PRId32 "] %s:%d: ",		\
129 		system_time(), DEBUG_THREAD, __PRETTY_FUNCTION__, __LINE__);		\
130 	x;																		\
131 	dbg_printf_end();														\
132 }
133 
134 #define TPRINT(x...)			DEBUG_CONTEXT( __out(x) )
135 #define TPRINTV(format, args)	DEBUG_CONTEXT( __outv(format, args) )
136 #define TREPORT_ERROR(status)												\
137 	DEBUG_CONTEXT_LINE( __out("%s\n", strerror(status)) )
138 #define TRETURN_ERROR(err)													\
139 {																			\
140 	status_t _status = err;													\
141 	if (_status < B_OK)														\
142 		TREPORT_ERROR(_status);												\
143 	return _status;															\
144 }
145 #define TSET_ERROR(var, err)												\
146 {																			\
147 	status_t _status = err;													\
148 	if (_status < B_OK)														\
149 		TREPORT_ERROR(_status);												\
150 		var = _status;														\
151 }
152 #define TFUNCTION(x...)		DEBUG_CONTEXT_FUNCTION( ": ", __out(x) )
153 #define TFUNCTION_START()	DEBUG_CONTEXT_FUNCTION( "\n",  )
154 #define TFUNCTION_END()		DEBUG_CONTEXT_FUNCTION( " done\n",  )
155 
156 #if DEBUG
157 	#define PRINT(x...)				TPRINT(x)
158 	#define REPORT_ERROR(status)	TREPORT_ERROR(status)
159 	#define RETURN_ERROR(err)		TRETURN_ERROR(err)
160 	#define SET_ERROR(var, err)		TSET_ERROR(var, err)
161 	#define FUNCTION(x...)			TFUNCTION(x)
162 	#define FUNCTION_START()		TFUNCTION_START()
163 	#define FUNCTION_END()			TFUNCTION_END()
164 	#define DARG(x)					x
165 	#define D(x)					{x;};
166 #else
167 	#define PRINT(x...)				;
168 	#define REPORT_ERROR(status)	;
169 	#define RETURN_ERROR(status)	return status;
170 	#define SET_ERROR(var, err)		var = err;
171 	#define FUNCTION(x...)			;
172 	#define FUNCTION_START()		;
173 	#define FUNCTION_END()			;
174 	#define DARG(x)
175 	#define D(x)					;
176 #endif
177 
178 #define FATAL(x...)				TPRINT(x)
179 #define ERROR(x...)				TPRINT(x)
180 #define ERRORV(format, args)	TPRINTV(format, args)
181 #define WARN(x...)				TPRINT(x)
182 #define INFORM(x...)			TPRINT(x)
183 
184 #ifndef TOUCH
185 #define TOUCH(var) (void)var
186 #endif
187 
188 
189 #endif	// DEBUG_SUPPORT_H
190