src/debug.h
author truebrain
Mon, 16 Jun 2008 14:43:19 +0000
branchnoai
changeset 10978 13fd0364b2c6
parent 10829 8a0ec0f0f928
permissions -rw-r--r--
(svn r13532) [NoAI] -Fix: in MultiPlayer SignID wasn't set correctly, causing weird effects. Code is now more unified, which should avoid simular effects in the future (tnx to glx for initial patch)
2186
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2125
diff changeset
     1
/* $Id$ */
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2125
diff changeset
     2
10455
22c441f5adf9 (svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents: 10181
diff changeset
     3
/** @file debug.h Functions related to debugging. */
6505
abcb0580d976 (svn r8950) -Cleanup: doxygen changes. Mostly @files missing tags and a few comments style.
belugas
parents: 6192
diff changeset
     4
1299
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents:
diff changeset
     5
#ifndef DEBUG_H
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents:
diff changeset
     6
#define DEBUG_H
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents:
diff changeset
     7
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5108
diff changeset
     8
/* Debugging messages policy:
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5108
diff changeset
     9
 * These should be the severities used for direct DEBUG() calls
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5108
diff changeset
    10
 * maximum debugging level should be 10 if really deep, deep
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5108
diff changeset
    11
 * debugging is needed.
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5108
diff changeset
    12
 * (there is room for exceptions, but you have to have a good cause):
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5108
diff changeset
    13
 * 0   - errors or severe warnings
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5108
diff changeset
    14
 * 1   - other non-fatal, non-severe warnings
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5108
diff changeset
    15
 * 2   - crude progress indicator of functionality
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5108
diff changeset
    16
 * 3   - important debugging messages (function entry)
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5108
diff changeset
    17
 * 4   - debugging messages (crude loop status, etc.)
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5108
diff changeset
    18
 * 5   - detailed debugging information
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5108
diff changeset
    19
 * 6.. - extremely detailed spamming
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5108
diff changeset
    20
 */
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5108
diff changeset
    21
1299
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents:
diff changeset
    22
#ifdef NO_DEBUG_MESSAGES
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
    23
	#if defined(__GNUC__) && (__GNUC__ < 3)
5657
54c99d0f6ba4 (svn r7602) -Fix (r7565): MSVC2003 and lower don't support variadic macros, so work around
Darkvater
parents: 5578
diff changeset
    24
		#define DEBUG(name, level, args...)
54c99d0f6ba4 (svn r7602) -Fix (r7565): MSVC2003 and lower don't support variadic macros, so work around
Darkvater
parents: 5578
diff changeset
    25
	#else
54c99d0f6ba4 (svn r7602) -Fix (r7565): MSVC2003 and lower don't support variadic macros, so work around
Darkvater
parents: 5578
diff changeset
    26
		#define DEBUG(name, level, ...)
54c99d0f6ba4 (svn r7602) -Fix (r7565): MSVC2003 and lower don't support variadic macros, so work around
Darkvater
parents: 5578
diff changeset
    27
	#endif
54c99d0f6ba4 (svn r7602) -Fix (r7565): MSVC2003 and lower don't support variadic macros, so work around
Darkvater
parents: 5578
diff changeset
    28
#else /* NO_DEBUG_MESSAGES */
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
    29
	#if defined(__GNUC__) && (__GNUC__ < 3)
5578
595d940beb8f (svn r7579) -Fix: upon merging the bridge branch, I accidently reverted 7571. Re-revert it. Sorry.
celestar
parents: 5573
diff changeset
    30
		#define DEBUG(name, level, args...) if ((level == 0) || ( _debug_ ## name ## _level >= level)) debug(#name, args)
595d940beb8f (svn r7579) -Fix: upon merging the bridge branch, I accidently reverted 7571. Re-revert it. Sorry.
celestar
parents: 5573
diff changeset
    31
	#else
595d940beb8f (svn r7579) -Fix: upon merging the bridge branch, I accidently reverted 7571. Re-revert it. Sorry.
celestar
parents: 5573
diff changeset
    32
		#define DEBUG(name, level, ...) if (level == 0 || _debug_ ## name ## _level >= level) debug(#name, __VA_ARGS__)
595d940beb8f (svn r7579) -Fix: upon merging the bridge branch, I accidently reverted 7571. Re-revert it. Sorry.
celestar
parents: 5573
diff changeset
    33
	#endif
1299
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents:
diff changeset
    34
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents:
diff changeset
    35
	extern int _debug_ai_level;
2210
58a293892a66 (svn r2728) -Fix/Feature: Change the driver probing algorithm
tron
parents: 2186
diff changeset
    36
	extern int _debug_driver_level;
1299
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents:
diff changeset
    37
	extern int _debug_grf_level;
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents:
diff changeset
    38
	extern int _debug_map_level;
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents:
diff changeset
    39
	extern int _debug_misc_level;
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents:
diff changeset
    40
	extern int _debug_ms_level;
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents:
diff changeset
    41
	extern int _debug_net_level;
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5108
diff changeset
    42
	extern int _debug_sprite_level;
1322
8697b73baa64 (svn r1826) -Feature: a brand new OldLoader so OpenTTD is TTD(Patch) compatible
truelight
parents: 1299
diff changeset
    43
	extern int _debug_oldloader_level;
2125
3098398bf7ff (svn r2635) Fix: [ntp/misc] Improve the old pathfinder. Changed it to A* instead of Dijkstra.
ludde
parents: 2033
diff changeset
    44
	extern int _debug_ntp_level;
1678
838dd6f46081 (svn r2182) - Add: [NPF] There is now a debug class for NPF. Use -d npf<level> to enable debugging printouts from npf.
matthijs
parents: 1322
diff changeset
    45
	extern int _debug_npf_level;
3900
4984308f9125 (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents: 3851
diff changeset
    46
	extern int _debug_yapf_level;
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 3900
diff changeset
    47
	extern int _debug_freetype_level;
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5108
diff changeset
    48
	extern int _debug_sl_level;
5915
a39082f82ea2 (svn r8124) -Add [DEBUG]: _debug_station_level
KUDr
parents: 5838
diff changeset
    49
	extern int _debug_station_level;
10829
8a0ec0f0f928 (svn r13381) [NoAI] -Sync with trunk r13325:13380
glx
parents: 10455
diff changeset
    50
	extern int _debug_gamelog_level;
1299
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents:
diff changeset
    51
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
    52
	void CDECL debug(const char *dbg, ...);
10829
8a0ec0f0f928 (svn r13381) [NoAI] -Sync with trunk r13325:13380
glx
parents: 10455
diff changeset
    53
	void CDECL debug_print(const char *dbg, const char *buf);
5657
54c99d0f6ba4 (svn r7602) -Fix (r7565): MSVC2003 and lower don't support variadic macros, so work around
Darkvater
parents: 5578
diff changeset
    54
#endif /* NO_DEBUG_MESSAGES */
1299
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents:
diff changeset
    55
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents:
diff changeset
    56
void SetDebugString(const char *s);
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6505
diff changeset
    57
const char *GetDebugString();
1299
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents:
diff changeset
    58
3851
4bbb525957b0 (svn r4875) - Fix: %ll don't work with mingw (msvrct.dll problem)
glx
parents: 3341
diff changeset
    59
/* MSVCRT of course has to have a different syntax for long long *sigh* */
4bbb525957b0 (svn r4875) - Fix: %ll don't work with mingw (msvrct.dll problem)
glx
parents: 3341
diff changeset
    60
#if defined(_MSC_VER) || defined(__MINGW32__)
5657
54c99d0f6ba4 (svn r7602) -Fix (r7565): MSVC2003 and lower don't support variadic macros, so work around
Darkvater
parents: 5578
diff changeset
    61
	#define OTTD_PRINTF64 "I64"
3341
b8febc9509d7 (svn r4125) - Feature: Add a general TIC() TOC() mechanism using rdtsc or something similar on non-i386 architectures to performance-tune (critical) code. Some systems are probably missing, but those can be added later.
Darkvater
parents: 2916
diff changeset
    62
#else
5657
54c99d0f6ba4 (svn r7602) -Fix (r7565): MSVC2003 and lower don't support variadic macros, so work around
Darkvater
parents: 5578
diff changeset
    63
	#define OTTD_PRINTF64 "ll"
3341
b8febc9509d7 (svn r4125) - Feature: Add a general TIC() TOC() mechanism using rdtsc or something similar on non-i386 architectures to performance-tune (critical) code. Some systems are probably missing, but those can be added later.
Darkvater
parents: 2916
diff changeset
    64
#endif
b8febc9509d7 (svn r4125) - Feature: Add a general TIC() TOC() mechanism using rdtsc or something similar on non-i386 architectures to performance-tune (critical) code. Some systems are probably missing, but those can be added later.
Darkvater
parents: 2916
diff changeset
    65
9626
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 6573
diff changeset
    66
/* Used for profiling
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 6573
diff changeset
    67
 *
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 6573
diff changeset
    68
 * Usage:
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 6573
diff changeset
    69
 * TIC();
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 6573
diff changeset
    70
 *   --Do your code--
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 6573
diff changeset
    71
 * TOC("A name", 1);
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 6573
diff changeset
    72
 *
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 6573
diff changeset
    73
 * When you run the TIC() / TOC() multiple times, you can increase the '1'
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 6573
diff changeset
    74
 *  to only display average stats every N values. Some things to know:
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 6573
diff changeset
    75
 *
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 6573
diff changeset
    76
 * for (int i = 0; i < 5; i++) {
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 6573
diff changeset
    77
 *   TIC();
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 6573
diff changeset
    78
 *     --Do yuor code--
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 6573
diff changeset
    79
 *   TOC("A name", 5);
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 6573
diff changeset
    80
 * }
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 6573
diff changeset
    81
 *
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 6573
diff changeset
    82
 * Is the correct usage for multiple TIC() / TOC() calls.
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 6573
diff changeset
    83
 *
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 6573
diff changeset
    84
 * TIC() / TOC() creates it's own block, so make sure not the mangle
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 6573
diff changeset
    85
 *  it with an other block.
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 6573
diff changeset
    86
 **/
3341
b8febc9509d7 (svn r4125) - Feature: Add a general TIC() TOC() mechanism using rdtsc or something similar on non-i386 architectures to performance-tune (critical) code. Some systems are probably missing, but those can be added later.
Darkvater
parents: 2916
diff changeset
    87
#define TIC() {\
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6505
diff changeset
    88
	extern uint64 _rdtsc();\
3341
b8febc9509d7 (svn r4125) - Feature: Add a general TIC() TOC() mechanism using rdtsc or something similar on non-i386 architectures to performance-tune (critical) code. Some systems are probably missing, but those can be added later.
Darkvater
parents: 2916
diff changeset
    89
	uint64 _xxx_ = _rdtsc();\
b8febc9509d7 (svn r4125) - Feature: Add a general TIC() TOC() mechanism using rdtsc or something similar on non-i386 architectures to performance-tune (critical) code. Some systems are probably missing, but those can be added later.
Darkvater
parents: 2916
diff changeset
    90
	static uint64 __sum__ = 0;\
b8febc9509d7 (svn r4125) - Feature: Add a general TIC() TOC() mechanism using rdtsc or something similar on non-i386 architectures to performance-tune (critical) code. Some systems are probably missing, but those can be added later.
Darkvater
parents: 2916
diff changeset
    91
	static uint32 __i__ = 0;
b8febc9509d7 (svn r4125) - Feature: Add a general TIC() TOC() mechanism using rdtsc or something similar on non-i386 architectures to performance-tune (critical) code. Some systems are probably missing, but those can be added later.
Darkvater
parents: 2916
diff changeset
    92
b8febc9509d7 (svn r4125) - Feature: Add a general TIC() TOC() mechanism using rdtsc or something similar on non-i386 architectures to performance-tune (critical) code. Some systems are probably missing, but those can be added later.
Darkvater
parents: 2916
diff changeset
    93
#define TOC(str, count)\
b8febc9509d7 (svn r4125) - Feature: Add a general TIC() TOC() mechanism using rdtsc or something similar on non-i386 architectures to performance-tune (critical) code. Some systems are probably missing, but those can be added later.
Darkvater
parents: 2916
diff changeset
    94
	__sum__ += _rdtsc() - _xxx_;\
b8febc9509d7 (svn r4125) - Feature: Add a general TIC() TOC() mechanism using rdtsc or something similar on non-i386 architectures to performance-tune (critical) code. Some systems are probably missing, but those can be added later.
Darkvater
parents: 2916
diff changeset
    95
	if (++__i__ == count) {\
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5108
diff changeset
    96
		DEBUG(misc, 0, "[%s] %" OTTD_PRINTF64 "u [avg: %.1f]\n", str, __sum__, __sum__/(double)__i__);\
3341
b8febc9509d7 (svn r4125) - Feature: Add a general TIC() TOC() mechanism using rdtsc or something similar on non-i386 architectures to performance-tune (critical) code. Some systems are probably missing, but those can be added later.
Darkvater
parents: 2916
diff changeset
    97
		__i__ = 0;\
b8febc9509d7 (svn r4125) - Feature: Add a general TIC() TOC() mechanism using rdtsc or something similar on non-i386 architectures to performance-tune (critical) code. Some systems are probably missing, but those can be added later.
Darkvater
parents: 2916
diff changeset
    98
		__sum__ = 0;\
b8febc9509d7 (svn r4125) - Feature: Add a general TIC() TOC() mechanism using rdtsc or something similar on non-i386 architectures to performance-tune (critical) code. Some systems are probably missing, but those can be added later.
Darkvater
parents: 2916
diff changeset
    99
	}\
b8febc9509d7 (svn r4125) - Feature: Add a general TIC() TOC() mechanism using rdtsc or something similar on non-i386 architectures to performance-tune (critical) code. Some systems are probably missing, but those can be added later.
Darkvater
parents: 2916
diff changeset
   100
}
b8febc9509d7 (svn r4125) - Feature: Add a general TIC() TOC() mechanism using rdtsc or something similar on non-i386 architectures to performance-tune (critical) code. Some systems are probably missing, but those can be added later.
Darkvater
parents: 2916
diff changeset
   101
9723
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9626
diff changeset
   102
void ShowInfo(const char *str);
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9626
diff changeset
   103
void CDECL ShowInfoF(const char *str, ...);
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9626
diff changeset
   104
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   105
#ifdef DEBUG_DUMP_COMMANDS
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   106
	void CDECL DebugDumpCommands(const char *s, ...);
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   107
#else /* DEBUG_DUMP_COMMANDS */
10181
54df587fef5d (svn r12712) [NoAI] -Sync with trunk r12672:12711.
rubidium
parents: 9724
diff changeset
   108
	/* when defined as an empty function with variable argument list,
54df587fef5d (svn r12712) [NoAI] -Sync with trunk r12672:12711.
rubidium
parents: 9724
diff changeset
   109
	 * it can't be inlined - so define it as an empty macro */
54df587fef5d (svn r12712) [NoAI] -Sync with trunk r12672:12711.
rubidium
parents: 9724
diff changeset
   110
	#if defined(__GNUC__) && (__GNUC__ < 3)
54df587fef5d (svn r12712) [NoAI] -Sync with trunk r12672:12711.
rubidium
parents: 9724
diff changeset
   111
		#define DebugDumpCommands(s, args...)
54df587fef5d (svn r12712) [NoAI] -Sync with trunk r12672:12711.
rubidium
parents: 9724
diff changeset
   112
	#else
54df587fef5d (svn r12712) [NoAI] -Sync with trunk r12672:12711.
rubidium
parents: 9724
diff changeset
   113
		#define DebugDumpCommands(s, ...)
54df587fef5d (svn r12712) [NoAI] -Sync with trunk r12672:12711.
rubidium
parents: 9724
diff changeset
   114
	#endif
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   115
#endif /* DEBUG_DUMP_COMMANDS */
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   116
2436
177cb6a8339f (svn r2962) - const correctness for all Get* functions and most Draw* functions that don't change their pointer parameters
Darkvater
parents: 2210
diff changeset
   117
#endif /* DEBUG_H */