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;
# define LIBVLC_MALLOC
#endif
# 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
*****************************************************************************/
/*****************************************************************************
* Basic types definitions
*****************************************************************************/