summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2009-10-26 20:00:08 +0000
committerNick Mathewson <nickm@torproject.org>2009-10-26 20:00:08 +0000
commit37c3456d70b343588acf09b38b6dde6e9745b2f8 (patch)
tree4b9e527ab5e16ee2b604caf983cdf85082620fb0
parenta8267663de2feb27051682cb51f9596f59613e5f (diff)
downloadlibevent-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.h2
-rw-r--r--log.c2
-rw-r--r--util-internal.h29
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);
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 <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