utils: Add ast_assert_return

Similar to pjproject's PJ_ASSERT_RETURN macro, this one will do the
following...

If the assert passes... NoOp

If the assert fails and AST_DEVMODE is defined, execute ast_assert()
then, if DO_CRASH isn't set, return from the calling function with
the supplied value.

If the assert fails and AST_DEVMODE is not defined, return from the
calling function with the supplied value.

The macro will execute a return without a value if one isn't suppled.

Change-Id: I0003844affeab550d5ff5bca7aa7cf8a559b873e
This commit is contained in:
George Joseph
2018-04-13 14:17:36 -06:00
parent 38dae51b78
commit f7e7ce6ba2

View File

@@ -578,6 +578,13 @@ void DO_CRASH_NORETURN __ast_assert_failed(int condition, const char *condition_
#ifdef AST_DEVMODE #ifdef AST_DEVMODE
#define ast_assert(a) _ast_assert(a, # a, __FILE__, __LINE__, __PRETTY_FUNCTION__) #define ast_assert(a) _ast_assert(a, # a, __FILE__, __LINE__, __PRETTY_FUNCTION__)
#define ast_assert_return(a, ...) \
({ \
if (__builtin_expect(!(a), 1)) { \
_ast_assert(0, # a, __FILE__, __LINE__, __PRETTY_FUNCTION__); \
return __VA_ARGS__; \
}\
})
static void force_inline _ast_assert(int condition, const char *condition_str, const char *file, int line, const char *function) static void force_inline _ast_assert(int condition, const char *condition_str, const char *file, int line, const char *function)
{ {
if (__builtin_expect(!condition, 1)) { if (__builtin_expect(!condition, 1)) {
@@ -586,6 +593,12 @@ static void force_inline _ast_assert(int condition, const char *condition_str, c
} }
#else #else
#define ast_assert(a) #define ast_assert(a)
#define ast_assert_return(a, ...) \
({ \
if (__builtin_expect(!(a), 1)) { \
return __VA_ARGS__; \
}\
})
#endif #endif
/*! /*!