]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
r7326@Kushana: nickm | 2006-08-10 23:50:49 -0700
authorNick Mathewson <nickm@torproject.org>
Fri, 11 Aug 2006 07:09:35 +0000 (07:09 +0000)
committerNick Mathewson <nickm@torproject.org>
Fri, 11 Aug 2006 07:09:35 +0000 (07:09 +0000)
 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

src/common/compat.h
src/common/util.h

index 853bcd0a061aa425941365a272fe177ca63ca4dd..6e9ec38f0171e7e4774e2fdbcb57941bd5816a4c 100644 (file)
@@ -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 */
index da5d31904504e345d57d8f6b6fa9487c766260b4..55c9a7c28c6451472359abb3c54bcca5e6dfeecd 100644 (file)
  */
 #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)