/** @file | |
* IPRT - Assertions. | |
*/ | |
/* | |
* Copyright (C) 2006-2016 Oracle Corporation | |
* | |
* This file is part of VirtualBox Open Source Edition (OSE), as | |
* available from http://www.virtualbox.org. This file is free software; | |
* you can redistribute it and/or modify it under the terms of the GNU | |
* General Public License (GPL) as published by the Free Software | |
* Foundation, in version 2 as it comes in the "COPYING" file of the | |
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the | |
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. | |
* | |
* The contents of this file may alternatively be used under the terms | |
* of the Common Development and Distribution License Version 1.0 | |
* (CDDL) only, as it comes in the "COPYING.CDDL" file of the | |
* VirtualBox OSE distribution, in which case the provisions of the | |
* CDDL are applicable instead of those of the GPL. | |
* | |
* You may elect to license modified versions of this file under the | |
* terms and conditions of either the GPL or the CDDL or both. | |
*/ | |
#ifndef ___iprt_assert_h | |
#define ___iprt_assert_h | |
#include <iprt/cdefs.h> | |
#include <iprt/types.h> | |
#include <iprt/stdarg.h> | |
/** @defgroup grp_rt_assert Assert - Assertions | |
* @ingroup grp_rt | |
* | |
* Assertions are generally used to check preconditions and other | |
* assumptions. Sometimes it is also used to catch odd errors or errors | |
* that one would like to inspect in the debugger. They should not be | |
* used for errors that happen frequently. | |
* | |
* IPRT provides a host of assertion macros, so many that it can be a bit | |
* overwhelming at first. Don't despair, there is a system (surprise). | |
* | |
* First there are four families of assertions: | |
* - Assert - The normal strict build only assertions. | |
* - AssertLogRel - Calls LogRel() in non-strict builds, otherwise like Assert. | |
* - AssertRelease - Triggers in all builds. | |
* - AssertFatal - Triggers in all builds and cannot be continued. | |
* | |
* Then there are variations wrt to argument list and behavior on failure: | |
* - Msg - Custom RTStrPrintf-like message with the assertion message. | |
* - Return - Return the specific rc on failure. | |
* - ReturnVoid - Return (void) on failure. | |
* - Break - Break (out of switch/loop) on failure. | |
* - Stmt - Execute the specified statement(s) on failure. | |
* - RC - Assert RT_SUCCESS. | |
* - RCSuccess - Assert VINF_SUCCESS. | |
* | |
* In addition there is a very special family AssertCompile that can be | |
* used for some limited compile-time checking, like structure sizes and member | |
* alignment. This family doesn't have the same variations. | |
* | |
* | |
* @remarks As you might have noticed, the macros don't follow the | |
* coding guidelines wrt to macros supposedly being all uppercase | |
* and underscored. For various reasons they don't, and nobody | |
* has complained yet. Wonder why... :-) | |
* | |
* @remarks Each project has its own specific guidelines on how to use | |
* assertions, so the above is just trying to give you the general idea | |
* from the IPRT point of view. | |
* | |
* @{ | |
*/ | |
RT_C_DECLS_BEGIN | |
/** | |
* The 1st part of an assert message. | |
* | |
* @param pszExpr Expression. Can be NULL. | |
* @param uLine Location line number. | |
* @param pszFile Location file name. | |
* @param pszFunction Location function name. | |
*/ | |
RTDECL(void) RTAssertMsg1(const char *pszExpr, unsigned uLine, const char *pszFile, const char *pszFunction); | |
/** | |
* Weak version of RTAssertMsg1 that can be overridden locally in a module to | |
* modify, redirect or otherwise mess with the assertion output. | |
* | |
* @copydoc RTAssertMsg1 | |
*/ | |
RTDECL(void) RTAssertMsg1Weak(const char *pszExpr, unsigned uLine, const char *pszFile, const char *pszFunction); | |
/** | |
* The 2nd (optional) part of an assert message. | |
* | |
* @param pszFormat Printf like format string. | |
* @param ... Arguments to that string. | |
*/ | |
RTDECL(void) RTAssertMsg2(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2); | |
/** | |
* Weak version of RTAssertMsg2 that forwards to RTAssertMsg2WeakV. | |
* | |
* There is not need to override this, check out RTAssertMsg2WeakV instead! | |
* | |
* @copydoc RTAssertMsg2 | |
*/ | |
RTDECL(void) RTAssertMsg2Weak(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2); | |
/** | |
* The 2nd (optional) part of an assert message. | |
* | |
* @param pszFormat Printf like format string. | |
* @param va Arguments to that string. | |
*/ | |
RTDECL(void) RTAssertMsg2V(const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(1, 0); | |
/** | |
* Weak version of RTAssertMsg2V that can be overridden locally in a module to | |
* modify, redirect or otherwise mess with the assertion output. | |
* | |
* @copydoc RTAssertMsg2V | |
*/ | |
RTDECL(void) RTAssertMsg2WeakV(const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(1, 0); | |
/** | |
* Additional information which should be appended to the 2nd part of an | |
* assertion message. | |
* | |
* @param pszFormat Printf like format string. | |
* @param ... Arguments to that string. | |
*/ | |
RTDECL(void) RTAssertMsg2Add(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2); | |
/** | |
* Weak version of RTAssertMsg2Add that forwards to RTAssertMsg2AddWeakV. | |
* | |
* There is not need to override this, check out RTAssertMsg2AddWeakV instead! | |
* | |
* @copydoc RTAssertMsg2Add | |
*/ | |
RTDECL(void) RTAssertMsg2AddWeak(const char *pszFormat, ...) RT_IPRT_FORMAT_ATTR(1, 2); | |
/** | |
* Additional information which should be appended to the 2nd part of an | |
* assertion message. | |
* | |
* @param pszFormat Printf like format string. | |
* @param va Arguments to that string. | |
*/ | |
RTDECL(void) RTAssertMsg2AddV(const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(1, 0); | |
/** | |
* Weak version of RTAssertMsg2AddV that can be overridden locally in a module | |
* to modify, redirect or otherwise mess with the assertion output. | |
* | |
* @copydoc RTAssertMsg2AddV | |
*/ | |
RTDECL(void) RTAssertMsg2AddWeakV(const char *pszFormat, va_list va) RT_IPRT_FORMAT_ATTR(1, 0); | |
#ifdef IN_RING0 | |
/** | |
* Panics the system as the result of a fail assertion. | |
*/ | |
RTR0DECL(void) RTR0AssertPanicSystem(void); | |
#endif /* IN_RING0 */ | |
/** | |
* Overridable function that decides whether assertions executes the panic | |
* (breakpoint) or not. | |
* | |
* The generic implementation will return true. | |
* | |
* @returns true if the breakpoint should be hit, false if it should be ignored. | |
* | |
* @remark The RTDECL() makes this a bit difficult to override on Windows. So, | |
* you'll have to use RTASSERT_HAVE_SHOULD_PANIC or | |
* RTASSERT_HAVE_SHOULD_PANIC_PRIVATE there to control the kind of | |
* prototype. | |
*/ | |
#if !defined(RTASSERT_HAVE_SHOULD_PANIC) && !defined(RTASSERT_HAVE_SHOULD_PANIC_PRIVATE) | |
RTDECL(bool) RTAssertShouldPanic(void); | |
#elif defined(RTASSERT_HAVE_SHOULD_PANIC_PRIVATE) | |
bool RTAssertShouldPanic(void); | |
#else | |
DECLEXPORT(bool) RTCALL RTAssertShouldPanic(void); | |
#endif | |
/** | |
* Controls whether the assertions should be quiet or noisy (default). | |
* | |
* @returns The old setting. | |
* @param fQuiet The new setting. | |
*/ | |
RTDECL(bool) RTAssertSetQuiet(bool fQuiet); | |
/** | |
* Are assertions quiet or noisy? | |
* | |
* @returns True if they are quiet, false if noisy. | |
*/ | |
RTDECL(bool) RTAssertAreQuiet(void); | |
/** | |
* Makes the assertions panic (default) or not. | |
* | |
* @returns The old setting. | |
* @param fPanic The new setting. | |
*/ | |
RTDECL(bool) RTAssertSetMayPanic(bool fPanic); | |
/** | |
* Can assertion panic. | |
* | |
* @returns True if they can, false if not. | |
*/ | |
RTDECL(bool) RTAssertMayPanic(void); | |
/** @name Globals for crash analysis | |
* @remarks This is the full potential set, it | |
* @{ | |
*/ | |
/** The last assert message, 1st part. */ | |
extern RTDATADECL(char) g_szRTAssertMsg1[1024]; | |
/** The last assert message, 2nd part. */ | |
extern RTDATADECL(char) g_szRTAssertMsg2[4096]; | |
/** The last assert message, expression. */ | |
extern RTDATADECL(const char * volatile) g_pszRTAssertExpr; | |
/** The last assert message, file name. */ | |
extern RTDATADECL(const char * volatile) g_pszRTAssertFile; | |
/** The last assert message, line number. */ | |
extern RTDATADECL(uint32_t volatile) g_u32RTAssertLine; | |
/** The last assert message, function name. */ | |
extern RTDATADECL(const char * volatile) g_pszRTAssertFunction; | |
/** @} */ | |
RT_C_DECLS_END | |
/** @def RTAssertDebugBreak() | |
* Debugger breakpoint instruction. | |
* | |
* @remarks This macro does not depend on RT_STRICT. | |
*/ | |
#define RTAssertDebugBreak() do { RT_BREAKPOINT(); } while (0) | |
/** @name Compile time assertions. | |
* | |
* These assertions are used to check structure sizes, member/size alignments | |
* and similar compile time expressions. | |
* | |
* @{ | |
*/ | |
/** | |
* RTASSERTTYPE is the type the AssertCompile() macro redefines. | |
* It has no other function and shouldn't be used. | |
* Visual C++ uses this. | |
*/ | |
typedef int RTASSERTTYPE[1]; | |
/** | |
* RTASSERTVAR is the type the AssertCompile() macro redefines. | |
* It has no other function and shouldn't be used. | |
* GCC uses this. | |
*/ | |
#ifdef __GNUC__ | |
RT_C_DECLS_BEGIN | |
#endif | |
extern int RTASSERTVAR[1]; | |
#ifdef __GNUC__ | |
RT_C_DECLS_END | |
#endif | |
/** @def RTASSERT_HAVE_STATIC_ASSERT | |
* Indicates that the compiler implements static_assert(expr, msg). | |
*/ | |
#ifdef _MSC_VER | |
# if _MSC_VER >= 1600 && defined(__cplusplus) | |
# define RTASSERT_HAVE_STATIC_ASSERT | |
# endif | |
#endif | |
#if defined(__GNUC__) && defined(__GXX_EXPERIMENTAL_CXX0X__) | |
# define RTASSERT_HAVE_STATIC_ASSERT | |
#endif | |
#ifdef DOXYGEN_RUNNING | |
# define RTASSERT_HAVE_STATIC_ASSERT | |
#endif | |
/** @def AssertCompileNS | |
* Asserts that a compile-time expression is true. If it's not break the build. | |
* | |
* This differs from AssertCompile in that it accepts some more expressions | |
* than what C++0x allows - NS = Non-standard. | |
* | |
* @param expr Expression which should be true. | |
*/ | |
#ifdef __GNUC__ | |
# define AssertCompileNS(expr) extern int RTASSERTVAR[1] __attribute__((unused)), RTASSERTVAR[(expr) ? 1 : 0] __attribute__((unused)) | |
#elif defined(__IBMC__) || defined(__IBMCPP__) | |
# define AssertCompileNS(expr) extern int RTASSERTVAR[(expr) ? 1 : 0] | |
#else | |
# define AssertCompileNS(expr) typedef int RTASSERTTYPE[(expr) ? 1 : 0] | |
#endif | |
/** @def AssertCompile | |
* Asserts that a C++0x compile-time expression is true. If it's not break the | |
* build. | |
* @param expr Expression which should be true. | |
*/ | |
#ifdef RTASSERT_HAVE_STATIC_ASSERT | |
# define AssertCompile(expr) static_assert(!!(expr), #expr) | |
#else | |
# define AssertCompile(expr) AssertCompileNS(expr) | |
#endif | |
/** @def RTASSERT_OFFSET_OF() | |
* A offsetof() macro suitable for compile time assertions. | |
* Both GCC v4 and VisualAge for C++ v3.08 has trouble using RT_OFFSETOF. | |
*/ | |
#if defined(__GNUC__) | |
# if __GNUC__ >= 4 | |
# define RTASSERT_OFFSET_OF(a_Type, a_Member) __builtin_offsetof(a_Type, a_Member) | |
# else | |
# define RTASSERT_OFFSET_OF(a_Type, a_Member) RT_OFFSETOF(a_Type, a_Member) | |
# endif | |
#elif (defined(__IBMC__) || defined(__IBMCPP__)) && defined(RT_OS_OS2) | |
# define RTASSERT_OFFSET_OF(a_Type, a_Member) __offsetof(a_Type, a_Member) | |
#else | |
# define RTASSERT_OFFSET_OF(a_Type, a_Member) RT_OFFSETOF(a_Type, a_Member) | |
#endif | |
/** @def AssertCompileSize | |
* Asserts a size at compile. | |
* @param type The type. | |
* @param size The expected type size. | |
*/ | |
#define AssertCompileSize(type, size) \ | |
AssertCompile(sizeof(type) == (size)) | |
/** @def AssertCompileSizeAlignment | |
* Asserts a size alignment at compile. | |
* @param type The type. | |
* @param align The size alignment to assert. | |
*/ | |
#define AssertCompileSizeAlignment(type, align) \ | |
AssertCompile(!(sizeof(type) & ((align) - 1))) | |
/** @def AssertCompileMemberSize | |
* Asserts a member offset alignment at compile. | |
* @param type The type. | |
* @param member The member. | |
* @param size The member size to assert. | |
*/ | |
#define AssertCompileMemberSize(type, member, size) \ | |
AssertCompile(RT_SIZEOFMEMB(type, member) == (size)) | |
/** @def AssertCompileMemberSizeAlignment | |
* Asserts a member size alignment at compile. | |
* @param type The type. | |
* @param member The member. | |
* @param align The member size alignment to assert. | |
*/ | |
#define AssertCompileMemberSizeAlignment(type, member, align) \ | |
AssertCompile(!(RT_SIZEOFMEMB(type, member) & ((align) - 1))) | |
/** @def AssertCompileMemberAlignment | |
* Asserts a member offset alignment at compile. | |
* @param type The type. | |
* @param member The member. | |
* @param align The member offset alignment to assert. | |
*/ | |
#define AssertCompileMemberAlignment(type, member, align) \ | |
AssertCompile(!(RTASSERT_OFFSET_OF(type, member) & ((align) - 1))) | |
/** @def AssertCompileMemberOffset | |
* Asserts an offset of a structure member at compile. | |
* @param type The type. | |
* @param member The member. | |
* @param off The expected offset. | |
*/ | |
#define AssertCompileMemberOffset(type, member, off) \ | |
AssertCompile(RTASSERT_OFFSET_OF(type, member) == (off)) | |
/** @def AssertCompile2MemberOffsets | |
* Asserts that two (sub-structure) members in union have the same offset. | |
* @param type The type. | |
* @param member1 The first member. | |
* @param member2 The second member. | |
*/ | |
#define AssertCompile2MemberOffsets(type, member1, member2) \ | |
AssertCompile(RTASSERT_OFFSET_OF(type, member1) == RTASSERT_OFFSET_OF(type, member2)) | |
/** @def AssertCompileAdjacentMembers | |
* Asserts that two structure members are adjacent. | |
* @param type The type. | |
* @param member1 The first member. | |
* @param member2 The second member. | |
*/ | |
#define AssertCompileAdjacentMembers(type, member1, member2) \ | |
AssertCompile(RTASSERT_OFFSET_OF(type, member1) + RT_SIZEOFMEMB(type, member1) == RTASSERT_OFFSET_OF(type, member2)) | |
/** @def AssertCompileMembersAtSameOffset | |
* Asserts that members of two different structures are at the same offset. | |
* @param type1 The first type. | |
* @param member1 The first member. | |
* @param type2 The second type. | |
* @param member2 The second member. | |
*/ | |
#define AssertCompileMembersAtSameOffset(type1, member1, type2, member2) \ | |
AssertCompile(RTASSERT_OFFSET_OF(type1, member1) == RTASSERT_OFFSET_OF(type2, member2)) | |
/** @def AssertCompileMembersSameSize | |
* Asserts that members of two different structures have the same size. | |
* @param type1 The first type. | |
* @param member1 The first member. | |
* @param type2 The second type. | |
* @param member2 The second member. | |
*/ | |
#define AssertCompileMembersSameSize(type1, member1, type2, member2) \ | |
AssertCompile(RT_SIZEOFMEMB(type1, member1) == RT_SIZEOFMEMB(type2, member2)) | |
/** @def AssertCompileMembersSameSizeAndOffset | |
* Asserts that members of two different structures have the same size and are | |
* at the same offset. | |
* @param type1 The first type. | |
* @param member1 The first member. | |
* @param type2 The second type. | |
* @param member2 The second member. | |
*/ | |
#define AssertCompileMembersSameSizeAndOffset(type1, member1, type2, member2) \ | |
AssertCompile( RTASSERT_OFFSET_OF(type1, member1) == RTASSERT_OFFSET_OF(type2, member2) \ | |
&& RT_SIZEOFMEMB(type1, member1) == RT_SIZEOFMEMB(type2, member2)) | |
/** @} */ | |
/** @name Assertions | |
* | |
* These assertions will only trigger when RT_STRICT is defined. When it is | |
* undefined they will all be no-ops and generate no code. | |
* | |
* @{ | |
*/ | |
/** @def RTASSERT_QUIET | |
* This can be defined to shut up the messages for a file where this would be | |
* problematic because the message printing code path passes thru it. | |
* @internal */ | |
#ifdef DOXYGEN_RUNNING | |
# define RTASSERT_QUIET | |
#endif | |
#if defined(RTASSERT_QUIET) && !defined(DOXYGEN_RUNNING) | |
# define RTAssertMsg1Weak(pszExpr, uLine, pszfile, pszFunction) \ | |
do { } while (0) | |
# define RTAssertMsg2Weak if (1) {} else RTAssertMsg2Weak | |
#endif | |
/** @def RTAssertDoPanic | |
* Raises an assertion panic appropriate to the current context. | |
* @remarks This macro does not depend on RT_STRICT. | |
*/ | |
#if defined(IN_RING0) \ | |
&& (defined(RT_OS_DARWIN) || defined(RT_OS_HAIKU) || defined(RT_OS_SOLARIS)) | |
# define RTAssertDoPanic() RTR0AssertPanicSystem() | |
#else | |
# define RTAssertDoPanic() RTAssertDebugBreak() | |
#endif | |
/** @def AssertBreakpoint() | |
* Assertion Breakpoint. | |
* @deprecated Use RTAssertPanic or RTAssertDebugBreak instead. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertBreakpoint() RTAssertDebugBreak() | |
#else | |
# define AssertBreakpoint() do { } while (0) | |
#endif | |
/** @def RTAssertPanic() | |
* If RT_STRICT is defined this macro will invoke RTAssertDoPanic if | |
* RTAssertShouldPanic returns true. If RT_STRICT isn't defined it won't do any | |
* thing. | |
*/ | |
#if defined(RT_STRICT) && !defined(RTASSERT_DONT_PANIC) | |
# define RTAssertPanic() do { if (RTAssertShouldPanic()) RTAssertDoPanic(); } while (0) | |
#else | |
# define RTAssertPanic() do { } while (0) | |
#endif | |
/** @def Assert | |
* Assert that an expression is true. If false, hit breakpoint. | |
* @param expr Expression which should be true. | |
*/ | |
#ifdef RT_STRICT | |
# define Assert(expr) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, RT_GCC_EXTENSION __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
} \ | |
} while (0) | |
#else | |
# define Assert(expr) do { } while (0) | |
#endif | |
/** @def AssertStmt | |
* Assert that an expression is true. If false, hit breakpoint and execute the | |
* statement. | |
* @param expr Expression which should be true. | |
* @param stmt Statement to execute on failure. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertStmt(expr, stmt) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, RT_GCC_EXTENSION __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
stmt; \ | |
} \ | |
} while (0) | |
#else | |
# define AssertStmt(expr, stmt) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
stmt; \ | |
} \ | |
} while (0) | |
#endif | |
/** @def AssertReturn | |
* Assert that an expression is true and returns if it isn't. | |
* In RT_STRICT mode it will hit a breakpoint before returning. | |
* | |
* @param expr Expression which should be true. | |
* @param rc What is to be presented to return. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertReturn(expr, rc) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, RT_GCC_EXTENSION __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
return (rc); \ | |
} \ | |
} while (0) | |
#else | |
# define AssertReturn(expr, rc) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
return (rc); \ | |
} while (0) | |
#endif | |
/** @def AssertReturnStmt | |
* Assert that an expression is true, if it isn't execute the given statement | |
* and return rc. | |
* | |
* In RT_STRICT mode it will hit a breakpoint before executing the statement and | |
* returning. | |
* | |
* @param expr Expression which should be true. | |
* @param stmt Statement to execute before returning on failure. | |
* @param rc What is to be presented to return. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertReturnStmt(expr, stmt, rc) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
stmt; \ | |
return (rc); \ | |
} \ | |
} while (0) | |
#else | |
# define AssertReturnStmt(expr, stmt, rc) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
stmt; \ | |
return (rc); \ | |
} \ | |
} while (0) | |
#endif | |
/** @def AssertReturnVoid | |
* Assert that an expression is true and returns if it isn't. | |
* In RT_STRICT mode it will hit a breakpoint before returning. | |
* | |
* @param expr Expression which should be true. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertReturnVoid(expr) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, RT_GCC_EXTENSION __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
return; \ | |
} \ | |
} while (0) | |
#else | |
# define AssertReturnVoid(expr) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
return; \ | |
} while (0) | |
#endif | |
/** @def AssertReturnVoidStmt | |
* Assert that an expression is true, if it isn't execute the given statement | |
* and return. | |
* | |
* In RT_STRICT mode it will hit a breakpoint before returning. | |
* | |
* @param expr Expression which should be true. | |
* @param stmt Statement to execute before returning on failure. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertReturnVoidStmt(expr, stmt) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
stmt; \ | |
return; \ | |
} \ | |
} while (0) | |
#else | |
# define AssertReturnVoidStmt(expr, stmt) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
stmt; \ | |
return; \ | |
} \ | |
} while (0) | |
#endif | |
/** @def AssertBreak | |
* Assert that an expression is true and breaks if it isn't. | |
* In RT_STRICT mode it will hit a breakpoint before breaking. | |
* | |
* @param expr Expression which should be true. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertBreak(expr) \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else if (1) \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
break; \ | |
} else do {} while (0) | |
#else | |
# define AssertBreak(expr) \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
break | |
#endif | |
/** @def AssertContinue | |
* Assert that an expression is true and continue if it isn't. | |
* In RT_STRICT mode it will hit a breakpoint before continuing. | |
* | |
* @param expr Expression which should be true. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertContinue(expr) \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else if (1) \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
continue; \ | |
} else do {} while (0) | |
#else | |
# define AssertContinue(expr) \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
continue | |
#endif | |
/** @def AssertBreakStmt | |
* Assert that an expression is true and breaks if it isn't. | |
* In RT_STRICT mode it will hit a breakpoint before doing break. | |
* | |
* @param expr Expression which should be true. | |
* @param stmt Statement to execute before break in case of a failed assertion. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertBreakStmt(expr, stmt) \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else if (1) \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
stmt; \ | |
break; \ | |
} else do {} while (0) | |
#else | |
# define AssertBreakStmt(expr, stmt) \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else if (1) \ | |
{ \ | |
stmt; \ | |
break; \ | |
} else do {} while (0) | |
#endif | |
/** @def AssertMsg | |
* Assert that an expression is true. If it's not print message and hit breakpoint. | |
* @param expr Expression which should be true. | |
* @param a printf argument list (in parenthesis). | |
*/ | |
#ifdef RT_STRICT | |
# define AssertMsg(expr, a) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, RT_GCC_EXTENSION __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertPanic(); \ | |
} \ | |
} while (0) | |
#else | |
# define AssertMsg(expr, a) do { } while (0) | |
#endif | |
/** @def AssertMsgStmt | |
* Assert that an expression is true. If it's not print message and hit | |
* breakpoint and execute the statement. | |
* | |
* @param expr Expression which should be true. | |
* @param a printf argument list (in parenthesis). | |
* @param stmt Statement to execute in case of a failed assertion. | |
* | |
* @remarks The expression and statement will be evaluated in all build types. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertMsgStmt(expr, a, stmt) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertPanic(); \ | |
stmt; \ | |
} \ | |
} while (0) | |
#else | |
# define AssertMsgStmt(expr, a, stmt) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
stmt; \ | |
} \ | |
} while (0) | |
#endif | |
/** @def AssertMsgReturn | |
* Assert that an expression is true and returns if it isn't. | |
* In RT_STRICT mode it will hit a breakpoint before returning. | |
* | |
* @param expr Expression which should be true. | |
* @param a printf argument list (in parenthesis). | |
* @param rc What is to be presented to return. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertMsgReturn(expr, a, rc) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, RT_GCC_EXTENSION __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertPanic(); \ | |
return (rc); \ | |
} \ | |
} while (0) | |
#else | |
# define AssertMsgReturn(expr, a, rc) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
return (rc); \ | |
} while (0) | |
#endif | |
/** @def AssertMsgReturnStmt | |
* Assert that an expression is true, if it isn't execute the statement and | |
* return. | |
* | |
* In RT_STRICT mode it will hit a breakpoint before returning. | |
* | |
* @param expr Expression which should be true. | |
* @param a printf argument list (in parenthesis). | |
* @param stmt Statement to execute before returning in case of a failed | |
* assertion. | |
* @param rc What is to be presented to return. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertMsgReturnStmt(expr, a, stmt, rc) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertPanic(); \ | |
stmt; \ | |
return (rc); \ | |
} \ | |
} while (0) | |
#else | |
# define AssertMsgReturnStmt(expr, a, stmt, rc) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
stmt; \ | |
return (rc); \ | |
} \ | |
} while (0) | |
#endif | |
/** @def AssertMsgReturnVoid | |
* Assert that an expression is true and returns if it isn't. | |
* In RT_STRICT mode it will hit a breakpoint before returning. | |
* | |
* @param expr Expression which should be true. | |
* @param a printf argument list (in parenthesis). | |
*/ | |
#ifdef RT_STRICT | |
# define AssertMsgReturnVoid(expr, a) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, RT_GCC_EXTENSION __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertPanic(); \ | |
return; \ | |
} \ | |
} while (0) | |
#else | |
# define AssertMsgReturnVoid(expr, a) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
return; \ | |
} while (0) | |
#endif | |
/** @def AssertMsgReturnVoidStmt | |
* Assert that an expression is true, if it isn't execute the statement and | |
* return. | |
* | |
* In RT_STRICT mode it will hit a breakpoint before returning. | |
* | |
* @param expr Expression which should be true. | |
* @param a printf argument list (in parenthesis). | |
* @param stmt Statement to execute before return in case of a failed assertion. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertMsgReturnVoidStmt(expr, a, stmt) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertPanic(); \ | |
stmt; \ | |
return; \ | |
} \ | |
} while (0) | |
#else | |
# define AssertMsgReturnVoidStmt(expr, a, stmt) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
stmt; \ | |
return; \ | |
} \ | |
} while (0) | |
#endif | |
/** @def AssertMsgBreak | |
* Assert that an expression is true and breaks if it isn't. | |
* In RT_STRICT mode it will hit a breakpoint before returning. | |
* | |
* @param expr Expression which should be true. | |
* @param a printf argument list (in parenthesis). | |
*/ | |
#ifdef RT_STRICT | |
# define AssertMsgBreak(expr, a) \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else if (1) \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertPanic(); \ | |
break; \ | |
} else do {} while (0) | |
#else | |
# define AssertMsgBreak(expr, a) \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
break | |
#endif | |
/** @def AssertMsgBreakStmt | |
* Assert that an expression is true and breaks if it isn't. | |
* In RT_STRICT mode it will hit a breakpoint before doing break. | |
* | |
* @param expr Expression which should be true. | |
* @param a printf argument list (in parenthesis). | |
* @param stmt Statement to execute before break in case of a failed assertion. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertMsgBreakStmt(expr, a, stmt) \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else if (1) \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertPanic(); \ | |
stmt; \ | |
break; \ | |
} else do {} while (0) | |
#else | |
# define AssertMsgBreakStmt(expr, a, stmt) \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else if (1) \ | |
{ \ | |
stmt; \ | |
break; \ | |
} else do {} while (0) | |
#endif | |
/** @def AssertFailed | |
* An assertion failed, hit breakpoint. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertFailed() \ | |
do { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, RT_GCC_EXTENSION __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
} while (0) | |
#else | |
# define AssertFailed() do { } while (0) | |
#endif | |
/** @def AssertFailedStmt | |
* An assertion failed, hit breakpoint and execute statement. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertFailedStmt(stmt) \ | |
do { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, RT_GCC_EXTENSION __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
stmt; \ | |
} while (0) | |
#else | |
# define AssertFailedStmt(stmt) do { stmt; } while (0) | |
#endif | |
/** @def AssertFailedReturn | |
* An assertion failed, hit breakpoint (RT_STRICT mode only) and return. | |
* | |
* @param rc The rc to return. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertFailedReturn(rc) \ | |
do { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
return (rc); \ | |
} while (0) | |
#else | |
# define AssertFailedReturn(rc) \ | |
do { \ | |
return (rc); \ | |
} while (0) | |
#endif | |
/** @def AssertFailedReturnStmt | |
* An assertion failed, hit breakpoint (RT_STRICT mode only), execute a | |
* statement and return a value. | |
* | |
* @param stmt The statement to execute before returning. | |
* @param rc The value to return. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertFailedReturnStmt(stmt, rc) \ | |
do { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
stmt; \ | |
return (rc); \ | |
} while (0) | |
#else | |
# define AssertFailedReturnStmt(stmt, rc) \ | |
do { \ | |
stmt; \ | |
return (rc); \ | |
} while (0) | |
#endif | |
/** @def AssertFailedReturnVoid | |
* An assertion failed, hit breakpoint (RT_STRICT mode only) and return. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertFailedReturnVoid() \ | |
do { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
return; \ | |
} while (0) | |
#else | |
# define AssertFailedReturnVoid() \ | |
do { \ | |
return; \ | |
} while (0) | |
#endif | |
/** @def AssertFailedReturnVoidStmt | |
* An assertion failed, hit breakpoint (RT_STRICT mode only), execute a | |
* statement and return. | |
* | |
* @param stmt The statement to execute before returning. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertFailedReturnVoidStmt(stmt) \ | |
do { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
stmt; \ | |
return; \ | |
} while (0) | |
#else | |
# define AssertFailedReturnVoidStmt(stmt) \ | |
do { \ | |
stmt; \ | |
return; \ | |
} while (0) | |
#endif | |
/** @def AssertFailedBreak | |
* An assertion failed, hit breakpoint (RT_STRICT mode only) and break. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertFailedBreak() \ | |
if (1) { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
break; \ | |
} else do {} while (0) | |
#else | |
# define AssertFailedBreak() \ | |
if (1) \ | |
break; \ | |
else do {} while (0) | |
#endif | |
/** @def AssertFailedBreakStmt | |
* An assertion failed, hit breakpoint (RT_STRICT mode only), execute | |
* the given statement and break. | |
* | |
* @param stmt Statement to execute before break. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertFailedBreakStmt(stmt) \ | |
if (1) { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
stmt; \ | |
break; \ | |
} else do {} while (0) | |
#else | |
# define AssertFailedBreakStmt(stmt) \ | |
if (1) { \ | |
stmt; \ | |
break; \ | |
} else do {} while (0) | |
#endif | |
/** @def AssertMsgFailed | |
* An assertion failed print a message and a hit breakpoint. | |
* | |
* @param a printf argument list (in parenthesis). | |
*/ | |
#ifdef RT_STRICT | |
# define AssertMsgFailed(a) \ | |
do { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, RT_GCC_EXTENSION __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertPanic(); \ | |
} while (0) | |
#else | |
# define AssertMsgFailed(a) do { } while (0) | |
#endif | |
/** @def AssertMsgFailedReturn | |
* An assertion failed, hit breakpoint with message (RT_STRICT mode only) and return. | |
* | |
* @param a printf argument list (in parenthesis). | |
* @param rc What is to be presented to return. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertMsgFailedReturn(a, rc) \ | |
do { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertPanic(); \ | |
return (rc); \ | |
} while (0) | |
#else | |
# define AssertMsgFailedReturn(a, rc) \ | |
do { \ | |
return (rc); \ | |
} while (0) | |
#endif | |
/** @def AssertMsgFailedReturnVoid | |
* An assertion failed, hit breakpoint with message (RT_STRICT mode only) and return. | |
* | |
* @param a printf argument list (in parenthesis). | |
*/ | |
#ifdef RT_STRICT | |
# define AssertMsgFailedReturnVoid(a) \ | |
do { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertPanic(); \ | |
return; \ | |
} while (0) | |
#else | |
# define AssertMsgFailedReturnVoid(a) \ | |
do { \ | |
return; \ | |
} while (0) | |
#endif | |
/** @def AssertMsgFailedBreak | |
* An assertion failed, hit breakpoint with message (RT_STRICT mode only) and break. | |
* | |
* @param a printf argument list (in parenthesis). | |
*/ | |
#ifdef RT_STRICT | |
# define AssertMsgFailedBreak(a) \ | |
if (1) { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertPanic(); \ | |
break; \ | |
} else do {} while (0) | |
#else | |
# define AssertMsgFailedBreak(a) \ | |
if (1) \ | |
break; \ | |
else do {} while (0) | |
#endif | |
/** @def AssertMsgFailedBreakStmt | |
* An assertion failed, hit breakpoint (RT_STRICT mode only), execute | |
* the given statement and break. | |
* | |
* @param a printf argument list (in parenthesis). | |
* @param stmt Statement to execute before break. | |
*/ | |
#ifdef RT_STRICT | |
# define AssertMsgFailedBreakStmt(a, stmt) \ | |
if (1) { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertPanic(); \ | |
stmt; \ | |
break; \ | |
} else do {} while (0) | |
#else | |
# define AssertMsgFailedBreakStmt(a, stmt) \ | |
if (1) { \ | |
stmt; \ | |
break; \ | |
} else do {} while (0) | |
#endif | |
/** @} */ | |
/** @name Release Log Assertions | |
* | |
* These assertions will work like normal strict assertion when RT_STRICT is | |
* defined and LogRel statements when RT_STRICT is undefined. Typically used for | |
* things which shouldn't go wrong, but when it does you'd like to know one way | |
* or the other. | |
* | |
* @{ | |
*/ | |
/** @def RTAssertLogRelMsg1 | |
* RTAssertMsg1Weak (strict builds) / LogRel wrapper (non-strict). | |
*/ | |
#ifdef RT_STRICT | |
# define RTAssertLogRelMsg1(pszExpr, iLine, pszFile, pszFunction) \ | |
RTAssertMsg1Weak(pszExpr, iLine, pszFile, pszFunction) | |
#else | |
# define RTAssertLogRelMsg1(pszExpr, iLine, pszFile, pszFunction) \ | |
LogRel(("AssertLogRel %s(%d) %s: %s\n",\ | |
(pszFile), (iLine), (pszFunction), (pszExpr) )) | |
#endif | |
/** @def RTAssertLogRelMsg2 | |
* RTAssertMsg2Weak (strict builds) / LogRel wrapper (non-strict). | |
*/ | |
#ifdef RT_STRICT | |
# define RTAssertLogRelMsg2(a) RTAssertMsg2Weak a | |
#else | |
# define RTAssertLogRelMsg2(a) LogRel(a) | |
#endif | |
/** @def AssertLogRel | |
* Assert that an expression is true. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
* | |
* @param expr Expression which should be true. | |
*/ | |
#define AssertLogRel(expr) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
} \ | |
} while (0) | |
/** @def AssertLogRelReturn | |
* Assert that an expression is true, return \a rc if it isn't. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
* | |
* @param expr Expression which should be true. | |
* @param rc What is to be presented to return. | |
*/ | |
#define AssertLogRelReturn(expr, rc) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
return (rc); \ | |
} \ | |
} while (0) | |
/** @def AssertLogRelReturnVoid | |
* Assert that an expression is true, return void if it isn't. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
* | |
* @param expr Expression which should be true. | |
*/ | |
#define AssertLogRelReturnVoid(expr) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
return; \ | |
} \ | |
} while (0) | |
/** @def AssertLogRelBreak | |
* Assert that an expression is true, break if it isn't. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
* | |
* @param expr Expression which should be true. | |
*/ | |
#define AssertLogRelBreak(expr) \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else if (1) \ | |
{ \ | |
RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
break; \ | |
} \ | |
else do {} while (0) | |
/** @def AssertLogRelBreakStmt | |
* Assert that an expression is true, execute \a stmt and break if it isn't. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
* | |
* @param expr Expression which should be true. | |
* @param stmt Statement to execute before break in case of a failed assertion. | |
*/ | |
#define AssertLogRelBreakStmt(expr, stmt) \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else if (1) \ | |
{ \ | |
RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
stmt; \ | |
break; \ | |
} else do {} while (0) | |
/** @def AssertLogRelMsg | |
* Assert that an expression is true. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
* | |
* @param expr Expression which should be true. | |
* @param a printf argument list (in parenthesis). | |
*/ | |
#define AssertLogRelMsg(expr, a) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else\ | |
{ \ | |
RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertLogRelMsg2(a); \ | |
RTAssertPanic(); \ | |
} \ | |
} while (0) | |
/** @def AssertLogRelMsgStmt | |
* Assert that an expression is true, execute \a stmt and break if it isn't | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
* | |
* @param expr Expression which should be true. | |
* @param a printf argument list (in parenthesis). | |
* @param stmt Statement to execute in case of a failed assertion. | |
*/ | |
#define AssertLogRelMsgStmt(expr, a, stmt) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else\ | |
{ \ | |
RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertLogRelMsg2(a); \ | |
RTAssertPanic(); \ | |
stmt; \ | |
} \ | |
} while (0) | |
/** @def AssertLogRelMsgReturn | |
* Assert that an expression is true, return \a rc if it isn't. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
* | |
* @param expr Expression which should be true. | |
* @param a printf argument list (in parenthesis). | |
* @param rc What is to be presented to return. | |
*/ | |
#define AssertLogRelMsgReturn(expr, a, rc) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else\ | |
{ \ | |
RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertLogRelMsg2(a); \ | |
RTAssertPanic(); \ | |
return (rc); \ | |
} \ | |
} while (0) | |
/** @def AssertLogRelMsgReturnStmt | |
* Assert that an expression is true, execute @a stmt and return @a rcRet if it | |
* isn't. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
* | |
* @param expr Expression which should be true. | |
* @param a printf argument list (in parenthesis). | |
* @param stmt Statement to execute before returning in case of a failed | |
* assertion. | |
* @param rcRet What is to be presented to return. | |
*/ | |
#define AssertLogRelMsgReturnStmt(expr, a, stmt, rcRet) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else\ | |
{ \ | |
RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertLogRelMsg2(a); \ | |
RTAssertPanic(); \ | |
stmt; \ | |
return (rcRet); \ | |
} \ | |
} while (0) | |
/** @def AssertLogRelMsgReturnVoid | |
* Assert that an expression is true, return (void) if it isn't. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
* | |
* @param expr Expression which should be true. | |
* @param a printf argument list (in parenthesis). | |
*/ | |
#define AssertLogRelMsgReturnVoid(expr, a) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else\ | |
{ \ | |
RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertLogRelMsg2(a); \ | |
RTAssertPanic(); \ | |
return; \ | |
} \ | |
} while (0) | |
/** @def AssertLogRelMsgBreak | |
* Assert that an expression is true, break if it isn't. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
* | |
* @param expr Expression which should be true. | |
* @param a printf argument list (in parenthesis). | |
*/ | |
#define AssertLogRelMsgBreak(expr, a) \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else if (1) \ | |
{ \ | |
RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertLogRelMsg2(a); \ | |
RTAssertPanic(); \ | |
break; \ | |
} \ | |
else do {} while (0) | |
/** @def AssertLogRelMsgBreakStmt | |
* Assert that an expression is true, execute \a stmt and break if it isn't. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
* | |
* @param expr Expression which should be true. | |
* @param a printf argument list (in parenthesis). | |
* @param stmt Statement to execute before break in case of a failed assertion. | |
*/ | |
#define AssertLogRelMsgBreakStmt(expr, a, stmt) \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else if (1) \ | |
{ \ | |
RTAssertLogRelMsg1(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertLogRelMsg2(a); \ | |
RTAssertPanic(); \ | |
stmt; \ | |
break; \ | |
} else do {} while (0) | |
/** @def AssertLogRelFailed | |
* An assertion failed. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
*/ | |
#define AssertLogRelFailed() \ | |
do { \ | |
RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
} while (0) | |
/** @def AssertLogRelFailedReturn | |
* An assertion failed. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
* | |
* @param rc What is to be presented to return. | |
*/ | |
#define AssertLogRelFailedReturn(rc) \ | |
do { \ | |
RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
return (rc); \ | |
} while (0) | |
/** @def AssertLogRelFailedReturnVoid | |
* An assertion failed, hit a breakpoint and return. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
*/ | |
#define AssertLogRelFailedReturnVoid() \ | |
do { \ | |
RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
return; \ | |
} while (0) | |
/** @def AssertLogRelFailedBreak | |
* An assertion failed, break. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
*/ | |
#define AssertLogRelFailedBreak() \ | |
if (1) \ | |
{ \ | |
RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
break; \ | |
} else do {} while (0) | |
/** @def AssertLogRelFailedBreakStmt | |
* An assertion failed, execute \a stmt and break. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
* | |
* @param stmt Statement to execute before break. | |
*/ | |
#define AssertLogRelFailedBreakStmt(stmt) \ | |
if (1) \ | |
{ \ | |
RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertPanic(); \ | |
stmt; \ | |
break; \ | |
} else do {} while (0) | |
/** @def AssertLogRelMsgFailed | |
* An assertion failed. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
* | |
* @param a printf argument list (in parenthesis). | |
*/ | |
#define AssertLogRelMsgFailed(a) \ | |
do { \ | |
RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertLogRelMsg2(a); \ | |
RTAssertPanic(); \ | |
} while (0) | |
/** @def AssertLogRelMsgFailedStmt | |
* An assertion failed, execute @a stmt. | |
* | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. The | |
* statement will be executed in regardless of build type. | |
* | |
* @param a printf argument list (in parenthesis). | |
* @param stmt Statement to execute after raising/logging the assertion. | |
*/ | |
#define AssertLogRelMsgFailedStmt(a, stmt) \ | |
do { \ | |
RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertLogRelMsg2(a); \ | |
RTAssertPanic(); \ | |
stmt; \ | |
} while (0) | |
/** @def AssertLogRelMsgFailedReturn | |
* An assertion failed, return \a rc. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
* | |
* @param a printf argument list (in parenthesis). | |
* @param rc What is to be presented to return. | |
*/ | |
#define AssertLogRelMsgFailedReturn(a, rc) \ | |
do { \ | |
RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertLogRelMsg2(a); \ | |
RTAssertPanic(); \ | |
return (rc); \ | |
} while (0) | |
/** @def AssertLogRelMsgFailedReturnStmt | |
* An assertion failed, execute @a stmt and return @a rc. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
* | |
* @param a printf argument list (in parenthesis). | |
* @param stmt Statement to execute before returning in case of a failed | |
* assertion. | |
* @param rc What is to be presented to return. | |
*/ | |
#define AssertLogRelMsgFailedReturnStmt(a, stmt, rc) \ | |
do { \ | |
RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertLogRelMsg2(a); \ | |
RTAssertPanic(); \ | |
stmt; \ | |
return (rc); \ | |
} while (0) | |
/** @def AssertLogRelMsgFailedReturnVoid | |
* An assertion failed, return void. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
* | |
* @param a printf argument list (in parenthesis). | |
*/ | |
#define AssertLogRelMsgFailedReturnVoid(a) \ | |
do { \ | |
RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertLogRelMsg2(a); \ | |
RTAssertPanic(); \ | |
return; \ | |
} while (0) | |
/** @def AssertLogRelMsgFailedReturnVoidStmt | |
* An assertion failed, execute @a stmt and return void. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
* | |
* @param a printf argument list (in parenthesis). | |
* @param stmt Statement to execute before returning in case of a failed | |
* assertion. | |
*/ | |
#define AssertLogRelMsgFailedReturnVoidStmt(a, stmt) \ | |
do { \ | |
RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertLogRelMsg2(a); \ | |
RTAssertPanic(); \ | |
stmt; \ | |
return; \ | |
} while (0) | |
/** @def AssertLogRelMsgFailedBreak | |
* An assertion failed, break. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
* | |
* @param a printf argument list (in parenthesis). | |
*/ | |
#define AssertLogRelMsgFailedBreak(a) \ | |
if (1)\ | |
{ \ | |
RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertLogRelMsg2(a); \ | |
RTAssertPanic(); \ | |
break; \ | |
} else do {} while (0) | |
/** @def AssertLogRelMsgFailedBreakStmt | |
* An assertion failed, execute \a stmt and break. | |
* Strict builds will hit a breakpoint, non-strict will only do LogRel. | |
* | |
* @param a printf argument list (in parenthesis). | |
* @param stmt Statement to execute before break. | |
*/ | |
#define AssertLogRelMsgFailedBreakStmt(a, stmt) \ | |
if (1) \ | |
{ \ | |
RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertLogRelMsg2(a); \ | |
RTAssertPanic(); \ | |
stmt; \ | |
break; \ | |
} else do {} while (0) | |
/** @} */ | |
/** @name Release Assertions | |
* | |
* These assertions are always enabled. | |
* @{ | |
*/ | |
/** @def RTAssertReleasePanic() | |
* Invokes RTAssertShouldPanic and RTAssertDoPanic. | |
* | |
* It might seem odd that RTAssertShouldPanic is necessary when its result isn't | |
* checked, but it's done since RTAssertShouldPanic is overrideable and might be | |
* used to bail out before taking down the system (the VMMR0 case). | |
*/ | |
#define RTAssertReleasePanic() do { RTAssertShouldPanic(); RTAssertDoPanic(); } while (0) | |
/** @def AssertRelease | |
* Assert that an expression is true. If it's not hit a breakpoint. | |
* | |
* @param expr Expression which should be true. | |
*/ | |
#define AssertRelease(expr) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, RT_GCC_EXTENSION __PRETTY_FUNCTION__); \ | |
RTAssertReleasePanic(); \ | |
} \ | |
} while (0) | |
/** @def AssertReleaseReturn | |
* Assert that an expression is true, hit a breakpoint and return if it isn't. | |
* | |
* @param expr Expression which should be true. | |
* @param rc What is to be presented to return. | |
*/ | |
#define AssertReleaseReturn(expr, rc) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertReleasePanic(); \ | |
return (rc); \ | |
} \ | |
} while (0) | |
/** @def AssertReleaseReturnVoid | |
* Assert that an expression is true, hit a breakpoint and return if it isn't. | |
* | |
* @param expr Expression which should be true. | |
*/ | |
#define AssertReleaseReturnVoid(expr) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertReleasePanic(); \ | |
return; \ | |
} \ | |
} while (0) | |
/** @def AssertReleaseBreak | |
* Assert that an expression is true, hit a breakpoint and break if it isn't. | |
* | |
* @param expr Expression which should be true. | |
*/ | |
#define AssertReleaseBreak(expr) \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else if (1) \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertReleasePanic(); \ | |
break; \ | |
} else do {} while (0) | |
/** @def AssertReleaseBreakStmt | |
* Assert that an expression is true, hit a breakpoint and break if it isn't. | |
* | |
* @param expr Expression which should be true. | |
* @param stmt Statement to execute before break in case of a failed assertion. | |
*/ | |
#define AssertReleaseBreakStmt(expr, stmt) \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else if (1) \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertReleasePanic(); \ | |
stmt; \ | |
break; \ | |
} else do {} while (0) | |
/** @def AssertReleaseMsg | |
* Assert that an expression is true, print the message and hit a breakpoint if it isn't. | |
* | |
* @param expr Expression which should be true. | |
* @param a printf argument list (in parenthesis). | |
*/ | |
#define AssertReleaseMsg(expr, a) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertReleasePanic(); \ | |
} \ | |
} while (0) | |
/** @def AssertReleaseMsgReturn | |
* Assert that an expression is true, print the message and hit a breakpoint and return if it isn't. | |
* | |
* @param expr Expression which should be true. | |
* @param a printf argument list (in parenthesis). | |
* @param rc What is to be presented to return. | |
*/ | |
#define AssertReleaseMsgReturn(expr, a, rc) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertReleasePanic(); \ | |
return (rc); \ | |
} \ | |
} while (0) | |
/** @def AssertReleaseMsgReturnVoid | |
* Assert that an expression is true, print the message and hit a breakpoint and return if it isn't. | |
* | |
* @param expr Expression which should be true. | |
* @param a printf argument list (in parenthesis). | |
*/ | |
#define AssertReleaseMsgReturnVoid(expr, a) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertReleasePanic(); \ | |
return; \ | |
} \ | |
} while (0) | |
/** @def AssertReleaseMsgBreak | |
* Assert that an expression is true, print the message and hit a breakpoint and break if it isn't. | |
* | |
* @param expr Expression which should be true. | |
* @param a printf argument list (in parenthesis). | |
*/ | |
#define AssertReleaseMsgBreak(expr, a) \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else if (1) \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertReleasePanic(); \ | |
break; \ | |
} else do {} while (0) | |
/** @def AssertReleaseMsgBreakStmt | |
* Assert that an expression is true, print the message and hit a breakpoint and break if it isn't. | |
* | |
* @param expr Expression which should be true. | |
* @param a printf argument list (in parenthesis). | |
* @param stmt Statement to execute before break in case of a failed assertion. | |
*/ | |
#define AssertReleaseMsgBreakStmt(expr, a, stmt) \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else if (1) \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertReleasePanic(); \ | |
stmt; \ | |
break; \ | |
} else do {} while (0) | |
/** @def AssertReleaseFailed | |
* An assertion failed, hit a breakpoint. | |
*/ | |
#define AssertReleaseFailed() \ | |
do { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertReleasePanic(); \ | |
} while (0) | |
/** @def AssertReleaseFailedReturn | |
* An assertion failed, hit a breakpoint and return. | |
* | |
* @param rc What is to be presented to return. | |
*/ | |
#define AssertReleaseFailedReturn(rc) \ | |
do { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertReleasePanic(); \ | |
return (rc); \ | |
} while (0) | |
/** @def AssertReleaseFailedReturnVoid | |
* An assertion failed, hit a breakpoint and return. | |
*/ | |
#define AssertReleaseFailedReturnVoid() \ | |
do { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertReleasePanic(); \ | |
return; \ | |
} while (0) | |
/** @def AssertReleaseFailedBreak | |
* An assertion failed, hit a breakpoint and break. | |
*/ | |
#define AssertReleaseFailedBreak() \ | |
if (1) { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertReleasePanic(); \ | |
break; \ | |
} else do {} while (0) | |
/** @def AssertReleaseFailedBreakStmt | |
* An assertion failed, hit a breakpoint and break. | |
* | |
* @param stmt Statement to execute before break. | |
*/ | |
#define AssertReleaseFailedBreakStmt(stmt) \ | |
if (1) { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertReleasePanic(); \ | |
stmt; \ | |
break; \ | |
} else do {} while (0) | |
/** @def AssertReleaseMsgFailed | |
* An assertion failed, print a message and hit a breakpoint. | |
* | |
* @param a printf argument list (in parenthesis). | |
*/ | |
#define AssertReleaseMsgFailed(a) \ | |
do { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, RT_GCC_EXTENSION __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertReleasePanic(); \ | |
} while (0) | |
/** @def AssertReleaseMsgFailedReturn | |
* An assertion failed, print a message, hit a breakpoint and return. | |
* | |
* @param a printf argument list (in parenthesis). | |
* @param rc What is to be presented to return. | |
*/ | |
#define AssertReleaseMsgFailedReturn(a, rc) \ | |
do { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertReleasePanic(); \ | |
return (rc); \ | |
} while (0) | |
/** @def AssertReleaseMsgFailedReturnVoid | |
* An assertion failed, print a message, hit a breakpoint and return. | |
* | |
* @param a printf argument list (in parenthesis). | |
*/ | |
#define AssertReleaseMsgFailedReturnVoid(a) \ | |
do { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertReleasePanic(); \ | |
return; \ | |
} while (0) | |
/** @def AssertReleaseMsgFailedBreak | |
* An assertion failed, print a message, hit a breakpoint and break. | |
* | |
* @param a printf argument list (in parenthesis). | |
*/ | |
#define AssertReleaseMsgFailedBreak(a) \ | |
if (1) { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertReleasePanic(); \ | |
break; \ | |
} else do {} while (0) | |
/** @def AssertReleaseMsgFailedBreakStmt | |
* An assertion failed, print a message, hit a breakpoint and break. | |
* | |
* @param a printf argument list (in parenthesis). | |
* @param stmt Statement to execute before break. | |
*/ | |
#define AssertReleaseMsgFailedBreakStmt(a, stmt) \ | |
if (1) { \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertReleasePanic(); \ | |
stmt; \ | |
break; \ | |
} else do {} while (0) | |
/** @} */ | |
/** @name Fatal Assertions | |
* These are similar to release assertions except that you cannot ignore them in | |
* any way, they will loop for ever if RTAssertDoPanic returns. | |
* | |
* @{ | |
*/ | |
/** @def AssertFatal | |
* Assert that an expression is true. If it's not hit a breakpoint (for ever). | |
* | |
* @param expr Expression which should be true. | |
*/ | |
#define AssertFatal(expr) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
for (;;) \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertReleasePanic(); \ | |
} \ | |
} while (0) | |
/** @def AssertFatalMsg | |
* Assert that an expression is true, print the message and hit a breakpoint (for ever) if it isn't. | |
* | |
* @param expr Expression which should be true. | |
* @param a printf argument list (in parenthesis). | |
*/ | |
#define AssertFatalMsg(expr, a) \ | |
do { \ | |
if (RT_LIKELY(!!(expr))) \ | |
{ /* likely */ } \ | |
else \ | |
for (;;) \ | |
{ \ | |
RTAssertMsg1Weak(#expr, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertReleasePanic(); \ | |
} \ | |
} while (0) | |
/** @def AssertFatalFailed | |
* An assertion failed, hit a breakpoint (for ever). | |
*/ | |
#define AssertFatalFailed() \ | |
do { \ | |
for (;;) \ | |
{ \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, RT_GCC_EXTENSION __PRETTY_FUNCTION__); \ | |
RTAssertReleasePanic(); \ | |
} \ | |
} while (0) | |
/** @def AssertFatalMsgFailed | |
* An assertion failed, print a message and hit a breakpoint (for ever). | |
* | |
* @param a printf argument list (in parenthesis). | |
*/ | |
#define AssertFatalMsgFailed(a) \ | |
do { \ | |
for (;;) \ | |
{ \ | |
RTAssertMsg1Weak((const char *)0, __LINE__, __FILE__, RT_GCC_EXTENSION __PRETTY_FUNCTION__); \ | |
RTAssertMsg2Weak a; \ | |
RTAssertReleasePanic(); \ | |
} \ | |
} while (0) | |
/** @} */ | |
/** @name Convenience Assertions Macros | |
* @{ | |
*/ | |
/** @def AssertRC | |
* Asserts a iprt status code successful. | |
* | |
* On failure it will print info about the rc and hit a breakpoint. | |
* | |
* @param rc iprt status code. | |
* @remark rc is referenced multiple times. In release mode is NOREF()'ed. | |
*/ | |
#define AssertRC(rc) AssertMsgRC(rc, ("%Rra\n", (rc))) | |
/** @def AssertRCStmt | |
* Asserts a iprt status code successful, bitch (RT_STRICT mode only) and execute | |
* @a stmt if it isn't. | |
* | |
* @param rc iprt status code. | |
* @param stmt Statement to execute before returning in case of a failed | |
* assertion. | |
* @remark rc is referenced multiple times. In release mode is NOREF()'ed. | |
*/ | |
#define AssertRCStmt(rc, stmt) AssertMsgRCStmt(rc, ("%Rra\n", (rc)), stmt) | |
/** @def AssertRCReturn | |
* Asserts a iprt status code successful, bitch (RT_STRICT mode only) and return if it isn't. | |
* | |
* @param rc iprt status code. | |
* @param rcRet What is to be presented to return. | |
* @remark rc is referenced multiple times. In release mode is NOREF()'ed. | |
*/ | |
#define AssertRCReturn(rc, rcRet) AssertMsgRCReturn(rc, ("%Rra\n", (rc)), rcRet) | |
/** @def AssertRCReturnStmt | |
* Asserts a iprt status code successful, bitch (RT_STRICT mode only), execute | |
* @a stmt and returns @a rcRet if it isn't. | |
* | |
* @param rc iprt status code. | |
* @param stmt Statement to execute before returning in case of a failed | |
* assertion. | |
* @param rcRet What is to be presented to return. | |
* @remark rc is referenced multiple times. In release mode is NOREF()'ed. | |
*/ | |
#define AssertRCReturnStmt(rc, stmt, rcRet) AssertMsgRCReturnStmt(rc, ("%Rra\n", (rc)), stmt, rcRet) | |
/** @def AssertRCReturnVoid | |
* Asserts a iprt status code successful, bitch (RT_STRICT mode only) and return if it isn't. | |
* | |
* @param rc iprt status code. | |
* @remark rc is referenced multiple times. In release mode is NOREF()'ed. | |
*/ | |
#define AssertRCReturnVoid(rc) AssertMsgRCReturnVoid(rc, ("%Rra\n", (rc))) | |
/** @def AssertRCReturnVoidStmt | |
* Asserts a iprt status code successful, bitch (RT_STRICT mode only), and | |
* execute the given statement/return if it isn't. | |
* | |
* @param rc iprt status code. | |
* @param stmt Statement to execute before returning on failure. | |
* @remark rc is referenced multiple times. In release mode is NOREF()'ed. | |
*/ | |
#define AssertRCReturnVoidStmt(rc, stmt) AssertMsgRCReturnVoidStmt(rc, ("%Rra\n", (rc)), stmt) | |
/** @def AssertRCBreak | |
* Asserts a iprt status code successful, bitch (RT_STRICT mode only) and break if it isn't. | |
* | |
* @param rc iprt status code. | |
* @remark rc is referenced multiple times. In release mode is NOREF()'ed. | |
*/ | |
#define AssertRCBreak(rc) AssertMsgRCBreak(rc, ("%Rra\n", (rc))) | |
/** @def AssertRCBreakStmt | |
* Asserts a iprt status code successful, bitch (RT_STRICT mode only) and break if it isn't. | |
* | |
* @param rc iprt status code. | |
* @param stmt Statement to execute before break in case of a failed assertion. | |
* @remark rc is referenced multiple times. In release mode is NOREF()'ed. | |
*/ | |
#define AssertRCBreakStmt(rc, stmt) AssertMsgRCBreakStmt(rc, ("%Rra\n", (rc)), stmt) | |
/** @def AssertMsgRC | |
* Asserts a iprt status code successful. | |
* | |
* It prints a custom message and hits a breakpoint on FAILURE. | |
* | |
* @param rc iprt status code. | |
* @param msg printf argument list (in parenthesis). | |
* @remark rc is referenced multiple times. In release mode is NOREF()'ed. | |
*/ | |
#define AssertMsgRC(rc, msg) \ | |
do { AssertMsg(RT_SUCCESS_NP(rc), msg); NOREF(rc); } while (0) | |
/** @def AssertMsgRCStmt | |
* Asserts a iprt status code successful, bitch (RT_STRICT mode only) and | |
* execute @a stmt if it isn't. | |
* | |
* @param rc iprt status code. | |
* @param msg printf argument list (in parenthesis). | |
* @param stmt Statement to execute before returning in case of a failed | |
* assertion. | |
* @remark rc is referenced multiple times. In release mode is NOREF()'ed. | |
*/ | |
#define AssertMsgRCStmt(rc, msg, stmt) \ | |
do { AssertMsgStmt(RT_SUCCESS_NP(rc), msg, stmt); NOREF(rc); } while (0) | |
/** @def AssertMsgRCReturn | |
* Asserts a iprt status code successful, bitch (RT_STRICT mode only) and return | |
* @a rcRet if it isn't. | |
* | |
* @param rc iprt status code. | |
* @param msg printf argument list (in parenthesis). | |
* @param rcRet What is to be presented to return. | |
* @remark rc is referenced multiple times. In release mode is NOREF()'ed. | |
*/ | |
#define AssertMsgRCReturn(rc, msg, rcRet) \ | |
do { AssertMsgReturn(RT_SUCCESS_NP(rc), msg, rcRet); NOREF(rc); } while (0) | |
/** @def AssertMsgRCReturnStmt | |
* Asserts a iprt status code successful, bitch (RT_STRICT mode only), execute | |
* @a stmt and return @a rcRet if it isn't. | |
* | |
* @param rc iprt status code. | |
* @param msg printf argument list (in parenthesis). | |
* @param stmt Statement to execute before returning in case of a failed | |
* assertion. | |
* @param rcRet What is to be presented to return. | |
* @remark rc is referenced multiple times. In release mode is NOREF()'ed. | |
*/ | |
#define AssertMsgRCReturnStmt(rc, msg, stmt, rcRet) \ | |
do { AssertMsgReturnStmt(RT_SUCCESS_NP(rc), msg, stmt, rcRet); NOREF(rc); } while (0) | |
/** @def AssertMsgRCReturnVoid | |
* Asserts a iprt status code successful, bitch (RT_STRICT mode only) and return | |
* void if it isn't. | |
* | |
* @param rc iprt status code. | |
* @param msg printf argument list (in parenthesis). | |
* @remark rc is referenced multiple times. In release mode is NOREF()'ed. | |
*/ | |
#define AssertMsgRCReturnVoid(rc, msg) \ | |
do { AssertMsgReturnVoid(RT_SUCCESS_NP(rc), msg); NOREF(rc); } while (0) | |
/** @def AssertMsgRCReturnVoidStmt | |
* Asserts a iprt status code successful, bitch (RT_STRICT mode only), execute | |
* @a stmt and return void if it isn't. | |
* | |
* @param rc iprt status code. | |
* @param msg printf argument list (in parenthesis). | |
* @param stmt Statement to execute before break in case of a failed assertion. | |
* @remark rc is referenced multiple times. In release mode is NOREF()'ed. | |
*/ | |
#define AssertMsgRCReturnVoidStmt(rc, msg, stmt) \ | |
do { AssertMsgReturnVoidStmt(RT_SUCCESS_NP(rc), msg, stmt); NOREF(rc); } while (0) | |
/** @def AssertMsgRCBreak | |
* Asserts a iprt status code successful, bitch (RT_STRICT mode only) and break | |
* if it isn't. | |
* | |
* @param rc iprt status code. | |
* @param msg printf argument list (in parenthesis). | |
* @remark rc is referenced multiple times. In release mode is NOREF()'ed. | |
*/ | |
#define AssertMsgRCBreak(rc, msg) \ | |
if (1) { AssertMsgBreak(RT_SUCCESS(rc), msg); NOREF(rc); } else do {} while (0) | |
/** @def AssertMsgRCBreakStmt | |
* Asserts a iprt status code successful, bitch (RT_STRICT mode only), execute | |
* @a stmt and break if it isn't. | |
* | |
* @param rc iprt status code. | |
* @param msg printf argument list (in parenthesis). | |
* @param stmt Statement to execute before break in case of a failed assertion. | |
* @remark rc is referenced multiple times. In release mode is NOREF()'ed. | |
*/ | |
#define AssertMsgRCBreakStmt(rc, msg, stmt) \ | |
if (1) { AssertMsgBreakStmt(RT_SUCCESS_NP(rc), msg, stmt); NOREF(rc); } else do {} while (0) | |
/** @def AssertRCSuccess | |
* Asserts an iprt status code equals VINF_SUCCESS. | |
* | |
* On failure it will print info about the rc and hit a breakpoint. | |
* | |
* @param rc iprt status code. | |
* @remark rc is referenced multiple times. In release mode is NOREF()'ed. | |
*/ | |
#define AssertRCSuccess(rc) do { AssertMsg((rc) == VINF_SUCCESS, ("%Rra\n", (rc))); NOREF(rc); } while (0) | |
/** @def AssertRCSuccessReturn | |
* Asserts that an iprt status code equals VINF_SUCCESS, bitch (RT_STRICT mode only) and return if it isn't. | |
* | |
* @param rc iprt status code. | |
* @param rcRet What is to be presented to return. | |
* @remark rc is referenced multiple times. In release mode is NOREF()'ed. | |
*/ | |
#define AssertRCSuccessReturn(rc, rcRet) AssertMsgReturn((rc) == VINF_SUCCESS, ("%Rra\n", (rc)), rcRet) | |
/** @def AssertRCSuccessReturnVoid | |
* Asserts that an iprt status code equals VINF_SUCCESS, bitch (RT_STRICT mode only) and return if it isn't. | |
* | |
* @param rc iprt status code. | |
* @remark rc is referenced multiple times. In release mode is NOREF()'ed. | |
*/ | |
#define AssertRCSuccessReturnVoid(rc) AssertMsgReturnVoid((rc) == VINF_SUCCESS, ("%Rra\n", (rc))) | |
/** @def AssertRCSuccessBreak | |
* Asserts that an iprt status code equals VINF_SUCCESS, bitch (RT_STRICT mode only) and break if it isn't. | |
* | |
* @param rc iprt status code. | |
* @remark rc is referenced multiple times. In release mode is NOREF()'ed. | |
*/ | |
#define AssertRCSuccessBreak(rc) AssertMsgBreak((rc) == VINF_SUCCESS, ("%Rra\n", (rc))) | |
/** @def AssertRCSuccessBreakStmt | |
* Asserts that an iprt status code equals VINF_SUCCESS, bitch (RT_STRICT mode only) and break if it isn't. | |
* | |
* @param rc iprt status code. | |
* @param stmt Statement to execute before break in case of a failed assertion. | |
* @remark rc is referenced multiple times. In release mode is NOREF()'ed. | |
*/ | |
#define AssertRCSuccessBreakStmt(rc, stmt) AssertMsgBreakStmt((rc) == VINF_SUCCESS, ("%Rra\n", (rc)), stmt) | |
/** @def AssertLogRelRC | |
* Asserts a iprt status code successful. | |
* | |
* @param rc iprt status code. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertLogRelRC(rc) AssertLogRelMsgRC(rc, ("%Rra\n", (rc))) | |
/** @def AssertLogRelRCReturn | |
* Asserts a iprt status code successful, returning \a rc if it isn't. | |
* | |
* @param rc iprt status code. | |
* @param rcRet What is to be presented to return. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertLogRelRCReturn(rc, rcRet) AssertLogRelMsgRCReturn(rc, ("%Rra\n", (rc)), rcRet) | |
/** @def AssertLogRelRCReturnStmt | |
* Asserts a iprt status code successful, executing \a stmt and returning \a rc | |
* if it isn't. | |
* | |
* @param rc iprt status code. | |
* @param stmt Statement to execute before returning in case of a failed | |
* assertion. | |
* @param rcRet What is to be presented to return. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertLogRelRCReturnStmt(rc, stmt, rcRet) AssertLogRelMsgRCReturnStmt(rc, ("%Rra\n", (rc)), stmt, rcRet) | |
/** @def AssertLogRelRCReturnVoid | |
* Asserts a iprt status code successful, returning (void) if it isn't. | |
* | |
* @param rc iprt status code. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertLogRelRCReturnVoid(rc) AssertLogRelMsgRCReturnVoid(rc, ("%Rra\n", (rc))) | |
/** @def AssertLogRelRCBreak | |
* Asserts a iprt status code successful, breaking if it isn't. | |
* | |
* @param rc iprt status code. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertLogRelRCBreak(rc) AssertLogRelMsgRCBreak(rc, ("%Rra\n", (rc))) | |
/** @def AssertLogRelRCBreakStmt | |
* Asserts a iprt status code successful, execute \a statement and break if it isn't. | |
* | |
* @param rc iprt status code. | |
* @param stmt Statement to execute before break in case of a failed assertion. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertLogRelRCBreakStmt(rc, stmt) AssertLogRelMsgRCBreakStmt(rc, ("%Rra\n", (rc)), stmt) | |
/** @def AssertLogRelMsgRC | |
* Asserts a iprt status code successful. | |
* | |
* @param rc iprt status code. | |
* @param msg printf argument list (in parenthesis). | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertLogRelMsgRC(rc, msg) AssertLogRelMsg(RT_SUCCESS_NP(rc), msg) | |
/** @def AssertLogRelMsgRCReturn | |
* Asserts a iprt status code successful. | |
* | |
* @param rc iprt status code. | |
* @param msg printf argument list (in parenthesis). | |
* @param rcRet What is to be presented to return. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertLogRelMsgRCReturn(rc, msg, rcRet) AssertLogRelMsgReturn(RT_SUCCESS_NP(rc), msg, rcRet) | |
/** @def AssertLogRelMsgRCReturnStmt | |
* Asserts a iprt status code successful, execute \a stmt and return on | |
* failure. | |
* | |
* @param rc iprt status code. | |
* @param msg printf argument list (in parenthesis). | |
* @param stmt Statement to execute before returning in case of a failed | |
* assertion. | |
* @param rcRet What is to be presented to return. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertLogRelMsgRCReturnStmt(rc, msg, stmt, rcRet) AssertLogRelMsgReturnStmt(RT_SUCCESS_NP(rc), msg, stmt, rcRet) | |
/** @def AssertLogRelMsgRCReturnVoid | |
* Asserts a iprt status code successful. | |
* | |
* @param rc iprt status code. | |
* @param msg printf argument list (in parenthesis). | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertLogRelMsgRCReturnVoid(rc, msg) AssertLogRelMsgReturnVoid(RT_SUCCESS_NP(rc), msg) | |
/** @def AssertLogRelMsgRCBreak | |
* Asserts a iprt status code successful. | |
* | |
* @param rc iprt status code. | |
* @param msg printf argument list (in parenthesis). | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertLogRelMsgRCBreak(rc, msg) AssertLogRelMsgBreak(RT_SUCCESS(rc), msg) | |
/** @def AssertLogRelMsgRCBreakStmt | |
* Asserts a iprt status code successful, execute \a stmt and break if it isn't. | |
* | |
* @param rc iprt status code. | |
* @param msg printf argument list (in parenthesis). | |
* @param stmt Statement to execute before break in case of a failed assertion. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertLogRelMsgRCBreakStmt(rc, msg, stmt) AssertLogRelMsgBreakStmt(RT_SUCCESS_NP(rc), msg, stmt) | |
/** @def AssertLogRelRCSuccess | |
* Asserts that an iprt status code equals VINF_SUCCESS. | |
* | |
* @param rc iprt status code. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertLogRelRCSuccess(rc) AssertLogRelMsg((rc) == VINF_SUCCESS, ("%Rra\n", (rc))) | |
/** @def AssertLogRelRCSuccessReturn | |
* Asserts that an iprt status code equals VINF_SUCCESS. | |
* | |
* @param rc iprt status code. | |
* @param rcRet What is to be presented to return. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertLogRelRCSuccessReturn(rc, rcRet) AssertLogRelMsgReturn((rc) == VINF_SUCCESS, ("%Rra\n", (rc)), rcRet) | |
/** @def AssertLogRelRCSuccessReturnVoid | |
* Asserts that an iprt status code equals VINF_SUCCESS. | |
* | |
* @param rc iprt status code. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertLogRelRCSuccessReturnVoid(rc) AssertLogRelMsgReturnVoid((rc) == VINF_SUCCESS, ("%Rra\n", (rc))) | |
/** @def AssertLogRelRCSuccessBreak | |
* Asserts that an iprt status code equals VINF_SUCCESS. | |
* | |
* @param rc iprt status code. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertLogRelRCSuccessBreak(rc) AssertLogRelMsgBreak((rc) == VINF_SUCCESS, ("%Rra\n", (rc))) | |
/** @def AssertLogRelRCSuccessBreakStmt | |
* Asserts that an iprt status code equals VINF_SUCCESS. | |
* | |
* @param rc iprt status code. | |
* @param stmt Statement to execute before break in case of a failed assertion. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertLogRelRCSuccessBreakStmt(rc, stmt) AssertLogRelMsgBreakStmt((rc) == VINF_SUCCESS, ("%Rra\n", (rc)), stmt) | |
/** @def AssertReleaseRC | |
* Asserts a iprt status code successful. | |
* | |
* On failure information about the error will be printed and a breakpoint hit. | |
* | |
* @param rc iprt status code. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertReleaseRC(rc) AssertReleaseMsgRC(rc, ("%Rra\n", (rc))) | |
/** @def AssertReleaseRCReturn | |
* Asserts a iprt status code successful, returning if it isn't. | |
* | |
* On failure information about the error will be printed, a breakpoint hit | |
* and finally returning from the function if the breakpoint is somehow ignored. | |
* | |
* @param rc iprt status code. | |
* @param rcRet What is to be presented to return. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertReleaseRCReturn(rc, rcRet) AssertReleaseMsgRCReturn(rc, ("%Rra\n", (rc)), rcRet) | |
/** @def AssertReleaseRCReturnVoid | |
* Asserts a iprt status code successful, returning if it isn't. | |
* | |
* On failure information about the error will be printed, a breakpoint hit | |
* and finally returning from the function if the breakpoint is somehow ignored. | |
* | |
* @param rc iprt status code. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertReleaseRCReturnVoid(rc) AssertReleaseMsgRCReturnVoid(rc, ("%Rra\n", (rc))) | |
/** @def AssertReleaseRCBreak | |
* Asserts a iprt status code successful, breaking if it isn't. | |
* | |
* On failure information about the error will be printed, a breakpoint hit | |
* and finally breaking the current statement if the breakpoint is somehow ignored. | |
* | |
* @param rc iprt status code. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertReleaseRCBreak(rc) AssertReleaseMsgRCBreak(rc, ("%Rra\n", (rc))) | |
/** @def AssertReleaseRCBreakStmt | |
* Asserts a iprt status code successful, break if it isn't. | |
* | |
* On failure information about the error will be printed, a breakpoint hit | |
* and finally the break statement will be issued if the breakpoint is somehow ignored. | |
* | |
* @param rc iprt status code. | |
* @param stmt Statement to execute before break in case of a failed assertion. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertReleaseRCBreakStmt(rc, stmt) AssertReleaseMsgRCBreakStmt(rc, ("%Rra\n", (rc)), stmt) | |
/** @def AssertReleaseMsgRC | |
* Asserts a iprt status code successful. | |
* | |
* On failure a custom message is printed and a breakpoint is hit. | |
* | |
* @param rc iprt status code. | |
* @param msg printf argument list (in parenthesis). | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertReleaseMsgRC(rc, msg) AssertReleaseMsg(RT_SUCCESS_NP(rc), msg) | |
/** @def AssertReleaseMsgRCReturn | |
* Asserts a iprt status code successful. | |
* | |
* On failure a custom message is printed, a breakpoint is hit, and finally | |
* returning from the function if the breakpoint is somehow ignored. | |
* | |
* @param rc iprt status code. | |
* @param msg printf argument list (in parenthesis). | |
* @param rcRet What is to be presented to return. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertReleaseMsgRCReturn(rc, msg, rcRet) AssertReleaseMsgReturn(RT_SUCCESS_NP(rc), msg, rcRet) | |
/** @def AssertReleaseMsgRCReturnVoid | |
* Asserts a iprt status code successful. | |
* | |
* On failure a custom message is printed, a breakpoint is hit, and finally | |
* returning from the function if the breakpoint is somehow ignored. | |
* | |
* @param rc iprt status code. | |
* @param msg printf argument list (in parenthesis). | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertReleaseMsgRCReturnVoid(rc, msg) AssertReleaseMsgReturnVoid(RT_SUCCESS_NP(rc), msg) | |
/** @def AssertReleaseMsgRCBreak | |
* Asserts a iprt status code successful. | |
* | |
* On failure a custom message is printed, a breakpoint is hit, and finally | |
* breaking the current status if the breakpoint is somehow ignored. | |
* | |
* @param rc iprt status code. | |
* @param msg printf argument list (in parenthesis). | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertReleaseMsgRCBreak(rc, msg) AssertReleaseMsgBreak(RT_SUCCESS(rc), msg) | |
/** @def AssertReleaseMsgRCBreakStmt | |
* Asserts a iprt status code successful. | |
* | |
* On failure a custom message is printed, a breakpoint is hit, and finally | |
* the break statement is issued if the breakpoint is somehow ignored. | |
* | |
* @param rc iprt status code. | |
* @param msg printf argument list (in parenthesis). | |
* @param stmt Statement to execute before break in case of a failed assertion. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertReleaseMsgRCBreakStmt(rc, msg, stmt) AssertReleaseMsgBreakStmt(RT_SUCCESS_NP(rc), msg, stmt) | |
/** @def AssertReleaseRCSuccess | |
* Asserts that an iprt status code equals VINF_SUCCESS. | |
* | |
* On failure information about the error will be printed and a breakpoint hit. | |
* | |
* @param rc iprt status code. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertReleaseRCSuccess(rc) AssertReleaseMsg((rc) == VINF_SUCCESS, ("%Rra\n", (rc))) | |
/** @def AssertReleaseRCSuccessReturn | |
* Asserts that an iprt status code equals VINF_SUCCESS. | |
* | |
* On failure information about the error will be printed, a breakpoint hit | |
* and finally returning from the function if the breakpoint is somehow ignored. | |
* | |
* @param rc iprt status code. | |
* @param rcRet What is to be presented to return. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertReleaseRCSuccessReturn(rc, rcRet) AssertReleaseMsgReturn((rc) == VINF_SUCCESS, ("%Rra\n", (rc)), rcRet) | |
/** @def AssertReleaseRCSuccessReturnVoid | |
* Asserts that an iprt status code equals VINF_SUCCESS. | |
* | |
* On failure information about the error will be printed, a breakpoint hit | |
* and finally returning from the function if the breakpoint is somehow ignored. | |
* | |
* @param rc iprt status code. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertReleaseRCSuccessReturnVoid(rc) AssertReleaseMsgReturnVoid((rc) == VINF_SUCCESS, ("%Rra\n", (rc))) | |
/** @def AssertReleaseRCSuccessBreak | |
* Asserts that an iprt status code equals VINF_SUCCESS. | |
* | |
* On failure information about the error will be printed, a breakpoint hit | |
* and finally breaking the current statement if the breakpoint is somehow ignored. | |
* | |
* @param rc iprt status code. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertReleaseRCSuccessBreak(rc) AssertReleaseMsgBreak((rc) == VINF_SUCCESS, ("%Rra\n", (rc))) | |
/** @def AssertReleaseRCSuccessBreakStmt | |
* Asserts that an iprt status code equals VINF_SUCCESS. | |
* | |
* On failure information about the error will be printed, a breakpoint hit | |
* and finally the break statement will be issued if the breakpoint is somehow ignored. | |
* | |
* @param rc iprt status code. | |
* @param stmt Statement to execute before break in case of a failed assertion. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertReleaseRCSuccessBreakStmt(rc, stmt) AssertReleaseMsgBreakStmt((rc) == VINF_SUCCESS, ("%Rra\n", (rc)), stmt) | |
/** @def AssertFatalRC | |
* Asserts a iprt status code successful. | |
* | |
* On failure information about the error will be printed and a breakpoint hit. | |
* | |
* @param rc iprt status code. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertFatalRC(rc) AssertFatalMsgRC(rc, ("%Rra\n", (rc))) | |
/** @def AssertReleaseMsgRC | |
* Asserts a iprt status code successful. | |
* | |
* On failure a custom message is printed and a breakpoint is hit. | |
* | |
* @param rc iprt status code. | |
* @param msg printf argument list (in parenthesis). | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertFatalMsgRC(rc, msg) AssertFatalMsg(RT_SUCCESS_NP(rc), msg) | |
/** @def AssertFatalRCSuccess | |
* Asserts that an iprt status code equals VINF_SUCCESS. | |
* | |
* On failure information about the error will be printed and a breakpoint hit. | |
* | |
* @param rc iprt status code. | |
* @remark rc is referenced multiple times. | |
*/ | |
#define AssertFatalRCSuccess(rc) AssertFatalMsg((rc) == VINF_SUCCESS, ("%Rra\n", (rc))) | |
/** @def AssertPtr | |
* Asserts that a pointer is valid. | |
* | |
* @param pv The pointer. | |
*/ | |
#define AssertPtr(pv) AssertMsg(VALID_PTR(pv), ("%p\n", (pv))) | |
/** @def AssertPtrReturn | |
* Asserts that a pointer is valid. | |
* | |
* @param pv The pointer. | |
* @param rcRet What is to be presented to return. | |
*/ | |
#define AssertPtrReturn(pv, rcRet) AssertMsgReturn(VALID_PTR(pv), ("%p\n", (pv)), rcRet) | |
/** @def AssertPtrReturnVoid | |
* Asserts that a pointer is valid. | |
* | |
* @param pv The pointer. | |
*/ | |
#define AssertPtrReturnVoid(pv) AssertMsgReturnVoid(VALID_PTR(pv), ("%p\n", (pv))) | |
/** @def AssertPtrBreak | |
* Asserts that a pointer is valid. | |
* | |
* @param pv The pointer. | |
*/ | |
#define AssertPtrBreak(pv) AssertMsgBreak(VALID_PTR(pv), ("%p\n", (pv))) | |
/** @def AssertPtrBreakStmt | |
* Asserts that a pointer is valid. | |
* | |
* @param pv The pointer. | |
* @param stmt Statement to execute before break in case of a failed assertion. | |
*/ | |
#define AssertPtrBreakStmt(pv, stmt) AssertMsgBreakStmt(VALID_PTR(pv), ("%p\n", (pv)), stmt) | |
/** @def AssertPtrNull | |
* Asserts that a pointer is valid or NULL. | |
* | |
* @param pv The pointer. | |
*/ | |
#define AssertPtrNull(pv) AssertMsg(VALID_PTR(pv) || (pv) == NULL, ("%p\n", (pv))) | |
/** @def AssertPtrNullReturn | |
* Asserts that a pointer is valid or NULL. | |
* | |
* @param pv The pointer. | |
* @param rcRet What is to be presented to return. | |
*/ | |
#define AssertPtrNullReturn(pv, rcRet) AssertMsgReturn(VALID_PTR(pv) || (pv) == NULL, ("%p\n", (pv)), rcRet) | |
/** @def AssertPtrNullReturnVoid | |
* Asserts that a pointer is valid or NULL. | |
* | |
* @param pv The pointer. | |
*/ | |
#define AssertPtrNullReturnVoid(pv) AssertMsgReturnVoid(VALID_PTR(pv) || (pv) == NULL, ("%p\n", (pv))) | |
/** @def AssertPtrNullBreak | |
* Asserts that a pointer is valid or NULL. | |
* | |
* @param pv The pointer. | |
*/ | |
#define AssertPtrNullBreak(pv) AssertMsgBreak(VALID_PTR(pv) || (pv) == NULL, ("%p\n", (pv))) | |
/** @def AssertPtrNullBreakStmt | |
* Asserts that a pointer is valid or NULL. | |
* | |
* @param pv The pointer. | |
* @param stmt Statement to execute before break in case of a failed assertion. | |
*/ | |
#define AssertPtrNullBreakStmt(pv, stmt) AssertMsgBreakStmt(VALID_PTR(pv) || (pv) == NULL, ("%p\n", (pv)), stmt) | |
/** @def AssertGCPhys32 | |
* Asserts that the high dword of a physical address is zero | |
* | |
* @param GCPhys The address (RTGCPHYS). | |
*/ | |
#define AssertGCPhys32(GCPhys) AssertMsg(VALID_PHYS32(GCPhys), ("%RGp\n", (RTGCPHYS)(GCPhys))) | |
/** @def AssertGCPtr32 | |
* Asserts that the high dword of a physical address is zero | |
* | |
* @param GCPtr The address (RTGCPTR). | |
*/ | |
#if GC_ARCH_BITS == 32 | |
# define AssertGCPtr32(GCPtr) do { } while (0) | |
#else | |
# define AssertGCPtr32(GCPtr) AssertMsg(!((GCPtr) & UINT64_C(0xffffffff00000000)), ("%RGv\n", GCPtr)) | |
#endif | |
/** @def AssertForEach | |
* Equivalent to Assert for each value of the variable from the starting | |
* value to the finishing one. | |
* | |
* @param var Name of the counter variable. | |
* @param vartype Type of the counter variable. | |
* @param first Lowest inclusive value of the counter variable. | |
* This must be free from side effects. | |
* @param end Highest exclusive value of the counter variable. | |
* This must be free from side effects. | |
* @param expr Expression which should be true for each value of @a var. | |
*/ | |
#define AssertForEach(var, vartype, first, end, expr) \ | |
do { \ | |
vartype var; \ | |
Assert((first) == (first) && (end) == (end)); /* partial check for side effects */ \ | |
for (var = (first); var < (end); var++) \ | |
AssertMsg(expr, ("%s = %#RX64 (%RI64)", #var, (uint64_t)var, (int64_t)var)); \ | |
} while (0) | |
/** @} */ | |
/** @} */ | |
#endif | |