X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fctf-writer%2Fassert-pre.h;h=edb306dfceedc45e94f7355f23fccc6cf4ea631a;hb=c4f23e30bf67d2523163614bc9461d84cbe1ae80;hp=5811d7d42a518b38b6b3fea98977ade9bbf7dee6;hpb=91d8147391efdc4d42cc4e1c171a65c0372a008f;p=babeltrace.git diff --git a/src/ctf-writer/assert-pre.h b/src/ctf-writer/assert-pre.h index 5811d7d4..edb306df 100644 --- a/src/ctf-writer/assert-pre.h +++ b/src/ctf-writer/assert-pre.h @@ -25,27 +25,60 @@ */ /* - * 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 #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 +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) @@ -97,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)) @@ -108,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