X-Git-Url: https://git.efficios.com/?a=blobdiff_plain;f=src%2Flib%2Fassert-post.h;h=b06eb7425fb03da0bf64382420cf6652c5331396;hb=9754b4d8165a851addf77884ff03014c624b7c0c;hp=9776bde09af6bb5e722ac8db420638ea8b98d23c;hpb=7d0140bc3fed079fa103e3cab75fe984fe48dbda;p=babeltrace.git diff --git a/src/lib/assert-post.h b/src/lib/assert-post.h index 9776bde0..b06eb742 100644 --- a/src/lib/assert-post.h +++ b/src/lib/assert-post.h @@ -39,17 +39,18 @@ # error Include "lib/logging.h" before this header. #endif +#include #include #include #include "common/macros.h" +#include "common/common.h" -#ifdef BT_DEV_MODE /* * Prints the details of an unsatisfied postcondition without * immediately aborting. You should use this within a function which - * checks postconditions, but which is called from a BT_ASSERT_POST() - * context, so that the function can still return its result for - * BT_ASSERT_POST() to evaluate it. + * checks postconditions, but which is called from a + * BT_ASSERT_POST() context, so that the function can still return + * its result for BT_ASSERT_POST() to evaluate it. * * Example: * @@ -69,9 +70,9 @@ * ... * * BT_ASSERT_POST(check_complex_postcond(...), - * "Postcondition is not satisfied: ...", ...); + * "Postcondition is not satisfied: ...", ...); */ -# define BT_ASSERT_POST_MSG(_fmt, ...) \ +#define BT_ASSERT_POST_MSG(_fmt, ...) \ do { \ bt_lib_log(_BT_LOG_SRCLOC_FUNCTION, __FILE__, \ __LINE__, BT_LOG_FATAL, BT_LOG_TAG, \ @@ -79,8 +80,7 @@ } while (0) /* - * Developer mode: asserts that the library postcondition `_cond` is - * satisfied. + * Asserts that the library postcondition `_cond` is satisfied. * * If `_cond` is false, log a fatal statement using `_fmt` and the * optional arguments (same usage as BT_LIB_LOGF()), and abort. @@ -89,27 +89,68 @@ * the user), use BT_ASSERT_PRE(). * * To assert that an internal postcondition is satisfied, use - * BT_ASSERT(). + * BT_ASSERT() or BT_ASSERT_DBG(). */ -# define BT_ASSERT_POST(_cond, _fmt, ...) \ +#define BT_ASSERT_POST(_cond, _fmt, ...) \ do { \ if (!(_cond)) { \ BT_ASSERT_POST_MSG("Babeltrace 2 library postcondition not satisfied; error is:"); \ - BT_ASSERT_POST_MSG((_fmt), ##__VA_ARGS__); \ + BT_ASSERT_POST_MSG(_fmt, ##__VA_ARGS__); \ BT_ASSERT_POST_MSG("Aborting..."); \ - abort(); \ + bt_common_abort(); \ } \ } while (0) +/* + * Asserts that if there's an error on the current thread, an error status code + * was returned. Puts back the error in place (if there is one) such that if + * the assertion hits, it will be possible to inspect it with a debugger. + */ +#define BT_ASSERT_POST_NO_ERROR_IF_NO_ERROR_STATUS(_status) \ + do { \ + const struct bt_error *err = bt_current_thread_take_error(); \ + if (err) { \ + bt_current_thread_move_error(err); \ + } \ + BT_ASSERT_POST(_status < 0 || !err, \ + "Current thread has an error, but user function " \ + "returned a non-error status: status=%s", \ + bt_common_func_status_string(_status)); \ + } while (0) + +/* + * Asserts that the current thread has no error. + */ +#define BT_ASSERT_POST_NO_ERROR() \ + BT_ASSERT_POST_NO_ERROR_IF_NO_ERROR_STATUS(0) + /* * Marks a function as being only used within a BT_ASSERT_POST() * context. */ -# define BT_ASSERT_POST_FUNC +#define BT_ASSERT_POST_FUNC + +#ifdef BT_DEV_MODE +/* Developer mode version of BT_ASSERT_POST_MSG(). */ +# define BT_ASSERT_POST_DEV_MSG(_fmt, ...) \ + BT_ASSERT_POST_MSG(_fmt, ##__VA_ARGS__) + +/* Developer mode version of BT_ASSERT_POST(). */ +# define BT_ASSERT_POST_DEV(_cond, _fmt, ...) \ + BT_ASSERT_POST((_cond), _fmt, ##__VA_ARGS__) + +/* Developer mode version of BT_ASSERT_POST_NO_ERROR_IF_NO_ERROR_STATUS(). */ +# define BT_ASSERT_POST_DEV_NO_ERROR_IF_NO_ERROR_STATUS(_status) \ + BT_ASSERT_POST_NO_ERROR_IF_NO_ERROR_STATUS(_status) + +/* Developer mode version of `BT_ASSERT_POST_FUNC`. */ +# define BT_ASSERT_POST_DEV_FUNC BT_ASSERT_POST_FUNC #else -# define BT_ASSERT_POST(_cond, _fmt, ...) ((void) sizeof((void) (_cond), 0)) -# define BT_ASSERT_POST_FUNC __attribute__((unused)) -# define BT_ASSERT_POST_MSG(_fmt, ...) +# define BT_ASSERT_POST_DEV_MSG(_fmt, ...) +# define BT_ASSERT_POST_DEV(_cond, _fmt, ...) ((void) sizeof((void) (_cond), 0)) +# define BT_ASSERT_POST_DEV_NO_ERROR_IF_NO_ERROR_STATUS(_status) \ + ((void) sizeof((void) (_status), 0)) +# define BT_ASSERT_POST_DEV_FUNC __attribute__((unused)) #endif /* BT_DEV_MODE */ #define BT_ASSERT_POST_SUPPORTED