X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fctf-writer%2Fassert-pre.h;h=edb306dfceedc45e94f7355f23fccc6cf4ea631a;hb=c4f23e30bf67d2523163614bc9461d84cbe1ae80;hp=5444760d77d7bf994c09e0d2c1b234368a126977;hpb=7151fb67130ebbdc531424a4b87461e781da001f;p=babeltrace.git diff --git a/src/ctf-writer/assert-pre.h b/src/ctf-writer/assert-pre.h index 5444760d..edb306df 100644 --- a/src/ctf-writer/assert-pre.h +++ b/src/ctf-writer/assert-pre.h @@ -39,11 +39,46 @@ # error Include "logging/log.h" before this header. #endif +#include #include #include #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. * @@ -51,14 +86,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) @@ -95,7 +130,6 @@ * 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 __attribute__((unused)) @@ -106,7 +140,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