From: Nick Mathewson Date: Mon, 26 Oct 2009 20:00:08 +0000 (+0000) Subject: Add an EVUTIL_ASSERT() to replace our calls to assert(). X-Git-Tag: release-2.0.3-alpha~81 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=37c3456d70b343588acf09b38b6dde6e9745b2f8;p=libevent 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 --- 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