tron@2186: /* $Id$ */ tron@2186: rubidium@9111: /** @file debug.h Functions related to debugging. */ belugas@6179: tron@1299: #ifndef DEBUG_H tron@1299: #define DEBUG_H tron@1299: Darkvater@5380: /* Debugging messages policy: Darkvater@5380: * These should be the severities used for direct DEBUG() calls Darkvater@5380: * maximum debugging level should be 10 if really deep, deep Darkvater@5380: * debugging is needed. Darkvater@5380: * (there is room for exceptions, but you have to have a good cause): Darkvater@5380: * 0 - errors or severe warnings Darkvater@5380: * 1 - other non-fatal, non-severe warnings Darkvater@5380: * 2 - crude progress indicator of functionality Darkvater@5380: * 3 - important debugging messages (function entry) Darkvater@5380: * 4 - debugging messages (crude loop status, etc.) Darkvater@5380: * 5 - detailed debugging information Darkvater@5380: * 6.. - extremely detailed spamming Darkvater@5380: */ Darkvater@5380: tron@1299: #ifdef NO_DEBUG_MESSAGES rubidium@8409: #if defined(__GNUC__) && (__GNUC__ < 3) smatz@9656: #define DEBUG(name, level, args...) { } Darkvater@5406: #else smatz@9656: #define DEBUG(name, level, ...) { } Darkvater@5406: #endif Darkvater@5406: #else /* NO_DEBUG_MESSAGES */ rubidium@8409: #if defined(__GNUC__) && (__GNUC__ < 3) celestar@5390: #define DEBUG(name, level, args...) if ((level == 0) || ( _debug_ ## name ## _level >= level)) debug(#name, args) celestar@5390: #else celestar@5390: #define DEBUG(name, level, ...) if (level == 0 || _debug_ ## name ## _level >= level) debug(#name, __VA_ARGS__) celestar@5390: #endif tron@1299: tron@1299: extern int _debug_ai_level; tron@2210: extern int _debug_driver_level; tron@1299: extern int _debug_grf_level; tron@1299: extern int _debug_map_level; tron@1299: extern int _debug_misc_level; tron@1299: extern int _debug_ms_level; tron@1299: extern int _debug_net_level; Darkvater@5380: extern int _debug_sprite_level; truelight@1322: extern int _debug_oldloader_level; ludde@2125: extern int _debug_ntp_level; matthijs@1678: extern int _debug_npf_level; KUDr@3900: extern int _debug_yapf_level; peter1138@5108: extern int _debug_freetype_level; Darkvater@5380: extern int _debug_sl_level; KUDr@5664: extern int _debug_station_level; smatz@9457: extern int _debug_gamelog_level; tron@1299: rubidium@8409: void CDECL debug(const char *dbg, ...); Darkvater@5406: #endif /* NO_DEBUG_MESSAGES */ tron@1299: tron@1299: void SetDebugString(const char *s); rubidium@6247: const char *GetDebugString(); tron@1299: glx@3851: /* MSVCRT of course has to have a different syntax for long long *sigh* */ glx@3851: #if defined(_MSC_VER) || defined(__MINGW32__) Darkvater@5406: #define OTTD_PRINTF64 "I64" Darkvater@3341: #else Darkvater@5406: #define OTTD_PRINTF64 "ll" Darkvater@3341: #endif Darkvater@3341: truelight@6830: /* Used for profiling truelight@6830: * truelight@6830: * Usage: truelight@6830: * TIC(); truelight@6830: * --Do your code-- truelight@6830: * TOC("A name", 1); truelight@6830: * truelight@6830: * When you run the TIC() / TOC() multiple times, you can increase the '1' truelight@6830: * to only display average stats every N values. Some things to know: truelight@6830: * truelight@6830: * for (int i = 0; i < 5; i++) { truelight@6830: * TIC(); truelight@6830: * --Do yuor code-- truelight@6830: * TOC("A name", 5); truelight@6830: * } truelight@6830: * truelight@6830: * Is the correct usage for multiple TIC() / TOC() calls. truelight@6830: * truelight@6830: * TIC() / TOC() creates it's own block, so make sure not the mangle truelight@6830: * it with an other block. truelight@6830: **/ Darkvater@3341: #define TIC() {\ rubidium@10383: extern uint64 ottd_rdtsc();\ rubidium@10383: uint64 _xxx_ = ottd_rdtsc();\ Darkvater@3341: static uint64 __sum__ = 0;\ Darkvater@3341: static uint32 __i__ = 0; Darkvater@3341: Darkvater@3341: #define TOC(str, count)\ rubidium@10383: __sum__ += ottd_rdtsc() - _xxx_;\ Darkvater@3341: if (++__i__ == count) {\ Darkvater@5380: DEBUG(misc, 0, "[%s] %" OTTD_PRINTF64 "u [avg: %.1f]\n", str, __sum__, __sum__/(double)__i__);\ Darkvater@3341: __i__ = 0;\ Darkvater@3341: __sum__ = 0;\ Darkvater@3341: }\ Darkvater@3341: } Darkvater@3341: rubidium@8131: void ShowInfo(const char *str); rubidium@8131: void CDECL ShowInfoF(const char *str, ...); rubidium@8131: rubidium@8247: #ifdef DEBUG_DUMP_COMMANDS rubidium@8247: void CDECL DebugDumpCommands(const char *s, ...); rubidium@8247: #else /* DEBUG_DUMP_COMMANDS */ smatz@8915: /* when defined as an empty function with variable argument list, smatz@8915: * it can't be inlined - so define it as an empty macro */ smatz@8915: #if defined(__GNUC__) && (__GNUC__ < 3) smatz@8915: #define DebugDumpCommands(s, args...) smatz@8915: #else smatz@8915: #define DebugDumpCommands(s, ...) smatz@8915: #endif rubidium@8247: #endif /* DEBUG_DUMP_COMMANDS */ rubidium@8247: Darkvater@2436: #endif /* DEBUG_H */