VirtualBox

source: vbox/trunk/include/iprt/assert.h@ 32107

Last change on this file since 32107 was 30253, checked in by vboxsync, 14 years ago

iprt/assert.h: Use static_assert with g++ when available. Added AssertCompileNS for working around restrictions C++0x imposes on the expression.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 79.3 KB
Line 
1/** @file
2 * IPRT - Assertions.
3 */
4
5/*
6 * Copyright (C) 2006-2007 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___iprt_assert_h
27#define ___iprt_assert_h
28
29#include <iprt/cdefs.h>
30#include <iprt/types.h>
31#include <iprt/stdarg.h>
32
33/** @defgroup grp_rt_assert Assert - Assertions
34 * @ingroup grp_rt
35 *
36 * Assertions are generally used to check preconditions and other
37 * assumptions. Sometimes it is also used to catch odd errors or errors
38 * that one would like to inspect in the debugger. They should not be
39 * used for errors that happen frequently.
40 *
41 * IPRT provides a host of assertion macros, so many that it can be a bit
42 * overwhelming at first. Don't despair, there is a system (surprise).
43 *
44 * First there are four families of assertions:
45 * - Assert - The normal strict build only assertions.
46 * - AssertLogRel - Calls LogRel() in non-strict builds, otherwise like Assert.
47 * - AssertRelease - Triggers in all builds.
48 * - AssertFatal - Triggers in all builds and cannot be continued.
49 *
50 * Then there are variations wrt to argument list and behavior on failure:
51 * - Msg - Custom RTStrPrintf-like message with the assertion message.
52 * - Return - Return the specific rc on failure.
53 * - ReturnVoid - Return (void) on failure.
54 * - Break - Break (out of switch/loop) on failure.
55 * - Stmt - Execute the specified statement(s) on failure.
56 * - RC - Assert RT_SUCCESS.
57 * - RCSuccess - Assert VINF_SUCCESS.
58 *
59 * In addition there is a very special family AssertCompile that can be
60 * used for some limited compile-time checking, like structure sizes and member
61 * alignment. This family doesn't have the same variations.
62 *
63 *
64 * @remarks As you might have noticed, the macros don't follow the
65 * coding guidelines wrt to macros supposedly being all uppercase
66 * and underscored. For various reasons they don't, and nobody
67 * has complained yet. Wonder why... :-)
68 *
69 * @remarks Each project has its own specific guidelines on how to use
70 * assertions, so the above is just trying to give you the general idea
71 * from the IPRT point of view.
72 *
73 * @{
74 */
75
76RT_C_DECLS_BEGIN
77
78/**
79 * The 1st part of an assert message.
80 *
81 * @param pszExpr Expression. Can be NULL.
82 * @param uLine Location line number.
83 * @param pszFile Location file name.
84 * @param pszFunction Location function name.
85 */
86RTDECL(void) RTAssertMsg1(const char *pszExpr, unsigned uLine, const char *pszFile, const char *pszFunction);
87/**
88 * Weak version of RTAssertMsg1 that can be overridden locally in a module to
89 * modify, redirect or otherwise mess with the assertion output.
90 *
91 * @copydoc RTAssertMsg1
92 */
93RTDECL(void) RTAssertMsg1Weak(const char *pszExpr, unsigned uLine, const char *pszFile, const char *pszFunction);
94
95/**
96 * The 2nd (optional) part of an assert message.
97 *
98 * @param pszFormat Printf like format string.
99 * @param ... Arguments to that string.
100 */
101RTDECL(void) RTAssertMsg2(const char *pszFormat, ...);
102/**
103 * Weak version of RTAssertMsg2 that forwards to RTAssertMsg2WeakV.
104 *
105 * There is not need to override this, check out RTAssertMsg2WeakV instead!
106 *
107 * @copydoc RTAssertMsg2
108 */
109RTDECL(void) RTAssertMsg2Weak(const char *pszFormat, ...);
110
111/**
112 * The 2nd (optional) part of an assert message.
113 *
114 * @param pszFormat Printf like format string.
115 * @param va Arguments to that string.
116 */
117RTDECL(void) RTAssertMsg2V(const char *pszFormat, va_list va);
118/**
119 * Weak version of RTAssertMsg2V that can be overridden locally in a module to
120 * modify, redirect or otherwise mess with the assertion output.
121 *
122 * @copydoc RTAssertMsg2V
123 */
124RTDECL(void) RTAssertMsg2WeakV(const char *pszFormat, va_list va);
125
126/**
127 * Additional information which should be appended to the 2nd part of an
128 * assertion message.
129 *
130 * @param pszFormat Printf like format string.
131 * @param ... Arguments to that string.
132 */
133RTDECL(void) RTAssertMsg2Add(const char *pszFormat, ...);
134/**
135 * Weak version of RTAssertMsg2Add that forwards to RTAssertMsg2AddWeakV.
136 *
137 * There is not need to override this, check out RTAssertMsg2AddWeakV instead!
138 *
139 * @copydoc RTAssertMsg2Add
140 */
141RTDECL(void) RTAssertMsg2AddWeak(const char *pszFormat, ...);
142
143/**
144 * Additional information which should be appended to the 2nd part of an
145 * assertion message.
146 *
147 * @param pszFormat Printf like format string.
148 * @param va Arguments to that string.
149 */
150RTDECL(void) RTAssertMsg2AddV(const char *pszFormat, va_list va);
151/**
152 * Weak version of RTAssertMsg2AddV that can be overridden locally in a module
153 * to modify, redirect or otherwise mess with the assertion output.
154 *
155 * @copydoc RTAssertMsg2AddV
156 */
157RTDECL(void) RTAssertMsg2AddWeakV(const char *pszFormat, va_list va);
158
159#ifdef IN_RING0
160/**
161 * Panics the system as the result of a fail assertion.
162 */
163RTR0DECL(void) RTR0AssertPanicSystem(void);
164#endif /* IN_RING0 */
165
166/**
167 * Overridable function that decides whether assertions executes the panic
168 * (breakpoint) or not.
169 *
170 * The generic implementation will return true.
171 *
172 * @returns true if the breakpoint should be hit, false if it should be ignored.
173 *
174 * @remark The RTDECL() makes this a bit difficult to override on Windows. So,
175 * you'll have to use RTASSERT_HAVE_SHOULD_PANIC or
176 * RTASSERT_HAVE_SHOULD_PANIC_PRIVATE there to control the kind of
177 * prototype.
178 */
179#if !defined(RTASSERT_HAVE_SHOULD_PANIC) && !defined(RTASSERT_HAVE_SHOULD_PANIC_PRIVATE)
180RTDECL(bool) RTAssertShouldPanic(void);
181#elif defined(RTASSERT_HAVE_SHOULD_PANIC_PRIVATE)
182bool RTAssertShouldPanic(void);
183#else
184DECLEXPORT(bool) RTCALL RTAssertShouldPanic(void);
185#endif
186
187/**
188 * Controls whether the assertions should be quiet or noisy (default).
189 *
190 * @returns The old setting.
191 * @param fQuiet The new setting.
192 */
193RTDECL(bool) RTAssertSetQuiet(bool fQuiet);
194
195/**
196 * Are assertions quiet or noisy?
197 *
198 * @returns True if they are quiet, false if noisy.
199 */
200RTDECL(bool) RTAssertAreQuiet(void);
201
202/**
203 * Makes the assertions panic (default) or not.
204 *
205 * @returns The old setting.
206 * @param fPanic The new setting.
207 */
208RTDECL(bool) RTAssertSetMayPanic(bool fPanic);
209
210/**
211 * Can assertion panic.
212 *
213 * @returns True if they can, false if not.
214 */
215RTDECL(bool) RTAssertMayPanic(void);
216
217
218/** @name Globals for crash analysis
219 * @remarks This is the full potential set, it
220 * @{
221 */
222/** The last assert message, 1st part. */
223extern RTDATADECL(char) g_szRTAssertMsg1[1024];
224/** The last assert message, 2nd part. */
225extern RTDATADECL(char) g_szRTAssertMsg2[4096];
226/** The last assert message, expression. */
227extern RTDATADECL(const char * volatile) g_pszRTAssertExpr;
228/** The last assert message, file name. */
229extern RTDATADECL(const char * volatile) g_pszRTAssertFile;
230/** The last assert message, line number. */
231extern RTDATADECL(uint32_t volatile) g_u32RTAssertLine;
232/** The last assert message, function name. */
233extern RTDATADECL(const char * volatile) g_pszRTAssertFunction;
234/** @} */
235
236RT_C_DECLS_END
237
238/** @def RTAssertDebugBreak()
239 * Debugger breakpoint instruction.
240 *
241 * @remarks This macro does not depend on RT_STRICT.
242 */
243#define RTAssertDebugBreak() do { RT_BREAKPOINT(); } while (0)
244
245
246
247/** @name Compile time assertions.
248 *
249 * These assertions are used to check structure sizes, member/size alignments
250 * and similar compile time expressions.
251 *
252 * @{
253 */
254
255/**
256 * RTASSERTTYPE is the type the AssertCompile() macro redefines.
257 * It has no other function and shouldn't be used.
258 * Visual C++ uses this.
259 */
260typedef int RTASSERTTYPE[1];
261
262/**
263 * RTASSERTVAR is the type the AssertCompile() macro redefines.
264 * It has no other function and shouldn't be used.
265 * GCC uses this.
266 */
267#ifdef __GNUC__
268RT_C_DECLS_BEGIN
269#endif
270extern int RTASSERTVAR[1];
271#ifdef __GNUC__
272RT_C_DECLS_END
273#endif
274
275/** @def RTASSERT_HAVE_STATIC_ASSERT
276 * Indicates that the compiler implements static_assert(expr, msg).
277 */
278#ifdef _MSC_VER
279# if _MSC_VER >= 1600 && defined(__cplusplus)
280# define RTASSERT_HAVE_STATIC_ASSERT
281# endif
282#endif
283#if defined(__GNUC__) && defined(__GXX_EXPERIMENTAL_CXX0X__)
284# define RTASSERT_HAVE_STATIC_ASSERT
285#endif
286#ifdef DOXYGEN_RUNNING
287# define RTASSERT_HAVE_STATIC_ASSERT
288#endif
289
290/** @def AssertCompileNS
291 * Asserts that a compile-time expression is true. If it's not break the build.
292 *
293 * This differs from AssertCompile in that it accepts some more expressions
294 * than what C++0x allows - NS = Non-standard.
295 *
296 * @param expr Expression which should be true.
297 */
298#ifdef __GNUC__
299# define AssertCompileNS(expr) extern int RTASSERTVAR[1] __attribute__((unused)), RTASSERTVAR[(expr) ? 1 : 0] __attribute__((unused))
300#else
301# define AssertCompileNS(expr) typedef int RTASSERTTYPE[(expr) ? 1 : 0]
302#endif
303
304/** @def AssertCompile
305 * Asserts that a C++0x compile-time expression is true. If it's not break the
306 * build.
307 * @param expr Expression which should be true.
308 */
309#ifdef RTASSERT_HAVE_STATIC_ASSERT
310# define AssertCompile(expr) static_assert(!!(expr), #expr)
311#else
312# define AssertCompile(expr) AssertCompileNS(expr)
313#endif
314
315/** @def AssertCompileSize
316 * Asserts a size at compile.
317 * @param type The type.
318 * @param size The expected type size.
319 */
320#define AssertCompileSize(type, size) \
321 AssertCompile(sizeof(type) == (size))
322
323/** @def AssertCompileSizeAlignment
324 * Asserts a size alignment at compile.
325 * @param type The type.
326 * @param align The size alignment to assert.
327 */
328#define AssertCompileSizeAlignment(type, align) \
329 AssertCompile(!(sizeof(type) & ((align) - 1)))
330
331/** @def AssertCompileMemberSize
332 * Asserts a member offset alignment at compile.
333 * @param type The type.
334 * @param member The member.
335 * @param size The member size to assert.
336 */
337#define AssertCompileMemberSize(type, member, size) \
338 AssertCompile(RT_SIZEOFMEMB(type, member) == (size))
339
340/** @def AssertCompileMemberSizeAlignment
341 * Asserts a member size alignment at compile.
342 * @param type The type.
343 * @param member The member.
344 * @param align The member size alignment to assert.
345 */
346#define AssertCompileMemberSizeAlignment(type, member, align) \
347 AssertCompile(!(RT_SIZEOFMEMB(type, member) & ((align) - 1)))
348
349/** @def AssertCompileMemberAlignment
350 * Asserts a member offset alignment at compile.
351 * @param type The type.
352 * @param member The member.
353 * @param align The member offset alignment to assert.
354 */
355#if defined(__GNUC__)
356# if __GNUC__ >= 4
357# define AssertCompileMemberAlignment(type, member, align) \
358 AssertCompile(!(__builtin_offsetof(type, member) & ((align) - 1)))
359# else
360# define AssertCompileMemberAlignment(type, member, align) \
361 AssertCompile(!(RT_OFFSETOF(type, member) & ((align) - 1)))
362# endif
363#else
364# define AssertCompileMemberAlignment(type, member, align) \
365 AssertCompile(!(RT_OFFSETOF(type, member) & ((align) - 1)))
366#endif
367
368/** @def AssertCompileMemberOffset
369 * Asserts a offset of a structure member at compile.
370 * @param type The type.
371 * @param member The member.
372 * @param off The expected offset.
373 */
374#if defined(__GNUC__)
375# if __GNUC__ >= 4
376# define AssertCompileMemberOffset(type, member, off) \
377 AssertCompile(__builtin_offsetof(type, member) == (off))
378# else
379# define AssertCompileMemberOffset(type, member, off) \
380 AssertCompile(RT_OFFSETOF(type, member) == (off))
381# endif
382#else
383# define AssertCompileMemberOffset(type, member, off) \
384 AssertCompile(RT_OFFSETOF(type, member) == (off))
385#endif
386
387/** @def AssertCompile2MemberOffsets
388 * Asserts that two (sub-structure) members in union have the same offset.
389 * @param type The type.
390 * @param member1 The first member.
391 * @param member2 The second member.
392 */
393#if defined(__GNUC__)
394# if __GNUC__ >= 4
395# define AssertCompile2MemberOffsets(type, member1, member2) \
396 AssertCompile(__builtin_offsetof(type, member1) == __builtin_offsetof(type, member2))
397# else
398# define AssertCompile2MemberOffsets(type, member1, member2) \
399 AssertCompile(RT_OFFSETOF(type, member1) == RT_OFFSETOF(type, member2))
400# endif
401#else
402# define AssertCompile2MemberOffsets(type, member1, member2) \
403 AssertCompile(RT_OFFSETOF(type, member1) == RT_OFFSETOF(type, member2))
404#endif
405
406/** @def AssertCompileAdjacentMembers
407 * Asserts that two structure members are adjacent.
408 * @param type The type.
409 * @param member1 The first member.
410 * @param member2 The second member.
411 */
412#if defined(__GNUC__)
413# if __GNUC__ >= 4
414# define AssertCompileAdjacentMembers(type, member1, member2) \
415 AssertCompile(__builtin_offsetof(type, member1) + RT_SIZEOFMEMB(type, member1) == __builtin_offsetof(type, member2))
416# else
417# define AssertCompileAdjacentMembers(type, member1, member2) \
418 AssertCompile(RT_OFFSETOF(type, member1) + RT_SIZEOFMEMB(type, member1) == RT_OFFSETOF(type, member2))
419# endif
420#else
421# define AssertCompileAdjacentMembers(type, member1, member2) \
422 AssertCompile(RT_OFFSETOF(type, member1) + RT_SIZEOFMEMB(type, member1) == RT_OFFSETOF(type, member2))
423#endif
424
425/** @def AssertCompileMembersAtSameOffset
426 * Asserts that members of two different structures are at the same offset.
427 * @param type1 The first type.
428 * @param member1 The first member.
429 * @param type2 The second type.
430 * @param member2 The second member.
431 */
432#if defined(__GNUC__)
433# if __GNUC__ >= 4
434# define AssertCompileMembersAtSameOffset(type1, member1, type2, member2) \
435 AssertCompile(__builtin_offsetof(type1, member1) == __builtin_offsetof(type2, member2))
436# else
437# define AssertCompileMembersAtSameOffset(type1, member1, type2, member2) \
438 AssertCompile(RT_OFFSETOF(type1, member1) == RT_OFFSETOF(type2, member2))
439# endif
440#else
441# define AssertCompileMembersAtSameOffset(type1, member1, type2, member2) \
442 AssertCompile(RT_OFFSETOF(type1, member1) == RT_OFFSETOF(type2, member2))
443#endif
444
445/** @def AssertCompileMembersSameSize
446 * Asserts that members of two different structures have the same size.
447 * @param type1 The first type.
448 * @param member1 The first member.
449 * @param type2 The second type.
450 * @param member2 The second member.
451 */
452#define AssertCompileMembersSameSize(type1, member1, type2, member2) \
453 AssertCompile(RT_SIZEOFMEMB(type1, member1) == RT_SIZEOFMEMB(type2, member2))
454
455/** @def AssertCompileMembersSameSizeAndOffset
456 * Asserts that members of two different structures have the same size and are
457 * at the same offset.
458 * @param type1 The first type.
459 * @param member1 The first member.
460 * @param type2 The second type.
461 * @param member2 The second member.
462 */
463#if defined(__GNUC__)
464# if __GNUC__ >= 4
465# define AssertCompileMembersSameSizeAndOffset(type1, member1, type2, member2) \
466 AssertCompile(__builtin_offsetof(type1, member1) == __builtin_offsetof(type2, member2) && RT_SIZEOFMEMB(type1, member1) == RT_SIZEOFMEMB(type2, member2))
467# else
468# define AssertCompileMembersSameSizeAndOffset(type1, member1, type2, member2) \
469 AssertCompile(RT_OFFSETOF(type1, member1) == RT_OFFSETOF(type2, member2) && RT_SIZEOFMEMB(type1, member1) == RT_SIZEOFMEMB(type2, member2))
470# endif
471#else
472# define AssertCompileMembersSameSizeAndOffset(type1, member1, type2, member2) \
473 AssertCompile(RT_OFFSETOF(type1, member1) == RT_OFFSETOF(type2, member2) && RT_SIZEOFMEMB(type1, member1) == RT_SIZEOFMEMB(type2, member2))
474#endif
475
476/** @} */
477
478
479
480/** @name Assertions
481 *
482 * These assertions will only trigger when RT_STRICT is defined. When it is
483 * undefined they will all be no-ops and generate no code.
484 *
485 * @{
486 */
487
488
489/** @def RTASSERT_QUIET
490 * This can be defined to shut up the messages for a file where this would be
491 * problematic because the message printing code path passes thru it.
492 * @internal */
493#ifdef DOXYGEN_RUNNING
494# define RTASSERT_QUIET
495#endif
496#if defined(RTASSERT_QUIET) && !defined(DOXYGEN_RUNNING)
497# define RTAssertMsg1Weak(pszExpr, uLine, pszfile, pszFunction) \
498 do { } while (0)
499# define RTAssertMsg2Weak if (0) RTAssertMsg2Weak
500#endif
501
502/** @def RTAssertDoPanic
503 * Raises an assertion panic appropriate to the current context.
504 * @remarks This macro does not depend on RT_STRICT.
505 */
506#if defined(IN_RING0) \
507 && (defined(RT_OS_DARWIN) || defined(RT_OS_SOLARIS))
508# define RTAssertDoPanic() RTR0AssertPanicSystem()
509#else
510# define RTAssertDoPanic() RTAssertDebugBreak()
511#endif
512
513/** @def AssertBreakpoint()
514 * Assertion Breakpoint.
515 * @deprecated Use RTAssertPanic or RTAssertDebugBreak instead.
516 */
517#ifdef RT_STRICT
518# define AssertBreakpoint() RTAssertDebugBreak()
519#else
520# define AssertBreakpoint() do { } while (0)
521#endif
522
523/** @def RTAssertPanic()
524 * If RT_STRICT is defined this macro will invoke RTAssertDoPanic if
525 * RTAssertShouldPanic returns true. If RT_STRICT isn't defined it won't do any
526 * thing.
527 */
528#ifdef RT_STRICT
529# define RTAssertPanic() do { if (RTAssertShouldPanic()) RTAssertDoPanic(); } while (0)
530#else
531# define RTAssertPanic() do { } while (0)
532#endif
533
534/** @def Assert
535 * Assert that an expression is true. If false, hit breakpoint.
536 * @param expr Expression which should be true.
537 */
538#ifdef RT_STRICT
539# define Assert(expr) \
540 do { \
541 if (RT_UNLIKELY(!(expr))) \
542 { \
543 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
544 RTAssertPanic(); \
545 } \
546 } while (0)
547#else
548# define Assert(expr) do { } while (0)
549#endif
550
551
552/** @def AssertStmt
553 * Assert that an expression is true. If false, hit breakpoint and execute the
554 * statement.
555 * @param expr Expression which should be true.
556 * @param stmt Statement to execute on failure.
557 */
558#ifdef RT_STRICT
559# define AssertStmt(expr, stmt) \
560 do { \
561 if (RT_UNLIKELY(!(expr))) \
562 { \
563 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
564 RTAssertPanic(); \
565 stmt; \
566 } \
567 } while (0)
568#else
569# define AssertStmt(expr, stmt) \
570 do { \
571 if (RT_UNLIKELY(!(expr))) \
572 { \
573 stmt; \
574 } \
575 } while (0)
576#endif
577
578
579/** @def AssertReturn
580 * Assert that an expression is true and returns if it isn't.
581 * In RT_STRICT mode it will hit a breakpoint before returning.
582 *
583 * @param expr Expression which should be true.
584 * @param rc What is to be presented to return.
585 */
586#ifdef RT_STRICT
587# define AssertReturn(expr, rc) \
588 do { \
589 if (RT_UNLIKELY(!(expr))) \
590 { \
591 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
592 RTAssertPanic(); \
593 return (rc); \
594 } \
595 } while (0)
596#else
597# define AssertReturn(expr, rc) \
598 do { \
599 if (RT_UNLIKELY(!(expr))) \
600 return (rc); \
601 } while (0)
602#endif
603
604/** @def AssertReturnStmt
605 * Assert that an expression is true, if it isn't execute the given statement
606 * and return rc.
607 *
608 * In RT_STRICT mode it will hit a breakpoint before executing the statement and
609 * returning.
610 *
611 * @param expr Expression which should be true.
612 * @param stmt Statement to execute before returning on failure.
613 * @param rc What is to be presented to return.
614 */
615#ifdef RT_STRICT
616# define AssertReturnStmt(expr, stmt, rc) \
617 do { \
618 if (RT_UNLIKELY(!(expr))) \
619 { \
620 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
621 RTAssertPanic(); \
622 stmt; \
623 return (rc); \
624 } \
625 } while (0)
626#else
627# define AssertReturnStmt(expr, stmt, rc) \
628 do { \
629 if (RT_UNLIKELY(!(expr))) \
630 { \
631 stmt; \
632 return (rc); \
633 } \
634 } while (0)
635#endif
636
637/** @def AssertReturnVoid
638 * Assert that an expression is true and returns if it isn't.
639 * In RT_STRICT mode it will hit a breakpoint before returning.
640 *
641 * @param expr Expression which should be true.
642 */
643#ifdef RT_STRICT
644# define AssertReturnVoid(expr) \
645 do { \
646 if (RT_UNLIKELY(!(expr))) \
647 { \
648 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
649 RTAssertPanic(); \
650 return; \
651 } \
652 } while (0)
653#else
654# define AssertReturnVoid(expr) \
655 do { \
656 if (RT_UNLIKELY(!(expr))) \
657 return; \
658 } while (0)
659#endif
660
661/** @def AssertReturnVoidStmt
662 * Assert that an expression is true, if it isn't execute the given statement
663 * and return.
664 *
665 * In RT_STRICT mode it will hit a breakpoint before returning.
666 *
667 * @param expr Expression which should be true.
668 * @param stmt Statement to execute before returning on failure.
669 */
670#ifdef RT_STRICT
671# define AssertReturnVoidStmt(expr, stmt) \
672 do { \
673 if (RT_UNLIKELY(!(expr))) \
674 { \
675 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
676 RTAssertPanic(); \
677 stmt; \
678 return; \
679 } \
680 } while (0)
681#else
682# define AssertReturnVoidStmt(expr, stmt) \
683 do { \
684 if (RT_UNLIKELY(!(expr))) \
685 { \
686 stmt; \
687 return; \
688 } \
689 } while (0)
690#endif
691
692
693/** @def AssertBreak
694 * Assert that an expression is true and breaks if it isn't.
695 * In RT_STRICT mode it will hit a breakpoint before returning.
696 *
697 * @param expr Expression which should be true.
698 */
699#ifdef RT_STRICT
700# define AssertBreak(expr) \
701 if (RT_UNLIKELY(!(expr))) \
702 { \
703 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
704 RTAssertPanic(); \
705 break; \
706 } else do {} while (0)
707#else
708# define AssertBreak(expr) \
709 if (RT_UNLIKELY(!(expr))) \
710 break; \
711 else do {} while (0)
712#endif
713
714/** @def AssertBreakStmt
715 * Assert that an expression is true and breaks if it isn't.
716 * In RT_STRICT mode it will hit a breakpoint before doing break.
717 *
718 * @param expr Expression which should be true.
719 * @param stmt Statement to execute before break in case of a failed assertion.
720 */
721#ifdef RT_STRICT
722# define AssertBreakStmt(expr, stmt) \
723 if (RT_UNLIKELY(!(expr))) { \
724 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
725 RTAssertPanic(); \
726 stmt; \
727 break; \
728 } else do {} while (0)
729#else
730# define AssertBreakStmt(expr, stmt) \
731 if (RT_UNLIKELY(!(expr))) { \
732 stmt; \
733 break; \
734 } else do {} while (0)
735#endif
736
737
738/** @def AssertMsg
739 * Assert that an expression is true. If it's not print message and hit breakpoint.
740 * @param expr Expression which should be true.
741 * @param a printf argument list (in parenthesis).
742 */
743#ifdef RT_STRICT
744# define AssertMsg(expr, a) \
745 do { \
746 if (RT_UNLIKELY(!(expr))) \
747 { \
748 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
749 RTAssertMsg2Weak a; \
750 RTAssertPanic(); \
751 } \
752 } while (0)
753#else
754# define AssertMsg(expr, a) do { } while (0)
755#endif
756
757/** @def AssertMsgStmt
758 * Assert that an expression is true. If it's not print message and hit
759 * breakpoint and execute the statement.
760 *
761 * @param expr Expression which should be true.
762 * @param a printf argument list (in parenthesis).
763 * @param stmt Statement to execute in case of a failed assertion.
764 *
765 * @remarks The expression and statement will be evaluated in all build types.
766 */
767#ifdef RT_STRICT
768# define AssertMsgStmt(expr, a, stmt) \
769 do { \
770 if (RT_UNLIKELY(!(expr))) \
771 { \
772 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
773 RTAssertMsg2Weak a; \
774 RTAssertPanic(); \
775 stmt; \
776 } \
777 } while (0)
778#else
779# define AssertMsgStmt(expr, a, stmt) \
780 do { \
781 if (RT_UNLIKELY(!(expr))) \
782 { \
783 stmt; \
784 } \
785 } while (0)
786#endif
787
788/** @def AssertMsgReturn
789 * Assert that an expression is true and returns if it isn't.
790 * In RT_STRICT mode it will hit a breakpoint before returning.
791 *
792 * @param expr Expression which should be true.
793 * @param a printf argument list (in parenthesis).
794 * @param rc What is to be presented to return.
795 */
796#ifdef RT_STRICT
797# define AssertMsgReturn(expr, a, rc) \
798 do { \
799 if (RT_UNLIKELY(!(expr))) \
800 { \
801 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
802 RTAssertMsg2Weak a; \
803 RTAssertPanic(); \
804 return (rc); \
805 } \
806 } while (0)
807#else
808# define AssertMsgReturn(expr, a, rc) \
809 do { \
810 if (RT_UNLIKELY(!(expr))) \
811 return (rc); \
812 } while (0)
813#endif
814
815/** @def AssertMsgReturnStmt
816 * Assert that an expression is true, if it isn't execute the statement and
817 * return.
818 *
819 * In RT_STRICT mode it will hit a breakpoint before returning.
820 *
821 * @param expr Expression which should be true.
822 * @param a printf argument list (in parenthesis).
823 * @param stmt Statement to execute before break in case of a failed assertion.
824 * @param rc What is to be presented to return.
825 */
826#ifdef RT_STRICT
827# define AssertMsgReturnStmt(expr, a, stmt, rc) \
828 do { \
829 if (RT_UNLIKELY(!(expr))) \
830 { \
831 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
832 RTAssertMsg2Weak a; \
833 RTAssertPanic(); \
834 stmt; \
835 return (rc); \
836 } \
837 } while (0)
838#else
839# define AssertMsgReturnStmt(expr, a, stmt, rc) \
840 do { \
841 if (RT_UNLIKELY(!(expr))) \
842 { \
843 stmt; \
844 return (rc); \
845 } \
846 } while (0)
847#endif
848
849/** @def AssertMsgReturnVoid
850 * Assert that an expression is true and returns if it isn't.
851 * In RT_STRICT mode it will hit a breakpoint before returning.
852 *
853 * @param expr Expression which should be true.
854 * @param a printf argument list (in parenthesis).
855 */
856#ifdef RT_STRICT
857# define AssertMsgReturnVoid(expr, a) \
858 do { \
859 if (RT_UNLIKELY(!(expr))) \
860 { \
861 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
862 RTAssertMsg2Weak a; \
863 RTAssertPanic(); \
864 return; \
865 } \
866 } while (0)
867#else
868# define AssertMsgReturnVoid(expr, a) \
869 do { \
870 if (RT_UNLIKELY(!(expr))) \
871 return; \
872 } while (0)
873#endif
874
875/** @def AssertMsgReturnVoidStmt
876 * Assert that an expression is true, if it isn't execute the statement and
877 * return.
878 *
879 * In RT_STRICT mode it will hit a breakpoint before returning.
880 *
881 * @param expr Expression which should be true.
882 * @param a printf argument list (in parenthesis).
883 * @param stmt Statement to execute before break in case of a failed assertion.
884 */
885#ifdef RT_STRICT
886# define AssertMsgReturnVoidStmt(expr, a, stmt) \
887 do { \
888 if (RT_UNLIKELY(!(expr))) \
889 { \
890 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
891 RTAssertMsg2Weak a; \
892 RTAssertPanic(); \
893 stmt; \
894 return; \
895 } \
896 } while (0)
897#else
898# define AssertMsgReturnVoidStmt(expr, a, stmt) \
899 do { \
900 if (RT_UNLIKELY(!(expr))) \
901 { \
902 stmt; \
903 return; \
904 } \
905 } while (0)
906#endif
907
908
909/** @def AssertMsgBreak
910 * Assert that an expression is true and breaks if it isn't.
911 * In RT_STRICT mode it will hit a breakpoint before returning.
912 *
913 * @param expr Expression which should be true.
914 * @param a printf argument list (in parenthesis).
915 */
916#ifdef RT_STRICT
917# define AssertMsgBreak(expr, a) \
918 if (RT_UNLIKELY(!(expr))) \
919 { \
920 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
921 RTAssertMsg2Weak a; \
922 RTAssertPanic(); \
923 break; \
924 } else do {} while (0)
925#else
926# define AssertMsgBreak(expr, a) \
927 if (RT_UNLIKELY(!(expr))) \
928 break; \
929 else do {} while (0)
930#endif
931
932/** @def AssertMsgBreakStmt
933 * Assert that an expression is true and breaks if it isn't.
934 * In RT_STRICT mode it will hit a breakpoint before doing break.
935 *
936 * @param expr Expression which should be true.
937 * @param a printf argument list (in parenthesis).
938 * @param stmt Statement to execute before break in case of a failed assertion.
939 */
940#ifdef RT_STRICT
941# define AssertMsgBreakStmt(expr, a, stmt) \
942 if (RT_UNLIKELY(!(expr))) { \
943 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
944 RTAssertMsg2Weak a; \
945 RTAssertPanic(); \
946 stmt; \
947 break; \
948 } else do {} while (0)
949#else
950# define AssertMsgBreakStmt(expr, a, stmt) \
951 if (RT_UNLIKELY(!(expr))) { \
952 stmt; \
953 break; \
954 } else do {} while (0)
955#endif
956
957/** @def AssertFailed
958 * An assertion failed hit breakpoint.
959 */
960#ifdef RT_STRICT
961# define AssertFailed() \
962 do { \
963 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
964 RTAssertPanic(); \
965 } while (0)
966#else
967# define AssertFailed() do { } while (0)
968#endif
969
970/** @def AssertFailedReturn
971 * An assertion failed, hit breakpoint (RT_STRICT mode only) and return.
972 *
973 * @param rc The rc to return.
974 */
975#ifdef RT_STRICT
976# define AssertFailedReturn(rc) \
977 do { \
978 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
979 RTAssertPanic(); \
980 return (rc); \
981 } while (0)
982#else
983# define AssertFailedReturn(rc) \
984 do { \
985 return (rc); \
986 } while (0)
987#endif
988
989/** @def AssertFailedReturnStmt
990 * An assertion failed, hit breakpoint (RT_STRICT mode only), execute a
991 * statement and return a value.
992 *
993 * @param stmt The statement to execute before returning.
994 * @param rc The value to return.
995 */
996#ifdef RT_STRICT
997# define AssertFailedReturnStmt(stmt, rc) \
998 do { \
999 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1000 RTAssertPanic(); \
1001 stmt; \
1002 return (rc); \
1003 } while (0)
1004#else
1005# define AssertFailedReturnStmt(stmt, rc) \
1006 do { \
1007 stmt; \
1008 return (rc); \
1009 } while (0)
1010#endif
1011
1012/** @def AssertFailedReturnVoid
1013 * An assertion failed, hit breakpoint (RT_STRICT mode only) and return.
1014 */
1015#ifdef RT_STRICT
1016# define AssertFailedReturnVoid() \
1017 do { \
1018 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1019 RTAssertPanic(); \
1020 return; \
1021 } while (0)
1022#else
1023# define AssertFailedReturnVoid() \
1024 do { \
1025 return; \
1026 } while (0)
1027#endif
1028
1029/** @def AssertFailedReturnVoidStmt
1030 * An assertion failed, hit breakpoint (RT_STRICT mode only), execute a
1031 * statement and return.
1032 *
1033 * @param stmt The statement to execute before returning.
1034 */
1035#ifdef RT_STRICT
1036# define AssertFailedReturnVoidStmt(stmt) \
1037 do { \
1038 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1039 RTAssertPanic(); \
1040 stmt; \
1041 return; \
1042 } while (0)
1043#else
1044# define AssertFailedReturnVoidStmt(stmt) \
1045 do { \
1046 stmt; \
1047 return; \
1048 } while (0)
1049#endif
1050
1051
1052/** @def AssertFailedBreak
1053 * An assertion failed, hit breakpoint (RT_STRICT mode only) and break.
1054 */
1055#ifdef RT_STRICT
1056# define AssertFailedBreak() \
1057 if (1) { \
1058 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1059 RTAssertPanic(); \
1060 break; \
1061 } else do {} while (0)
1062#else
1063# define AssertFailedBreak() \
1064 if (1) \
1065 break; \
1066 else do {} while (0)
1067#endif
1068
1069/** @def AssertFailedBreakStmt
1070 * An assertion failed, hit breakpoint (RT_STRICT mode only), execute
1071 * the given statement and break.
1072 *
1073 * @param stmt Statement to execute before break.
1074 */
1075#ifdef RT_STRICT
1076# define AssertFailedBreakStmt(stmt) \
1077 if (1) { \
1078 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1079 RTAssertPanic(); \
1080 stmt; \
1081 break; \
1082 } else do {} while (0)
1083#else
1084# define AssertFailedBreakStmt(stmt) \
1085 if (1) { \
1086 stmt; \
1087 break; \
1088 } else do {} while (0)
1089#endif
1090
1091
1092/** @def AssertMsgFailed
1093 * An assertion failed print a message and a hit breakpoint.
1094 *
1095 * @param a printf argument list (in parenthesis).
1096 */
1097#ifdef RT_STRICT
1098# define AssertMsgFailed(a) \
1099 do { \
1100 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1101 RTAssertMsg2Weak a; \
1102 RTAssertPanic(); \
1103 } while (0)
1104#else
1105# define AssertMsgFailed(a) do { } while (0)
1106#endif
1107
1108/** @def AssertMsgFailedReturn
1109 * An assertion failed, hit breakpoint with message (RT_STRICT mode only) and return.
1110 *
1111 * @param a printf argument list (in parenthesis).
1112 * @param rc What is to be presented to return.
1113 */
1114#ifdef RT_STRICT
1115# define AssertMsgFailedReturn(a, rc) \
1116 do { \
1117 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1118 RTAssertMsg2Weak a; \
1119 RTAssertPanic(); \
1120 return (rc); \
1121 } while (0)
1122#else
1123# define AssertMsgFailedReturn(a, rc) \
1124 do { \
1125 return (rc); \
1126 } while (0)
1127#endif
1128
1129/** @def AssertMsgFailedReturnVoid
1130 * An assertion failed, hit breakpoint with message (RT_STRICT mode only) and return.
1131 *
1132 * @param a printf argument list (in parenthesis).
1133 */
1134#ifdef RT_STRICT
1135# define AssertMsgFailedReturnVoid(a) \
1136 do { \
1137 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1138 RTAssertMsg2Weak a; \
1139 RTAssertPanic(); \
1140 return; \
1141 } while (0)
1142#else
1143# define AssertMsgFailedReturnVoid(a) \
1144 do { \
1145 return; \
1146 } while (0)
1147#endif
1148
1149
1150/** @def AssertMsgFailedBreak
1151 * An assertion failed, hit breakpoint with message (RT_STRICT mode only) and break.
1152 *
1153 * @param a printf argument list (in parenthesis).
1154 */
1155#ifdef RT_STRICT
1156# define AssertMsgFailedBreak(a) \
1157 if (1) { \
1158 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1159 RTAssertMsg2Weak a; \
1160 RTAssertPanic(); \
1161 break; \
1162 } else do {} while (0)
1163#else
1164# define AssertMsgFailedBreak(a) \
1165 if (1) \
1166 break; \
1167 else do {} while (0)
1168#endif
1169
1170/** @def AssertMsgFailedBreakStmt
1171 * An assertion failed, hit breakpoint (RT_STRICT mode only), execute
1172 * the given statement and break.
1173 *
1174 * @param a printf argument list (in parenthesis).
1175 * @param stmt Statement to execute before break.
1176 */
1177#ifdef RT_STRICT
1178# define AssertMsgFailedBreakStmt(a, stmt) \
1179 if (1) { \
1180 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1181 RTAssertMsg2Weak a; \
1182 RTAssertPanic(); \
1183 stmt; \
1184 break; \
1185 } else do {} while (0)
1186#else
1187# define AssertMsgFailedBreakStmt(a, stmt) \
1188 if (1) { \
1189 stmt; \
1190 break; \
1191 } else do {} while (0)
1192#endif
1193
1194/** @} */
1195
1196
1197
1198/** @name Release Log Assertions
1199 *
1200 * These assertions will work like normal strict assertion when RT_STRICT is
1201 * defined and LogRel statements when RT_STRICT is undefined. Typically used for
1202 * things which shouldn't go wrong, but when it does you'd like to know one way
1203 * or the other.
1204 *
1205 * @{
1206 */
1207
1208/** @def RTAssertLogRelMsg1
1209 * RTAssertMsg1Weak (strict builds) / LogRel wrapper (non-strict).
1210 */
1211#ifdef RT_STRICT
1212# define RTAssertLogRelMsg1(pszExpr, iLine, pszFile, pszFunction) \
1213 RTAssertMsg1Weak(pszExpr, iLine, pszFile, pszFunction)
1214#else
1215# define RTAssertLogRelMsg1(pszExpr, iLine, pszFile, pszFunction) \
1216 LogRel(("AssertLogRel %s(%d) %s: %s\n",\
1217 (pszFile), (iLine), (pszFunction), (pszExpr) ))
1218#endif
1219
1220/** @def RTAssertLogRelMsg2
1221 * RTAssertMsg2Weak (strict builds) / LogRel wrapper (non-strict).
1222 */
1223#ifdef RT_STRICT
1224# define RTAssertLogRelMsg2(a) RTAssertMsg2Weak a
1225#else
1226# define RTAssertLogRelMsg2(a) LogRel(a)
1227#endif
1228
1229/** @def AssertLogRel
1230 * Assert that an expression is true.
1231 * Strict builds will hit a breakpoint, non-strict will only do LogRel.
1232 *
1233 * @param expr Expression which should be true.
1234 */
1235#define AssertLogRel(expr) \
1236 do { \
1237 if (RT_UNLIKELY(!(expr))) \
1238 { \
1239 RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1240 RTAssertPanic(); \
1241 } \
1242 } while (0)
1243
1244/** @def AssertLogRelReturn
1245 * Assert that an expression is true, return \a rc if it isn't.
1246 * Strict builds will hit a breakpoint, non-strict will only do LogRel.
1247 *
1248 * @param expr Expression which should be true.
1249 * @param rc What is to be presented to return.
1250 */
1251#define AssertLogRelReturn(expr, rc) \
1252 do { \
1253 if (RT_UNLIKELY(!(expr))) \
1254 { \
1255 RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1256 RTAssertPanic(); \
1257 return (rc); \
1258 } \
1259 } while (0)
1260
1261/** @def AssertLogRelReturnVoid
1262 * Assert that an expression is true, return void if it isn't.
1263 * Strict builds will hit a breakpoint, non-strict will only do LogRel.
1264 *
1265 * @param expr Expression which should be true.
1266 */
1267#define AssertLogRelReturnVoid(expr) \
1268 do { \
1269 if (RT_UNLIKELY(!(expr))) \
1270 { \
1271 RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1272 RTAssertPanic(); \
1273 return; \
1274 } \
1275 } while (0)
1276
1277/** @def AssertLogRelBreak
1278 * Assert that an expression is true, break if it isn't.
1279 * Strict builds will hit a breakpoint, non-strict will only do LogRel.
1280 *
1281 * @param expr Expression which should be true.
1282 */
1283#define AssertLogRelBreak(expr) \
1284 if (RT_UNLIKELY(!(expr))) \
1285 { \
1286 RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1287 RTAssertPanic(); \
1288 break; \
1289 } \
1290 else do {} while (0)
1291
1292/** @def AssertLogRelBreakStmt
1293 * Assert that an expression is true, execute \a stmt and break if it isn't.
1294 * Strict builds will hit a breakpoint, non-strict will only do LogRel.
1295 *
1296 * @param expr Expression which should be true.
1297 * @param stmt Statement to execute before break in case of a failed assertion.
1298 */
1299#define AssertLogRelBreakStmt(expr, stmt) \
1300 if (RT_UNLIKELY(!(expr))) \
1301 { \
1302 RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1303 RTAssertPanic(); \
1304 stmt; \
1305 break; \
1306 } else do {} while (0)
1307
1308/** @def AssertLogRelMsg
1309 * Assert that an expression is true.
1310 * Strict builds will hit a breakpoint, non-strict will only do LogRel.
1311 *
1312 * @param expr Expression which should be true.
1313 * @param a printf argument list (in parenthesis).
1314 */
1315#define AssertLogRelMsg(expr, a) \
1316 do { \
1317 if (RT_UNLIKELY(!(expr))) \
1318 { \
1319 RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1320 RTAssertLogRelMsg2(a); \
1321 RTAssertPanic(); \
1322 } \
1323 } while (0)
1324
1325/** @def AssertLogRelMsgReturn
1326 * Assert that an expression is true, return \a rc if it isn't.
1327 * Strict builds will hit a breakpoint, non-strict will only do LogRel.
1328 *
1329 * @param expr Expression which should be true.
1330 * @param a printf argument list (in parenthesis).
1331 * @param rc What is to be presented to return.
1332 */
1333#define AssertLogRelMsgReturn(expr, a, rc) \
1334 do { \
1335 if (RT_UNLIKELY(!(expr))) \
1336 { \
1337 RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1338 RTAssertLogRelMsg2(a); \
1339 RTAssertPanic(); \
1340 return (rc); \
1341 } \
1342 } while (0)
1343
1344/** @def AssertLogRelMsgReturnVoid
1345 * Assert that an expression is true, return (void) if it isn't.
1346 * Strict builds will hit a breakpoint, non-strict will only do LogRel.
1347 *
1348 * @param expr Expression which should be true.
1349 * @param a printf argument list (in parenthesis).
1350 */
1351#define AssertLogRelMsgReturnVoid(expr, a) \
1352 do { \
1353 if (RT_UNLIKELY(!(expr))) \
1354 { \
1355 RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1356 RTAssertLogRelMsg2(a); \
1357 RTAssertPanic(); \
1358 return; \
1359 } \
1360 } while (0)
1361
1362/** @def AssertLogRelMsgBreak
1363 * Assert that an expression is true, break if it isn't.
1364 * Strict builds will hit a breakpoint, non-strict will only do LogRel.
1365 *
1366 * @param expr Expression which should be true.
1367 * @param a printf argument list (in parenthesis).
1368 */
1369#define AssertLogRelMsgBreak(expr, a) \
1370 if (RT_UNLIKELY(!(expr))) \
1371 { \
1372 RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1373 RTAssertLogRelMsg2(a); \
1374 RTAssertPanic(); \
1375 break; \
1376 } \
1377 else do {} while (0)
1378
1379/** @def AssertLogRelMsgBreakStmt
1380 * Assert that an expression is true, execute \a stmt and break if it isn't.
1381 * Strict builds will hit a breakpoint, non-strict will only do LogRel.
1382 *
1383 * @param expr Expression which should be true.
1384 * @param a printf argument list (in parenthesis).
1385 * @param stmt Statement to execute before break in case of a failed assertion.
1386 */
1387#define AssertLogRelMsgBreakStmt(expr, a, stmt) \
1388 if (RT_UNLIKELY(!(expr))) \
1389 { \
1390 RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1391 RTAssertLogRelMsg2(a); \
1392 RTAssertPanic(); \
1393 stmt; \
1394 break; \
1395 } else do {} while (0)
1396
1397/** @def AssertLogRelFailed
1398 * An assertion failed.
1399 * Strict builds will hit a breakpoint, non-strict will only do LogRel.
1400 */
1401#define AssertLogRelFailed() \
1402 do { \
1403 RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1404 RTAssertPanic(); \
1405 } while (0)
1406
1407/** @def AssertLogRelFailedReturn
1408 * An assertion failed.
1409 * Strict builds will hit a breakpoint, non-strict will only do LogRel.
1410 *
1411 * @param rc What is to be presented to return.
1412 */
1413#define AssertLogRelFailedReturn(rc) \
1414 do { \
1415 RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1416 RTAssertPanic(); \
1417 return (rc); \
1418 } while (0)
1419
1420/** @def AssertLogRelFailedReturnVoid
1421 * An assertion failed, hit a breakpoint and return.
1422 * Strict builds will hit a breakpoint, non-strict will only do LogRel.
1423 */
1424#define AssertLogRelFailedReturnVoid() \
1425 do { \
1426 RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1427 RTAssertPanic(); \
1428 return; \
1429 } while (0)
1430
1431/** @def AssertLogRelFailedBreak
1432 * An assertion failed, break.
1433 * Strict builds will hit a breakpoint, non-strict will only do LogRel.
1434 */
1435#define AssertLogRelFailedBreak() \
1436 if (1) \
1437 { \
1438 RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1439 RTAssertPanic(); \
1440 break; \
1441 } else do {} while (0)
1442
1443/** @def AssertLogRelFailedBreakStmt
1444 * An assertion failed, execute \a stmt and break.
1445 * Strict builds will hit a breakpoint, non-strict will only do LogRel.
1446 *
1447 * @param stmt Statement to execute before break.
1448 */
1449#define AssertLogRelFailedBreakStmt(stmt) \
1450 if (1) \
1451 { \
1452 RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1453 RTAssertPanic(); \
1454 stmt; \
1455 break; \
1456 } else do {} while (0)
1457
1458/** @def AssertLogRelMsgFailed
1459 * An assertion failed.
1460 * Strict builds will hit a breakpoint, non-strict will only do LogRel.
1461 *
1462 * @param a printf argument list (in parenthesis).
1463 */
1464#define AssertLogRelMsgFailed(a) \
1465 do { \
1466 RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1467 RTAssertLogRelMsg2(a); \
1468 RTAssertPanic(); \
1469 } while (0)
1470
1471/** @def AssertLogRelMsgFailedReturn
1472 * An assertion failed, return \a rc.
1473 * Strict builds will hit a breakpoint, non-strict will only do LogRel.
1474 *
1475 * @param a printf argument list (in parenthesis).
1476 * @param rc What is to be presented to return.
1477 */
1478#define AssertLogRelMsgFailedReturn(a, rc) \
1479 do { \
1480 RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1481 RTAssertLogRelMsg2(a); \
1482 RTAssertPanic(); \
1483 return (rc); \
1484 } while (0)
1485
1486/** @def AssertLogRelMsgFailedReturnVoid
1487 * An assertion failed, return void.
1488 * Strict builds will hit a breakpoint, non-strict will only do LogRel.
1489 *
1490 * @param a printf argument list (in parenthesis).
1491 */
1492#define AssertLogRelMsgFailedReturnVoid(a) \
1493 do { \
1494 RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1495 RTAssertLogRelMsg2(a); \
1496 RTAssertPanic(); \
1497 return; \
1498 } while (0)
1499
1500/** @def AssertLogRelMsgFailedBreak
1501 * An assertion failed, break.
1502 * Strict builds will hit a breakpoint, non-strict will only do LogRel.
1503 *
1504 * @param a printf argument list (in parenthesis).
1505 */
1506#define AssertLogRelMsgFailedBreak(a) \
1507 if (1)\
1508 { \
1509 RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1510 RTAssertLogRelMsg2(a); \
1511 RTAssertPanic(); \
1512 break; \
1513 } else do {} while (0)
1514
1515/** @def AssertLogRelMsgFailedBreakStmt
1516 * An assertion failed, execute \a stmt and break.
1517 * Strict builds will hit a breakpoint, non-strict will only do LogRel.
1518 *
1519 * @param a printf argument list (in parenthesis).
1520 * @param stmt Statement to execute before break.
1521 */
1522#define AssertLogRelMsgFailedBreakStmt(a, stmt) \
1523 if (1) \
1524 { \
1525 RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1526 RTAssertLogRelMsg2(a); \
1527 RTAssertPanic(); \
1528 stmt; \
1529 break; \
1530 } else do {} while (0)
1531
1532/** @} */
1533
1534
1535
1536/** @name Release Assertions
1537 *
1538 * These assertions are always enabled.
1539 * @{
1540 */
1541
1542/** @def RTAssertReleasePanic()
1543 * Invokes RTAssertShouldPanic and RTAssertDoPanic.
1544 *
1545 * It might seem odd that RTAssertShouldPanic is necessary when its result isn't
1546 * checked, but it's done since RTAssertShouldPanic is overrideable and might be
1547 * used to bail out before taking down the system (the VMMR0 case).
1548 */
1549#define RTAssertReleasePanic() do { RTAssertShouldPanic(); RTAssertDoPanic(); } while (0)
1550
1551
1552/** @def AssertRelease
1553 * Assert that an expression is true. If it's not hit a breakpoint.
1554 *
1555 * @param expr Expression which should be true.
1556 */
1557#define AssertRelease(expr) \
1558 do { \
1559 if (RT_UNLIKELY(!(expr))) \
1560 { \
1561 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1562 RTAssertReleasePanic(); \
1563 } \
1564 } while (0)
1565
1566/** @def AssertReleaseReturn
1567 * Assert that an expression is true, hit a breakpoint and return if it isn't.
1568 *
1569 * @param expr Expression which should be true.
1570 * @param rc What is to be presented to return.
1571 */
1572#define AssertReleaseReturn(expr, rc) \
1573 do { \
1574 if (RT_UNLIKELY(!(expr))) \
1575 { \
1576 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1577 RTAssertReleasePanic(); \
1578 return (rc); \
1579 } \
1580 } while (0)
1581
1582/** @def AssertReleaseReturnVoid
1583 * Assert that an expression is true, hit a breakpoint and return if it isn't.
1584 *
1585 * @param expr Expression which should be true.
1586 */
1587#define AssertReleaseReturnVoid(expr) \
1588 do { \
1589 if (RT_UNLIKELY(!(expr))) \
1590 { \
1591 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1592 RTAssertReleasePanic(); \
1593 return; \
1594 } \
1595 } while (0)
1596
1597
1598/** @def AssertReleaseBreak
1599 * Assert that an expression is true, hit a breakpoint and break if it isn't.
1600 *
1601 * @param expr Expression which should be true.
1602 */
1603#define AssertReleaseBreak(expr) \
1604 if { \
1605 if (RT_UNLIKELY(!(expr))) \
1606 { \
1607 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1608 RTAssertReleasePanic(); \
1609 break; \
1610 } \
1611 } else do {} while (0)
1612
1613/** @def AssertReleaseBreakStmt
1614 * Assert that an expression is true, hit a breakpoint and break if it isn't.
1615 *
1616 * @param expr Expression which should be true.
1617 * @param stmt Statement to execute before break in case of a failed assertion.
1618 */
1619#define AssertReleaseBreakStmt(expr, stmt) \
1620 if (RT_UNLIKELY(!(expr))) \
1621 { \
1622 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1623 RTAssertReleasePanic(); \
1624 stmt; \
1625 break; \
1626 } else do {} while (0)
1627
1628
1629/** @def AssertReleaseMsg
1630 * Assert that an expression is true, print the message and hit a breakpoint if it isn't.
1631 *
1632 * @param expr Expression which should be true.
1633 * @param a printf argument list (in parenthesis).
1634 */
1635#define AssertReleaseMsg(expr, a) \
1636 do { \
1637 if (RT_UNLIKELY(!(expr))) \
1638 { \
1639 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1640 RTAssertMsg2Weak a; \
1641 RTAssertReleasePanic(); \
1642 } \
1643 } while (0)
1644
1645/** @def AssertReleaseMsgReturn
1646 * Assert that an expression is true, print the message and hit a breakpoint and return if it isn't.
1647 *
1648 * @param expr Expression which should be true.
1649 * @param a printf argument list (in parenthesis).
1650 * @param rc What is to be presented to return.
1651 */
1652#define AssertReleaseMsgReturn(expr, a, rc) \
1653 do { \
1654 if (RT_UNLIKELY(!(expr))) \
1655 { \
1656 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1657 RTAssertMsg2Weak a; \
1658 RTAssertReleasePanic(); \
1659 return (rc); \
1660 } \
1661 } while (0)
1662
1663/** @def AssertReleaseMsgReturnVoid
1664 * Assert that an expression is true, print the message and hit a breakpoint and return if it isn't.
1665 *
1666 * @param expr Expression which should be true.
1667 * @param a printf argument list (in parenthesis).
1668 */
1669#define AssertReleaseMsgReturnVoid(expr, a) \
1670 do { \
1671 if (RT_UNLIKELY(!(expr))) \
1672 { \
1673 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1674 RTAssertMsg2Weak a; \
1675 RTAssertReleasePanic(); \
1676 return; \
1677 } \
1678 } while (0)
1679
1680
1681/** @def AssertReleaseMsgBreak
1682 * Assert that an expression is true, print the message and hit a breakpoint and break if it isn't.
1683 *
1684 * @param expr Expression which should be true.
1685 * @param a printf argument list (in parenthesis).
1686 */
1687#define AssertReleaseMsgBreak(expr, a) \
1688 if (RT_UNLIKELY(!(expr))) \
1689 { \
1690 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1691 RTAssertMsg2Weak a; \
1692 RTAssertReleasePanic(); \
1693 break; \
1694 } else do {} while (0)
1695
1696/** @def AssertReleaseMsgBreakStmt
1697 * Assert that an expression is true, print the message and hit a breakpoint and break if it isn't.
1698 *
1699 * @param expr Expression which should be true.
1700 * @param a printf argument list (in parenthesis).
1701 * @param stmt Statement to execute before break in case of a failed assertion.
1702 */
1703#define AssertReleaseMsgBreakStmt(expr, a, stmt) \
1704 if (RT_UNLIKELY(!(expr))) { \
1705 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1706 RTAssertMsg2Weak a; \
1707 RTAssertReleasePanic(); \
1708 stmt; \
1709 break; \
1710 } else do {} while (0)
1711
1712
1713/** @def AssertReleaseFailed
1714 * An assertion failed, hit a breakpoint.
1715 */
1716#define AssertReleaseFailed() \
1717 do { \
1718 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1719 RTAssertReleasePanic(); \
1720 } while (0)
1721
1722/** @def AssertReleaseFailedReturn
1723 * An assertion failed, hit a breakpoint and return.
1724 *
1725 * @param rc What is to be presented to return.
1726 */
1727#define AssertReleaseFailedReturn(rc) \
1728 do { \
1729 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1730 RTAssertReleasePanic(); \
1731 return (rc); \
1732 } while (0)
1733
1734/** @def AssertReleaseFailedReturnVoid
1735 * An assertion failed, hit a breakpoint and return.
1736 */
1737#define AssertReleaseFailedReturnVoid() \
1738 do { \
1739 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1740 RTAssertReleasePanic(); \
1741 return; \
1742 } while (0)
1743
1744
1745/** @def AssertReleaseFailedBreak
1746 * An assertion failed, hit a breakpoint and break.
1747 */
1748#define AssertReleaseFailedBreak() \
1749 if (1) { \
1750 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1751 RTAssertReleasePanic(); \
1752 break; \
1753 } else do {} while (0)
1754
1755/** @def AssertReleaseFailedBreakStmt
1756 * An assertion failed, hit a breakpoint and break.
1757 *
1758 * @param stmt Statement to execute before break.
1759 */
1760#define AssertReleaseFailedBreakStmt(stmt) \
1761 if (1) { \
1762 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1763 RTAssertReleasePanic(); \
1764 stmt; \
1765 break; \
1766 } else do {} while (0)
1767
1768
1769/** @def AssertReleaseMsgFailed
1770 * An assertion failed, print a message and hit a breakpoint.
1771 *
1772 * @param a printf argument list (in parenthesis).
1773 */
1774#define AssertReleaseMsgFailed(a) \
1775 do { \
1776 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1777 RTAssertMsg2Weak a; \
1778 RTAssertReleasePanic(); \
1779 } while (0)
1780
1781/** @def AssertReleaseMsgFailedReturn
1782 * An assertion failed, print a message, hit a breakpoint and return.
1783 *
1784 * @param a printf argument list (in parenthesis).
1785 * @param rc What is to be presented to return.
1786 */
1787#define AssertReleaseMsgFailedReturn(a, rc) \
1788 do { \
1789 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1790 RTAssertMsg2Weak a; \
1791 RTAssertReleasePanic(); \
1792 return (rc); \
1793 } while (0)
1794
1795/** @def AssertReleaseMsgFailedReturnVoid
1796 * An assertion failed, print a message, hit a breakpoint and return.
1797 *
1798 * @param a printf argument list (in parenthesis).
1799 */
1800#define AssertReleaseMsgFailedReturnVoid(a) \
1801 do { \
1802 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1803 RTAssertMsg2Weak a; \
1804 RTAssertReleasePanic(); \
1805 return; \
1806 } while (0)
1807
1808
1809/** @def AssertReleaseMsgFailedBreak
1810 * An assertion failed, print a message, hit a breakpoint and break.
1811 *
1812 * @param a printf argument list (in parenthesis).
1813 */
1814#define AssertReleaseMsgFailedBreak(a) \
1815 if (1) { \
1816 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1817 RTAssertMsg2Weak a; \
1818 RTAssertReleasePanic(); \
1819 break; \
1820 } else do {} while (0)
1821
1822/** @def AssertReleaseMsgFailedBreakStmt
1823 * An assertion failed, print a message, hit a breakpoint and break.
1824 *
1825 * @param a printf argument list (in parenthesis).
1826 * @param stmt Statement to execute before break.
1827 */
1828#define AssertReleaseMsgFailedBreakStmt(a, stmt) \
1829 if (1) { \
1830 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1831 RTAssertMsg2Weak a; \
1832 RTAssertReleasePanic(); \
1833 stmt; \
1834 break; \
1835 } else do {} while (0)
1836
1837/** @} */
1838
1839
1840
1841/** @name Fatal Assertions
1842 * These are similar to release assertions except that you cannot ignore them in
1843 * any way, they will loop for ever if RTAssertDoPanic returns.
1844 *
1845 * @{
1846 */
1847
1848/** @def AssertFatal
1849 * Assert that an expression is true. If it's not hit a breakpoint (for ever).
1850 *
1851 * @param expr Expression which should be true.
1852 */
1853#define AssertFatal(expr) \
1854 do { \
1855 if (RT_UNLIKELY(!(expr))) \
1856 for (;;) \
1857 { \
1858 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1859 RTAssertReleasePanic(); \
1860 } \
1861 } while (0)
1862
1863/** @def AssertFatalMsg
1864 * Assert that an expression is true, print the message and hit a breakpoint (for ever) if it isn't.
1865 *
1866 * @param expr Expression which should be true.
1867 * @param a printf argument list (in parenthesis).
1868 */
1869#define AssertFatalMsg(expr, a) \
1870 do { \
1871 if (RT_UNLIKELY(!(expr))) \
1872 for (;;) \
1873 { \
1874 RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1875 RTAssertMsg2Weak a; \
1876 RTAssertReleasePanic(); \
1877 } \
1878 } while (0)
1879
1880/** @def AssertFatalFailed
1881 * An assertion failed, hit a breakpoint (for ever).
1882 */
1883#define AssertFatalFailed() \
1884 do { \
1885 for (;;) \
1886 { \
1887 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1888 RTAssertReleasePanic(); \
1889 } \
1890 } while (0)
1891
1892/** @def AssertFatalMsgFailed
1893 * An assertion failed, print a message and hit a breakpoint (for ever).
1894 *
1895 * @param a printf argument list (in parenthesis).
1896 */
1897#define AssertFatalMsgFailed(a) \
1898 do { \
1899 for (;;) \
1900 { \
1901 RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \
1902 RTAssertMsg2Weak a; \
1903 RTAssertReleasePanic(); \
1904 } \
1905 } while (0)
1906
1907/** @} */
1908
1909
1910
1911/** @name Convenience Assertions Macros
1912 * @{
1913 */
1914
1915/** @def AssertRC
1916 * Asserts a iprt status code successful.
1917 *
1918 * On failure it will print info about the rc and hit a breakpoint.
1919 *
1920 * @param rc iprt status code.
1921 * @remark rc is referenced multiple times. In release mode is NOREF()'ed.
1922 */
1923#define AssertRC(rc) AssertMsgRC(rc, ("%Rra\n", (rc)))
1924
1925/** @def AssertRCReturn
1926 * Asserts a iprt status code successful, bitch (RT_STRICT mode only) and return if it isn't.
1927 *
1928 * @param rc iprt status code.
1929 * @param rcRet What is to be presented to return.
1930 * @remark rc is referenced multiple times. In release mode is NOREF()'ed.
1931 */
1932#define AssertRCReturn(rc, rcRet) AssertMsgRCReturn(rc, ("%Rra\n", (rc)), rcRet)
1933
1934/** @def AssertRCReturnVoid
1935 * Asserts a iprt status code successful, bitch (RT_STRICT mode only) and return if it isn't.
1936 *
1937 * @param rc iprt status code.
1938 * @remark rc is referenced multiple times. In release mode is NOREF()'ed.
1939 */
1940#define AssertRCReturnVoid(rc) AssertMsgRCReturnVoid(rc, ("%Rra\n", (rc)))
1941
1942/** @def AssertRCBreak
1943 * Asserts a iprt status code successful, bitch (RT_STRICT mode only) and break if it isn't.
1944 *
1945 * @param rc iprt status code.
1946 * @remark rc is referenced multiple times. In release mode is NOREF()'ed.
1947 */
1948#define AssertRCBreak(rc) AssertMsgRCBreak(rc, ("%Rra\n", (rc)))
1949
1950/** @def AssertRCBreakStmt
1951 * Asserts a iprt status code successful, bitch (RT_STRICT mode only) and break if it isn't.
1952 *
1953 * @param rc iprt status code.
1954 * @param stmt Statement to execute before break in case of a failed assertion.
1955 * @remark rc is referenced multiple times. In release mode is NOREF()'ed.
1956 */
1957#define AssertRCBreakStmt(rc, stmt) AssertMsgRCBreakStmt(rc, ("%Rra\n", (rc)), stmt)
1958
1959/** @def AssertMsgRC
1960 * Asserts a iprt status code successful.
1961 *
1962 * It prints a custom message and hits a breakpoint on FAILURE.
1963 *
1964 * @param rc iprt status code.
1965 * @param msg printf argument list (in parenthesis).
1966 * @remark rc is referenced multiple times. In release mode is NOREF()'ed.
1967 */
1968#define AssertMsgRC(rc, msg) \
1969 do { AssertMsg(RT_SUCCESS_NP(rc), msg); NOREF(rc); } while (0)
1970
1971/** @def AssertMsgRCReturn
1972 * Asserts a iprt status code successful and if it's not return the specified status code.
1973 *
1974 * If RT_STRICT is defined the message will be printed and a breakpoint hit before it returns
1975 *
1976 * @param rc iprt status code.
1977 * @param msg printf argument list (in parenthesis).
1978 * @param rcRet What is to be presented to return.
1979 * @remark rc is referenced multiple times. In release mode is NOREF()'ed.
1980 */
1981#define AssertMsgRCReturn(rc, msg, rcRet) \
1982 do { AssertMsgReturn(RT_SUCCESS_NP(rc), msg, rcRet); NOREF(rc); } while (0)
1983
1984/** @def AssertMsgRCReturnVoid
1985 * Asserts a iprt status code successful and if it's not return.
1986 *
1987 * If RT_STRICT is defined the message will be printed and a breakpoint hit before it returns
1988 *
1989 * @param rc iprt status code.
1990 * @param msg printf argument list (in parenthesis).
1991 * @remark rc is referenced multiple times. In release mode is NOREF()'ed.
1992 */
1993#define AssertMsgRCReturnVoid(rc, msg) \
1994 do { AssertMsgReturnVoid(RT_SUCCESS_NP(rc), msg); NOREF(rc); } while (0)
1995
1996/** @def AssertMsgRCBreak
1997 * Asserts a iprt status code successful and if it's not break.
1998 *
1999 * If RT_STRICT is defined the message will be printed and a breakpoint hit before it breaks
2000 *
2001 * @param rc iprt status code.
2002 * @param msg printf argument list (in parenthesis).
2003 * @remark rc is referenced multiple times. In release mode is NOREF()'ed.
2004 */
2005#define AssertMsgRCBreak(rc, msg) \
2006 if (1) { AssertMsgBreak(RT_SUCCESS(rc), msg); NOREF(rc); } else do {} while (0)
2007
2008/** @def AssertMsgRCBreakStmt
2009 * Asserts a iprt status code successful and break if it's not.
2010 *
2011 * If RT_STRICT is defined the message will be printed and a breakpoint hit before it returns
2012 *
2013 * @param rc iprt status code.
2014 * @param msg printf argument list (in parenthesis).
2015 * @param stmt Statement to execute before break in case of a failed assertion.
2016 * @remark rc is referenced multiple times. In release mode is NOREF()'ed.
2017 */
2018#define AssertMsgRCBreakStmt(rc, msg, stmt) \
2019 if (1) { AssertMsgBreakStmt(RT_SUCCESS_NP(rc), msg, stmt); NOREF(rc); } else do {} while (0)
2020
2021/** @def AssertRCSuccess
2022 * Asserts an iprt status code equals VINF_SUCCESS.
2023 *
2024 * On failure it will print info about the rc and hit a breakpoint.
2025 *
2026 * @param rc iprt status code.
2027 * @remark rc is referenced multiple times. In release mode is NOREF()'ed.
2028 */
2029#define AssertRCSuccess(rc) AssertMsg((rc) == VINF_SUCCESS, ("%Rra\n", (rc)))
2030
2031/** @def AssertRCSuccessReturn
2032 * Asserts that an iprt status code equals VINF_SUCCESS, bitch (RT_STRICT mode only) and return if it isn't.
2033 *
2034 * @param rc iprt status code.
2035 * @param rcRet What is to be presented to return.
2036 * @remark rc is referenced multiple times. In release mode is NOREF()'ed.
2037 */
2038#define AssertRCSuccessReturn(rc, rcRet) AssertMsgReturn((rc) == VINF_SUCCESS, ("%Rra\n", (rc)), rcRet)
2039
2040/** @def AssertRCSuccessReturnVoid
2041 * Asserts that an iprt status code equals VINF_SUCCESS, bitch (RT_STRICT mode only) and return if it isn't.
2042 *
2043 * @param rc iprt status code.
2044 * @remark rc is referenced multiple times. In release mode is NOREF()'ed.
2045 */
2046#define AssertRCSuccessReturnVoid(rc) AssertMsgReturnVoid((rc) == VINF_SUCCESS, ("%Rra\n", (rc)))
2047
2048/** @def AssertRCSuccessBreak
2049 * Asserts that an iprt status code equals VINF_SUCCESS, bitch (RT_STRICT mode only) and break if it isn't.
2050 *
2051 * @param rc iprt status code.
2052 * @remark rc is referenced multiple times. In release mode is NOREF()'ed.
2053 */
2054#define AssertRCSuccessBreak(rc) AssertMsgBreak((rc) == VINF_SUCCESS, ("%Rra\n", (rc)))
2055
2056/** @def AssertRCSuccessBreakStmt
2057 * Asserts that an iprt status code equals VINF_SUCCESS, bitch (RT_STRICT mode only) and break if it isn't.
2058 *
2059 * @param rc iprt status code.
2060 * @param stmt Statement to execute before break in case of a failed assertion.
2061 * @remark rc is referenced multiple times. In release mode is NOREF()'ed.
2062 */
2063#define AssertRCSuccessBreakStmt(rc, stmt) AssertMsgBreakStmt((rc) == VINF_SUCCESS, ("%Rra\n", (rc)), stmt)
2064
2065
2066/** @def AssertLogRelRC
2067 * Asserts a iprt status code successful.
2068 *
2069 * @param rc iprt status code.
2070 * @remark rc is referenced multiple times.
2071 */
2072#define AssertLogRelRC(rc) AssertLogRelMsgRC(rc, ("%Rra\n", (rc)))
2073
2074/** @def AssertLogRelRCReturn
2075 * Asserts a iprt status code successful, returning \a rc if it isn't.
2076 *
2077 * @param rc iprt status code.
2078 * @param rcRet What is to be presented to return.
2079 * @remark rc is referenced multiple times.
2080 */
2081#define AssertLogRelRCReturn(rc, rcRet) AssertLogRelMsgRCReturn(rc, ("%Rra\n", (rc)), rcRet)
2082
2083/** @def AssertLogRelRCReturnVoid
2084 * Asserts a iprt status code successful, returning (void) if it isn't.
2085 *
2086 * @param rc iprt status code.
2087 * @remark rc is referenced multiple times.
2088 */
2089#define AssertLogRelRCReturnVoid(rc) AssertLogRelMsgRCReturnVoid(rc, ("%Rra\n", (rc)))
2090
2091/** @def AssertLogRelRCBreak
2092 * Asserts a iprt status code successful, breaking if it isn't.
2093 *
2094 * @param rc iprt status code.
2095 * @remark rc is referenced multiple times.
2096 */
2097#define AssertLogRelRCBreak(rc) AssertLogRelMsgRCBreak(rc, ("%Rra\n", (rc)))
2098
2099/** @def AssertLogRelRCBreakStmt
2100 * Asserts a iprt status code successful, execute \a statement and break if it isn't.
2101 *
2102 * @param rc iprt status code.
2103 * @param stmt Statement to execute before break in case of a failed assertion.
2104 * @remark rc is referenced multiple times.
2105 */
2106#define AssertLogRelRCBreakStmt(rc, stmt) AssertLogRelMsgRCBreakStmt(rc, ("%Rra\n", (rc)), stmt)
2107
2108/** @def AssertLogRelMsgRC
2109 * Asserts a iprt status code successful.
2110 *
2111 * @param rc iprt status code.
2112 * @param msg printf argument list (in parenthesis).
2113 * @remark rc is referenced multiple times.
2114 */
2115#define AssertLogRelMsgRC(rc, msg) AssertLogRelMsg(RT_SUCCESS_NP(rc), msg)
2116
2117/** @def AssertLogRelMsgRCReturn
2118 * Asserts a iprt status code successful.
2119 *
2120 * @param rc iprt status code.
2121 * @param msg printf argument list (in parenthesis).
2122 * @param rcRet What is to be presented to return.
2123 * @remark rc is referenced multiple times.
2124 */
2125#define AssertLogRelMsgRCReturn(rc, msg, rcRet) AssertLogRelMsgReturn(RT_SUCCESS_NP(rc), msg, rcRet)
2126
2127/** @def AssertLogRelMsgRCReturnVoid
2128 * Asserts a iprt status code successful.
2129 *
2130 * @param rc iprt status code.
2131 * @param msg printf argument list (in parenthesis).
2132 * @remark rc is referenced multiple times.
2133 */
2134#define AssertLogRelMsgRCReturnVoid(rc, msg) AssertLogRelMsgReturnVoid(RT_SUCCESS_NP(rc), msg)
2135
2136/** @def AssertLogRelMsgRCBreak
2137 * Asserts a iprt status code successful.
2138 *
2139 * @param rc iprt status code.
2140 * @param msg printf argument list (in parenthesis).
2141 * @remark rc is referenced multiple times.
2142 */
2143#define AssertLogRelMsgRCBreak(rc, msg) AssertLogRelMsgBreak(RT_SUCCESS(rc), msg)
2144
2145/** @def AssertLogRelMsgRCBreakStmt
2146 * Asserts a iprt status code successful, execute \a stmt and break if it isn't.
2147 *
2148 * @param rc iprt status code.
2149 * @param msg printf argument list (in parenthesis).
2150 * @param stmt Statement to execute before break in case of a failed assertion.
2151 * @remark rc is referenced multiple times.
2152 */
2153#define AssertLogRelMsgRCBreakStmt(rc, msg, stmt) AssertLogRelMsgBreakStmt(RT_SUCCESS_NP(rc), msg, stmt)
2154
2155/** @def AssertLogRelRCSuccess
2156 * Asserts that an iprt status code equals VINF_SUCCESS.
2157 *
2158 * @param rc iprt status code.
2159 * @remark rc is referenced multiple times.
2160 */
2161#define AssertLogRelRCSuccess(rc) AssertLogRelMsg((rc) == VINF_SUCCESS, ("%Rra\n", (rc)))
2162
2163/** @def AssertLogRelRCSuccessReturn
2164 * Asserts that an iprt status code equals VINF_SUCCESS.
2165 *
2166 * @param rc iprt status code.
2167 * @param rcRet What is to be presented to return.
2168 * @remark rc is referenced multiple times.
2169 */
2170#define AssertLogRelRCSuccessReturn(rc, rcRet) AssertLogRelMsgReturn((rc) == VINF_SUCCESS, ("%Rra\n", (rc)), rcRet)
2171
2172/** @def AssertLogRelRCSuccessReturnVoid
2173 * Asserts that an iprt status code equals VINF_SUCCESS.
2174 *
2175 * @param rc iprt status code.
2176 * @remark rc is referenced multiple times.
2177 */
2178#define AssertLogRelRCSuccessReturnVoid(rc) AssertLogRelMsgReturnVoid((rc) == VINF_SUCCESS, ("%Rra\n", (rc)))
2179
2180/** @def AssertLogRelRCSuccessBreak
2181 * Asserts that an iprt status code equals VINF_SUCCESS.
2182 *
2183 * @param rc iprt status code.
2184 * @remark rc is referenced multiple times.
2185 */
2186#define AssertLogRelRCSuccessBreak(rc) AssertLogRelMsgBreak((rc) == VINF_SUCCESS, ("%Rra\n", (rc)))
2187
2188/** @def AssertLogRelRCSuccessBreakStmt
2189 * Asserts that an iprt status code equals VINF_SUCCESS.
2190 *
2191 * @param rc iprt status code.
2192 * @param stmt Statement to execute before break in case of a failed assertion.
2193 * @remark rc is referenced multiple times.
2194 */
2195#define AssertLogRelRCSuccessBreakStmt(rc, stmt) AssertLogRelMsgBreakStmt((rc) == VINF_SUCCESS, ("%Rra\n", (rc)), stmt)
2196
2197
2198/** @def AssertReleaseRC
2199 * Asserts a iprt status code successful.
2200 *
2201 * On failure information about the error will be printed and a breakpoint hit.
2202 *
2203 * @param rc iprt status code.
2204 * @remark rc is referenced multiple times.
2205 */
2206#define AssertReleaseRC(rc) AssertReleaseMsgRC(rc, ("%Rra\n", (rc)))
2207
2208/** @def AssertReleaseRCReturn
2209 * Asserts a iprt status code successful, returning if it isn't.
2210 *
2211 * On failure information about the error will be printed, a breakpoint hit
2212 * and finally returning from the function if the breakpoint is somehow ignored.
2213 *
2214 * @param rc iprt status code.
2215 * @param rcRet What is to be presented to return.
2216 * @remark rc is referenced multiple times.
2217 */
2218#define AssertReleaseRCReturn(rc, rcRet) AssertReleaseMsgRCReturn(rc, ("%Rra\n", (rc)), rcRet)
2219
2220/** @def AssertReleaseRCReturnVoid
2221 * Asserts a iprt status code successful, returning if it isn't.
2222 *
2223 * On failure information about the error will be printed, a breakpoint hit
2224 * and finally returning from the function if the breakpoint is somehow ignored.
2225 *
2226 * @param rc iprt status code.
2227 * @remark rc is referenced multiple times.
2228 */
2229#define AssertReleaseRCReturnVoid(rc) AssertReleaseMsgRCReturnVoid(rc, ("%Rra\n", (rc)))
2230
2231/** @def AssertReleaseRCBreak
2232 * Asserts a iprt status code successful, breaking if it isn't.
2233 *
2234 * On failure information about the error will be printed, a breakpoint hit
2235 * and finally breaking the current statement if the breakpoint is somehow ignored.
2236 *
2237 * @param rc iprt status code.
2238 * @remark rc is referenced multiple times.
2239 */
2240#define AssertReleaseRCBreak(rc) AssertReleaseMsgRCBreak(rc, ("%Rra\n", (rc)))
2241
2242/** @def AssertReleaseRCBreakStmt
2243 * Asserts a iprt status code successful, break if it isn't.
2244 *
2245 * On failure information about the error will be printed, a breakpoint hit
2246 * and finally the break statement will be issued if the breakpoint is somehow ignored.
2247 *
2248 * @param rc iprt status code.
2249 * @param stmt Statement to execute before break in case of a failed assertion.
2250 * @remark rc is referenced multiple times.
2251 */
2252#define AssertReleaseRCBreakStmt(rc, stmt) AssertReleaseMsgRCBreakStmt(rc, ("%Rra\n", (rc)), stmt)
2253
2254/** @def AssertReleaseMsgRC
2255 * Asserts a iprt status code successful.
2256 *
2257 * On failure a custom message is printed and a breakpoint is hit.
2258 *
2259 * @param rc iprt status code.
2260 * @param msg printf argument list (in parenthesis).
2261 * @remark rc is referenced multiple times.
2262 */
2263#define AssertReleaseMsgRC(rc, msg) AssertReleaseMsg(RT_SUCCESS_NP(rc), msg)
2264
2265/** @def AssertReleaseMsgRCReturn
2266 * Asserts a iprt status code successful.
2267 *
2268 * On failure a custom message is printed, a breakpoint is hit, and finally
2269 * returning from the function if the breakpoint is somehow ignored.
2270 *
2271 * @param rc iprt status code.
2272 * @param msg printf argument list (in parenthesis).
2273 * @param rcRet What is to be presented to return.
2274 * @remark rc is referenced multiple times.
2275 */
2276#define AssertReleaseMsgRCReturn(rc, msg, rcRet) AssertReleaseMsgReturn(RT_SUCCESS_NP(rc), msg, rcRet)
2277
2278/** @def AssertReleaseMsgRCReturnVoid
2279 * Asserts a iprt status code successful.
2280 *
2281 * On failure a custom message is printed, a breakpoint is hit, and finally
2282 * returning from the function if the breakpoint is somehow ignored.
2283 *
2284 * @param rc iprt status code.
2285 * @param msg printf argument list (in parenthesis).
2286 * @remark rc is referenced multiple times.
2287 */
2288#define AssertReleaseMsgRCReturnVoid(rc, msg) AssertReleaseMsgReturnVoid(RT_SUCCESS_NP(rc), msg)
2289
2290/** @def AssertReleaseMsgRCBreak
2291 * Asserts a iprt status code successful.
2292 *
2293 * On failure a custom message is printed, a breakpoint is hit, and finally
2294 * breaking the current status if the breakpoint is somehow ignored.
2295 *
2296 * @param rc iprt status code.
2297 * @param msg printf argument list (in parenthesis).
2298 * @remark rc is referenced multiple times.
2299 */
2300#define AssertReleaseMsgRCBreak(rc, msg) AssertReleaseMsgBreak(RT_SUCCESS(rc), msg)
2301
2302/** @def AssertReleaseMsgRCBreakStmt
2303 * Asserts a iprt status code successful.
2304 *
2305 * On failure a custom message is printed, a breakpoint is hit, and finally
2306 * the break statement is issued if the breakpoint is somehow ignored.
2307 *
2308 * @param rc iprt status code.
2309 * @param msg printf argument list (in parenthesis).
2310 * @param stmt Statement to execute before break in case of a failed assertion.
2311 * @remark rc is referenced multiple times.
2312 */
2313#define AssertReleaseMsgRCBreakStmt(rc, msg, stmt) AssertReleaseMsgBreakStmt(RT_SUCCESS_NP(rc), msg, stmt)
2314
2315/** @def AssertReleaseRCSuccess
2316 * Asserts that an iprt status code equals VINF_SUCCESS.
2317 *
2318 * On failure information about the error will be printed and a breakpoint hit.
2319 *
2320 * @param rc iprt status code.
2321 * @remark rc is referenced multiple times.
2322 */
2323#define AssertReleaseRCSuccess(rc) AssertReleaseMsg((rc) == VINF_SUCCESS, ("%Rra\n", (rc)))
2324
2325/** @def AssertReleaseRCSuccessReturn
2326 * Asserts that an iprt status code equals VINF_SUCCESS.
2327 *
2328 * On failure information about the error will be printed, a breakpoint hit
2329 * and finally returning from the function if the breakpoint is somehow ignored.
2330 *
2331 * @param rc iprt status code.
2332 * @param rcRet What is to be presented to return.
2333 * @remark rc is referenced multiple times.
2334 */
2335#define AssertReleaseRCSuccessReturn(rc, rcRet) AssertReleaseMsgReturn((rc) == VINF_SUCCESS, ("%Rra\n", (rc)), rcRet)
2336
2337/** @def AssertReleaseRCSuccessReturnVoid
2338 * Asserts that an iprt status code equals VINF_SUCCESS.
2339 *
2340 * On failure information about the error will be printed, a breakpoint hit
2341 * and finally returning from the function if the breakpoint is somehow ignored.
2342 *
2343 * @param rc iprt status code.
2344 * @remark rc is referenced multiple times.
2345 */
2346#define AssertReleaseRCSuccessReturnVoid(rc) AssertReleaseMsgReturnVoid((rc) == VINF_SUCCESS, ("%Rra\n", (rc)))
2347
2348/** @def AssertReleaseRCSuccessBreak
2349 * Asserts that an iprt status code equals VINF_SUCCESS.
2350 *
2351 * On failure information about the error will be printed, a breakpoint hit
2352 * and finally breaking the current statement if the breakpoint is somehow ignored.
2353 *
2354 * @param rc iprt status code.
2355 * @remark rc is referenced multiple times.
2356 */
2357#define AssertReleaseRCSuccessBreak(rc) AssertReleaseMsgBreak((rc) == VINF_SUCCESS, ("%Rra\n", (rc)))
2358
2359/** @def AssertReleaseRCSuccessBreakStmt
2360 * Asserts that an iprt status code equals VINF_SUCCESS.
2361 *
2362 * On failure information about the error will be printed, a breakpoint hit
2363 * and finally the break statement will be issued if the breakpoint is somehow ignored.
2364 *
2365 * @param rc iprt status code.
2366 * @param stmt Statement to execute before break in case of a failed assertion.
2367 * @remark rc is referenced multiple times.
2368 */
2369#define AssertReleaseRCSuccessBreakStmt(rc, stmt) AssertReleaseMsgBreakStmt((rc) == VINF_SUCCESS, ("%Rra\n", (rc)), stmt)
2370
2371
2372/** @def AssertFatalRC
2373 * Asserts a iprt status code successful.
2374 *
2375 * On failure information about the error will be printed and a breakpoint hit.
2376 *
2377 * @param rc iprt status code.
2378 * @remark rc is referenced multiple times.
2379 */
2380#define AssertFatalRC(rc) AssertFatalMsgRC(rc, ("%Rra\n", (rc)))
2381
2382/** @def AssertReleaseMsgRC
2383 * Asserts a iprt status code successful.
2384 *
2385 * On failure a custom message is printed and a breakpoint is hit.
2386 *
2387 * @param rc iprt status code.
2388 * @param msg printf argument list (in parenthesis).
2389 * @remark rc is referenced multiple times.
2390 */
2391#define AssertFatalMsgRC(rc, msg) AssertFatalMsg(RT_SUCCESS_NP(rc), msg)
2392
2393/** @def AssertFatalRCSuccess
2394 * Asserts that an iprt status code equals VINF_SUCCESS.
2395 *
2396 * On failure information about the error will be printed and a breakpoint hit.
2397 *
2398 * @param rc iprt status code.
2399 * @remark rc is referenced multiple times.
2400 */
2401#define AssertFatalRCSuccess(rc) AssertFatalMsg((rc) == VINF_SUCCESS, ("%Rra\n", (rc)))
2402
2403
2404/** @def AssertPtr
2405 * Asserts that a pointer is valid.
2406 *
2407 * @param pv The pointer.
2408 */
2409#define AssertPtr(pv) AssertMsg(VALID_PTR(pv), ("%p\n", (pv)))
2410
2411/** @def AssertPtrReturn
2412 * Asserts that a pointer is valid.
2413 *
2414 * @param pv The pointer.
2415 * @param rcRet What is to be presented to return.
2416 */
2417#define AssertPtrReturn(pv, rcRet) AssertMsgReturn(VALID_PTR(pv), ("%p\n", (pv)), rcRet)
2418
2419/** @def AssertPtrReturnVoid
2420 * Asserts that a pointer is valid.
2421 *
2422 * @param pv The pointer.
2423 */
2424#define AssertPtrReturnVoid(pv) AssertMsgReturnVoid(VALID_PTR(pv), ("%p\n", (pv)))
2425
2426/** @def AssertPtrBreak
2427 * Asserts that a pointer is valid.
2428 *
2429 * @param pv The pointer.
2430 */
2431#define AssertPtrBreak(pv) AssertMsgBreak(VALID_PTR(pv), ("%p\n", (pv)))
2432
2433/** @def AssertPtrBreakStmt
2434 * Asserts that a pointer is valid.
2435 *
2436 * @param pv The pointer.
2437 * @param stmt Statement to execute before break in case of a failed assertion.
2438 */
2439#define AssertPtrBreakStmt(pv, stmt) AssertMsgBreakStmt(VALID_PTR(pv), ("%p\n", (pv)), stmt)
2440
2441/** @def AssertPtrNull
2442 * Asserts that a pointer is valid or NULL.
2443 *
2444 * @param pv The pointer.
2445 */
2446#define AssertPtrNull(pv) AssertMsg(VALID_PTR(pv) || (pv) == NULL, ("%p\n", (pv)))
2447
2448/** @def AssertPtrNullReturn
2449 * Asserts that a pointer is valid or NULL.
2450 *
2451 * @param pv The pointer.
2452 * @param rcRet What is to be presented to return.
2453 */
2454#define AssertPtrNullReturn(pv, rcRet) AssertMsgReturn(VALID_PTR(pv) || (pv) == NULL, ("%p\n", (pv)), rcRet)
2455
2456/** @def AssertPtrNullReturnVoid
2457 * Asserts that a pointer is valid or NULL.
2458 *
2459 * @param pv The pointer.
2460 */
2461#define AssertPtrNullReturnVoid(pv) AssertMsgReturnVoid(VALID_PTR(pv) || (pv) == NULL, ("%p\n", (pv)))
2462
2463/** @def AssertPtrNullBreak
2464 * Asserts that a pointer is valid or NULL.
2465 *
2466 * @param pv The pointer.
2467 */
2468#define AssertPtrNullBreak(pv) AssertMsgBreak(VALID_PTR(pv) || (pv) == NULL, ("%p\n", (pv)))
2469
2470/** @def AssertPtrNullBreakStmt
2471 * Asserts that a pointer is valid or NULL.
2472 *
2473 * @param pv The pointer.
2474 * @param stmt Statement to execute before break in case of a failed assertion.
2475 */
2476#define AssertPtrNullBreakStmt(pv, stmt) AssertMsgBreakStmt(VALID_PTR(pv) || (pv) == NULL, ("%p\n", (pv)), stmt)
2477
2478/** @def AssertGCPhys32
2479 * Asserts that the high dword of a physical address is zero
2480 *
2481 * @param GCPhys The address (RTGCPHYS).
2482 */
2483#define AssertGCPhys32(GCPhys) AssertMsg(VALID_PHYS32(GCPhys), ("%RGp\n", (RTGCPHYS)(GCPhys)))
2484
2485/** @def AssertGCPtr32
2486 * Asserts that the high dword of a physical address is zero
2487 *
2488 * @param GCPtr The address (RTGCPTR).
2489 */
2490#if GC_ARCH_BITS == 32
2491# define AssertGCPtr32(GCPtr) do { } while (0)
2492#else
2493# define AssertGCPtr32(GCPtr) AssertMsg(!((GCPtr) & UINT64_C(0xffffffff00000000)), ("%RGv\n", GCPtr))
2494#endif
2495
2496/** @def AssertForEach
2497 * Equivalent to Assert for each value of the variable from the starting
2498 * value to the finishing one.
2499 *
2500 * @param var Name of the counter variable.
2501 * @param vartype Type of the counter variable.
2502 * @param first Lowest inclusive value of the counter variable.
2503 * This must be free from side effects.
2504 * @param end Highest exclusive value of the counter variable.
2505 * This must be free from side effects.
2506 * @param expr Expression which should be true for each value of @a var.
2507 */
2508#define AssertForEach(var, vartype, first, end, expr) \
2509 do { \
2510 vartype var; \
2511 Assert((first) == (first) && (end) == (end)); /* partial check for side effects */ \
2512 for (var = (first); var < (end); var++) \
2513 AssertMsg(expr, ("%s = %#RX64 (%RI64)", #var, (uint64_t)var, (int64_t)var)); \
2514 } while (0)
2515
2516/** @} */
2517
2518/** @} */
2519
2520#endif
2521
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette