Extend pjdlog_verify() to support the following additional macros:

PJDLOG_RVERIFY() - always check expression and on false log the given message
	and exit.
PJDLOG_RASSERT() - check expression when NDEBUG is not defined and on false log
	given message and exit.
PJDLOG_ABORT() - log the given message and exit.

MFC after:	1 week
This commit is contained in:
Pawel Jakub Dawidek 2011-01-27 19:28:29 +00:00
parent eeb3cd677d
commit 94bf851dc1
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=217966
2 changed files with 44 additions and 9 deletions

View File

@ -440,15 +440,38 @@ pjdlog_exitx(int exitcode, const char *fmt, ...)
*/ */
void void
pjdlog_verify(const char *func, const char *file, int line, pjdlog_verify(const char *func, const char *file, int line,
const char *failedexpr) const char *failedexpr, const char *fmt, ...)
{ {
va_list ap;
if (func == NULL) { assert(pjdlog_initialized);
pjdlog_critical("Assertion failed: (%s), file %s, line %d.",
failedexpr, file, line); /*
* When there is no message we pass __func__ as 'fmt'.
* It would be cleaner to pass NULL or "", but gcc generates a warning
* for both of those.
*/
if (fmt != func) {
va_start(ap, fmt);
pjdlogv_critical(fmt, ap);
va_end(ap);
}
if (failedexpr == NULL) {
if (func == NULL) {
pjdlog_critical("Aborted at file %s, line %d.", file,
line);
} else {
pjdlog_critical("Aborted at function %s, file %s, line %d.",
func, file, line);
}
} else { } else {
pjdlog_critical("Assertion failed: (%s), function %s, file %s, line %d.", if (func == NULL) {
failedexpr, func, file, line); pjdlog_critical("Assertion failed: (%s), file %s, line %d.",
failedexpr, file, line);
} else {
pjdlog_critical("Assertion failed: (%s), function %s, file %s, line %d.",
failedexpr, func, file, line);
}
} }
abort(); abort();
} }

View File

@ -90,16 +90,28 @@ void pjdlog_exitx(int exitcode, const char *fmt, ...) __printflike(2, 3) __dead2
void pjdlogv_exitx(int exitcode, const char *fmt, va_list ap) __printflike(2, 0) __dead2; void pjdlogv_exitx(int exitcode, const char *fmt, va_list ap) __printflike(2, 0) __dead2;
void pjdlog_verify(const char *func, const char *file, int line, void pjdlog_verify(const char *func, const char *file, int line,
const char *failedexpr); const char *failedexpr, const char *fmt, ...) __printflike(5, 6);
#define PJDLOG_VERIFY(expr) do { \ #define PJDLOG_VERIFY(expr) do { \
if (!(expr)) \ if (!(expr)) { \
pjdlog_verify(__func__, __FILE__, __LINE__, #expr); \ pjdlog_verify(__func__, __FILE__, __LINE__, #expr, \
__func__); \
} \
} while (0) } while (0)
#define PJDLOG_RVERIFY(expr, ...) do { \
if (!(expr)) { \
pjdlog_verify(__func__, __FILE__, __LINE__, #expr, \
__VA_ARGS__); \
} \
} while (0)
#define PJDLOG_ABORT(...) pjdlog_verify(__func__, __FILE__, \
__LINE__, NULL, __VA_ARGS__)
#ifdef NDEBUG #ifdef NDEBUG
#define PJDLOG_ASSERT(expr) do { } while (0) #define PJDLOG_ASSERT(expr) do { } while (0)
#define PJDLOG_RASSERT(...) do { } while (0)
#else #else
#define PJDLOG_ASSERT(expr) PJDLOG_VERIFY(expr) #define PJDLOG_ASSERT(expr) PJDLOG_VERIFY(expr)
#define PJDLOG_RASSERT(...) PJDLOG_RVERIFY(__VA_ARGS__)
#endif #endif
#endif /* !_PJDLOG_H_ */ #endif /* !_PJDLOG_H_ */