From 827b111356e910800788245bb1a2a22017fea857 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sun, 6 Dec 2009 10:16:59 +0200 Subject: [PATCH] likely, unlikely: convenience portability macros for branch prediction Those are the same as the Linux kernel macros, and probably a bunch of other projects. Usage: if (likely(condition)) branch_likely_taken(); if (unlikely(condition)) branch_unlikely_taken(); Attention: those two macros convert the predicate to a boolean value. Therefore you generally cannot use them for assignments like this: void *p_sys = likely (malloc (sizeof (*p_sys))); if (!p_sys) return VLC_ENOMEM; Instead you can do this: void *p_sys = malloc (sizeof (*p_sys)); if (unlikely (!p_sys)) return VLC_ENOMEM; --- include/vlc_common.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/include/vlc_common.h b/include/vlc_common.h index e4b1cc5d4e..82dad3670f 100644 --- a/include/vlc_common.h +++ b/include/vlc_common.h @@ -69,6 +69,15 @@ # define LIBVLC_MALLOC #endif +/* Branch prediction */ +#ifdef __GNUC__ +# define likely(p) __builtin_expect(!!(p), 1) +# define unlikely(p) __builtin_expect(!!(p), 0) +#else +# define likely(p) (!!(p)) +# define unlikely(p) (!!(p)) +#endif + /***************************************************************************** * Basic types definitions *****************************************************************************/ -- 2.39.2