annotate foosdk/sdk/foobar2000/shared/fb2kdebug.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <functional>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 class uDebugLog_ : public pfc::string_formatter {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 ~uDebugLog_() {*this << "\n"; uOutputDebugString(get_ptr());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 #define FB2K_DebugLog() uDebugLog_()._formatter()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 #define uDebugLog() FB2K_DebugLog()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 // since fb2k 1.5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 namespace fb2k {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 class panicHandler {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 virtual void onPanic() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 // since fb2k 1.5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 extern "C"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 void SHARED_EXPORT uAddPanicHandler(fb2k::panicHandler*);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 void SHARED_EXPORT uRemovePanicHandler(fb2k::panicHandler*);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 extern "C"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 LPCSTR SHARED_EXPORT uGetCallStackPath();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 LONG SHARED_EXPORT uExceptFilterProc(LPEXCEPTION_POINTERS param);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 PFC_NORETURN void SHARED_EXPORT uBugCheck();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 void SHARED_EXPORT fb2kDebugSelfTest();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 static inline void uAddDebugEvent(const char * msg) {uPrintCrashInfo_OnEvent(msg, SIZE_MAX);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 static inline void uAddDebugEvent( const char * msg ) { uOutputDebugString(pfc::format(msg, "\n")); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 class uCallStackTracker {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 t_size param;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 explicit SHARED_EXPORT uCallStackTracker(const char* name);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 SHARED_EXPORT ~uCallStackTracker();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 #if FB2K_SUPPORT_CRASH_LOGS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 #define TRACK_CALL(X) uCallStackTracker TRACKER__##X(#X)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 #define TRACK_CALL_TEXT(X) uCallStackTracker TRACKER__BLAH(X)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 #define TRACK_CODE(description,code) {uCallStackTracker __call_tracker(description); code;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 #else // FB2K_SUPPORT_CRASH_LOGS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 #define TRACK_CALL(X)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 #define TRACK_CALL_TEXT(X)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 #define TRACK_CODE(description,code) {code;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 #endif // FB2K_SUPPORT_CRASH_LOGS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 #if FB2K_SUPPORT_CRASH_LOGS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 inline int uExceptFilterProc_inline(LPEXCEPTION_POINTERS param) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 uDumpCrashInfo(param);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 TerminateProcess(GetCurrentProcess(), 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 return 0;// never reached
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 #define FB2K_DYNAMIC_ASSERT( X ) { if (!(X)) uBugCheck(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 #if FB2K_SUPPORT_CRASH_LOGS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 #define __except_instacrash __except(uExceptFilterProc(GetExceptionInformation()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 #define fb2k_instacrash_scope(X) __try { X; } __except_instacrash {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 #define fb2k_instacrash_scope(X) {X;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 #if 0 // no longer used
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 PFC_NORETURN inline void fb2kCriticalError(DWORD code, DWORD argCount = 0, const ULONG_PTR * args = NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 fb2k_instacrash_scope( RaiseException(code,EXCEPTION_NONCONTINUABLE,argCount,args); );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 PFC_NORETURN inline void fb2kDeadlock() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 fb2kCriticalError(0x63d81b66);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 inline void fb2kWaitForCompletion(HANDLE hEvent) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 switch(WaitForSingleObject(hEvent, INFINITE)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 case WAIT_OBJECT_0:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 uBugCheck();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 inline void fb2kWaitForThreadCompletion(HANDLE hWaitFor, DWORD threadID) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 (void) threadID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 switch(WaitForSingleObject(hWaitFor, INFINITE)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 case WAIT_OBJECT_0:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 uBugCheck();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 inline void fb2kWaitForThreadCompletion2(HANDLE hWaitFor, HANDLE hThread, DWORD threadID) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 (void)threadID; (void)hThread;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 switch(WaitForSingleObject(hWaitFor, INFINITE)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 case WAIT_OBJECT_0:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 uBugCheck();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 inline void __cdecl _OverrideCrtAbort_handler(int signal) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 const ULONG_PTR args[] = {(ULONG_PTR)signal};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 RaiseException(0x6F8E1DC8 /* random GUID */, EXCEPTION_NONCONTINUABLE, _countof(args), args);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 static void __cdecl _PureCallHandler() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 RaiseException(0xf6538887 /* random GUID */, EXCEPTION_NONCONTINUABLE, 0, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 static void _InvalidParameter(
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 const wchar_t * expression,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 const wchar_t * function,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 const wchar_t * file,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 unsigned int line,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 uintptr_t pReserved
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 (void)pReserved; (void) line; (void) file; (void) function; (void) expression;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 RaiseException(0xd142b808 /* random GUID */, EXCEPTION_NONCONTINUABLE, 0, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 inline void OverrideCrtAbort() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 const int signals[] = {SIGINT, SIGTERM, SIGBREAK, SIGABRT};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 for(size_t i=0; i<_countof(signals); i++) signal(signals[i], _OverrideCrtAbort_handler);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 _set_abort_behavior(0, UINT_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 _set_purecall_handler(_PureCallHandler);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 _set_invalid_parameter_handler(_InvalidParameter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 namespace fb2k {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 PFC_NORETURN inline void crashWithMessage(const char * msg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 uAddDebugEvent(msg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 uBugCheck();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 inline void crashOnException(std::function<void()> const & f, const char* context = nullptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 (void)context;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 fb2k_instacrash_scope(f());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 void crashWithMessage [[noreturn]] (const char*);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 void crashOnException(std::function<void()>, const char* context = nullptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 #define FB2K_CrashOnException( ... ) ::fb2k::crashWithMessage(__VA_ARGS__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 // implement me
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 #define FB2K_TRACE_ENABLED 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 #define FB2K_TRACE_FORCED(X)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 #define FB2K_TRACE(X)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 #define FB2K_TRACE_THIS FB2K_TRACE(__FUNCTION__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 #define FB2K_TRACE_THIS_FORCED FB2K_TRACE_FORCED(__FUNCTION__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 #define FB2K_BugCheck() fb2k::crashWithMessage( pfc::format("FB2K_BugCheck: ", __FUNCTION__ ) )
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 #define FB2K_BugCheckEx(msg) fb2k::crashWithMessage(msg)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 #define FB2K_BugCheckUnlikely() uBugCheck()