X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fctf-writer%2Fassert-pre.h;h=4ae74afea4fd9e7e6665c72d159e1fb93d4ed5f1;hb=98b15851a941e7342b8bb19e265cdc3a40fabfb8;hp=8f66d514d6098bb4f6ccda2d70234efcf7919132;hpb=578e048b5debf169e286e5b5cc747b5d6c16886d;p=babeltrace.git diff --git a/src/ctf-writer/assert-pre.h b/src/ctf-writer/assert-pre.h index 8f66d514..4ae74afe 100644 --- a/src/ctf-writer/assert-pre.h +++ b/src/ctf-writer/assert-pre.h @@ -25,27 +25,59 @@ */ /* - * The macros in this header use macros defined in - * . We don't want this header to - * automatically include because you - * need to manually define BT_LOG_TAG before including - * and it is unexpected that you - * also need to define it before including this header. - * - * This is a reminder that in order to use - * , you also need to use logging - * explicitly. + * The macros in this header use macros defined in "logging/log.h". We + * don't want this header to automatically include "logging/log.h" + * because you need to manually define BT_LOG_TAG before including + * "logging/log.h" and it is unexpected that you also need to define it + * before including this header. + * + * This is a reminder that in order to use "ctf-writer/assert-pre.h", + * you also need to use logging explicitly. */ -#ifndef BABELTRACE_LOGGING_INTERNAL_H -# error Include before this header. +#ifndef BT_LOG_SUPPORTED +# error Include "logging/log.h" before this header. #endif #include #include -#include "common/babeltrace.h" +#include "common/macros.h" #ifdef BT_DEV_MODE +/* + * Prints the details of an unsatisfied precondition without immediately + * aborting. You should use this within a function which checks + * preconditions, but which is called from a BT_CTF_ASSERT_PRE() + * context, so that the function can still return its result for + * BT_CTF_ASSERT_PRE() to evaluate it. + * + * Example: + * + * BT_CTF_ASSERT_PRE_FUNC + * static inline bool check_complex_precond(...) + * { + * ... + * + * if (...) { + * BT_CTF_ASSERT_PRE_MSG("Invalid object: ...", ...); + * return false; + * } + * + * ... + * } + * + * ... + * + * BT_CTF_ASSERT_PRE(check_complex_precond(...), + * "Precondition is not satisfied: ...", ...); + */ +# define BT_CTF_ASSERT_PRE_MSG(_fmt, ...) \ + do { \ + _bt_log_write_d(_BT_LOG_SRCLOC_FUNCTION, __FILE__, \ + __LINE__, BT_LOG_FATAL, BT_LOG_TAG, (_fmt), \ + ##__VA_ARGS__); \ + } while (0) + /* * Asserts that the library precondition _cond is satisfied. * @@ -53,14 +85,14 @@ * arguments using BT_LOGF(), and abort. * * To assert that a postcondition is satisfied or that some internal - * object/context/value is in the expected state, use BT_ASSERT(). + * object/context/value is in the expected state, use BT_ASSERT_DBG(). */ # define BT_CTF_ASSERT_PRE(_cond, _fmt, ...) \ do { \ if (!(_cond)) { \ - BT_LOGF_STR("Library precondition not satisfied; error is:"); \ - BT_LOGF((_fmt), ##__VA_ARGS__); \ - BT_LOGF_STR("Aborting..."); \ + BT_CTF_ASSERT_PRE_MSG("CTF writer precondition not satisfied; error is:"); \ + BT_CTF_ASSERT_PRE_MSG((_fmt), ##__VA_ARGS__); \ + BT_CTF_ASSERT_PRE_MSG("Aborting..."); \ abort(); \ } \ } while (0) @@ -97,10 +129,9 @@ * BT_CTF_ASSERT_PRE(check_complex_precond(...), * "Precondition is not satisfied: ...", ...); */ -# define BT_CTF_ASSERT_PRE_MSG BT_LOGF #else # define BT_CTF_ASSERT_PRE(_cond, _fmt, ...) ((void) sizeof((void) (_cond), 0)) -# define BT_CTF_ASSERT_PRE_FUNC BT_UNUSED +# define BT_CTF_ASSERT_PRE_FUNC __attribute__((unused)) # define BT_CTF_ASSERT_PRE_MSG(_fmt, ...) #endif /* BT_DEV_MODE */ @@ -108,7 +139,7 @@ * Developer mode: asserts that a given variable is not NULL. */ #define BT_CTF_ASSERT_PRE_NON_NULL(_obj, _obj_name) \ - BT_CTF_ASSERT_PRE((_obj) != NULL, "%s is NULL: ", _obj_name) + BT_CTF_ASSERT_PRE((_obj), "%s is NULL: ", _obj_name) /* * Developer mode: asserts that a given object is NOT frozen. This macro