diff options
author | Nick Mathewson <nickm@torproject.org> | 2009-10-26 20:00:08 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2009-10-26 20:00:08 +0000 |
commit | 37c3456d70b343588acf09b38b6dde6e9745b2f8 (patch) | |
tree | 4b9e527ab5e16ee2b604caf983cdf85082620fb0 | |
parent | a8267663de2feb27051682cb51f9596f59613e5f (diff) | |
download | libevent-37c3456d70b343588acf09b38b6dde6e9745b2f8.tar.gz |
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
-rw-r--r-- | log-internal.h | 2 | ||||
-rw-r--r-- | log.c | 2 | ||||
-rw-r--r-- | util-internal.h | 29 |
3 files changed, 33 insertions, 0 deletions
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); @@ -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 <errno.h> +/* For EVUTIL_ASSERT */ +#include "log-internal.h" +#include <stdio.h> +#include <stdlib.h> + #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 |