Skip to content

Commit

Permalink
Add an EVUTIL_ASSERT() to replace our calls to assert().
Browse files Browse the repository at this point in the history
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
  • Loading branch information
nmathewson committed Oct 26, 2009
1 parent a826766 commit 37c3456
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 0 deletions.
2 changes: 2 additions & 0 deletions log-internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions log.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ event_exit(int errcode)
{
if (fatal_fn)
fatal_fn(errcode);
else if (errcode == _EVENT_ERR_ABORT)
abort();
else
exit(errcode);
}
Expand Down
29 changes: 29 additions & 0 deletions util-internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 37c3456

Please sign in to comment.