]> git.sesse.net Git - vlc/commitdiff
likely, unlikely: convenience portability macros for branch prediction
authorRémi Denis-Courmont <remi@remlab.net>
Sun, 6 Dec 2009 08:16:59 +0000 (10:16 +0200)
committerRémi Denis-Courmont <remi@remlab.net>
Sun, 6 Dec 2009 08:48:43 +0000 (10:48 +0200)
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

index e4b1cc5d4eb68f17b56a1d6677e6992d420362a9..82dad3670f8926ff09dc817c24ee164467678c02 100644 (file)
 #   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
  *****************************************************************************/