From 37c3456d70b343588acf09b38b6dde6e9745b2f8 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Mon, 26 Oct 2009 20:00:08 +0000 Subject: [PATCH] Add an EVUTIL_ASSERT() to replace our calls to assert(). The big difference here is that EVUTIL_ASSERT() passes its message on via event_errx() before aborting, so that the application has a prayer of noticing and recording it. svn:r1463 --- log-internal.h | 2 ++ log.c | 2 ++ util-internal.h | 29 +++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/log-internal.h b/log-internal.h index 6468f08b..51e65516 100644 --- a/log-internal.h +++ b/log-internal.h @@ -33,6 +33,8 @@ #define EV_CHECK_FMT(a,b) #endif +#define _EVENT_ERR_ABORT 0xdeaddead + void event_err(int eval, const char *fmt, ...) EV_CHECK_FMT(2,3); void event_warn(const char *fmt, ...) EV_CHECK_FMT(1,2); void event_sock_err(int eval, int sock, const char *fmt, ...) EV_CHECK_FMT(3,4); diff --git a/log.c b/log.c index 292ec2f8..8aa1d428 100644 --- a/log.c +++ b/log.c @@ -80,6 +80,8 @@ event_exit(int errcode) { if (fatal_fn) fatal_fn(errcode); + else if (errcode == _EVENT_ERR_ABORT) + abort(); else exit(errcode); } diff --git a/util-internal.h b/util-internal.h index f5580ecc..853f2200 100644 --- a/util-internal.h +++ b/util-internal.h @@ -29,6 +29,11 @@ #include "event-config.h" #include +/* For EVUTIL_ASSERT */ +#include "log-internal.h" +#include +#include + #ifdef __cplusplus extern "C" { #endif @@ -132,6 +137,30 @@ int evutil_socket_connect(evutil_socket_t *fd_ptr, struct sockaddr *sa, int sock int evutil_socket_finished_connecting(evutil_socket_t fd); +/* Evaluates to the same boolean value as 'p', and hints to the compiler that + * we expect this value to be false. */ +#ifdef __GNUC__X +#define EVUTIL_UNLIKELY(p) __builtin_expect(!!(p),0) +#else +#define EVUTIL_UNLIKELY(p) (p) +#endif + +/* Replacement for assert() that calls event_errx on failure. */ +#define EVUTIL_ASSERT(cond) \ + do { \ + if (EVUTIL_UNLIKELY(!(cond))) { \ + event_errx(_EVENT_ERR_ABORT, \ + "%s:%d: Assertion %s failed in %s", \ + __FILE__,__LINE__,#cond,__func__); \ + /* In case a user-supplied handler tries to */ \ + /* return control to us, log and abort here. */ \ + (void)fprintf(stderr, \ + "%s:%d: Assertion %s failed in %s", \ + __FILE__,__LINE__,#cond,__func__); \ + abort(); \ + } \ + } while(0) + #ifdef __cplusplus } #endif -- 2.50.1