diff options
author | Nick Mathewson <nickm@torproject.org> | 2006-08-11 07:09:35 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2006-08-11 07:09:35 +0000 |
commit | ffab3b48a82928e0eb36369eee1e3e56bae0020c (patch) | |
tree | 3ecde5aa972d100805542cd65f2fc101d713cf87 /src/common | |
parent | 4eddbcf2626b1394e1eb1a9c3928002bb346e178 (diff) | |
download | tor-ffab3b48a82928e0eb36369eee1e3e56bae0020c.tar.gz tor-ffab3b48a82928e0eb36369eee1e3e56bae0020c.zip |
r7326@Kushana: nickm | 2006-08-10 23:50:49 -0700
And another GCC change: predict that tor_frees() are usually real frees, and tor_asserts() usually wont happen. Other test should wait till -fprofile-arcs
svn:r7022
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/compat.h | 2 | ||||
-rw-r--r-- | src/common/util.h | 16 |
2 files changed, 13 insertions, 5 deletions
diff --git a/src/common/compat.h b/src/common/compat.h index 853bcd0a06..6e9ec38f01 100644 --- a/src/common/compat.h +++ b/src/common/compat.h @@ -95,11 +95,13 @@ extern INLINE double U64_TO_DBL(uint64_t x) { #define ATTR_PURE __attribute__((pure)) #define ATTR_MALLOC __attribute__((malloc)) #define ATTR_NONNULL(x) __attribute__((nonnull x)) +#define PREDICT(exp, val) __builtin_expect((exp), (val)) #else #define ATTR_NORETURN #define ATTR_PURE #define ATTR_MALLOC #define ATTR_NONNULL(x) +#define PREDICT(exp, val) #endif /* ===== String compatibility */ diff --git a/src/common/util.h b/src/common/util.h index da5d319045..55c9a7c28c 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -38,12 +38,17 @@ */ #error "Sorry; we don't support building with NDEBUG." #else +#ifdef __GNUC__ +#define PREDICT_FALSE(x) PREDICT((x) != ((typeof(x)) 0), 0) +#else +#define PREDICT_FALSE(x) !(x) +#endif #define tor_assert(expr) do { \ - if (!(expr)) { \ + if (PREDICT_FALSE(expr)) { \ log(LOG_ERR, LD_BUG, "%s:%d: %s: Assertion %s failed; aborting.", \ - _SHORT_FILE_, __LINE__, __func__, #expr); \ + _SHORT_FILE_, __LINE__, __func__, #expr); \ fprintf(stderr,"%s:%d %s: Assertion %s failed; aborting.\n", \ - _SHORT_FILE_, __LINE__, __func__, #expr); \ + _SHORT_FILE_, __LINE__, __func__, #expr); \ abort(); \ } } while (0) #endif @@ -74,13 +79,14 @@ void *_tor_memdup(const void *mem, size_t len DMALLOC_PARAMS) extern int dmalloc_free(const char *file, const int line, void *pnt, const int func_id); #define tor_free(p) do { \ - if (p) { \ + if (PREDICT((p)!=NULL, 1) { \ dmalloc_free(_SHORT_FILE_, __LINE__, (p), 0); \ (p)=NULL; \ } \ } while (0) #else -#define tor_free(p) do { if (p) {free(p); (p)=NULL;} } while (0) +#define tor_free(p) do { if (PREDICT((p)!=NULL,1)) { free(p); (p)=NULL;} } \ + while (0) #endif #define tor_malloc(size) _tor_malloc(size DMALLOC_ARGS) |