[libdispatch-dev] fastpath() and slowpath() usage

Mark Heily mark at heily.com
Sat Jul 17 12:18:24 PDT 2010

I've noticed some strange usage of the fastpath() and slowpath() macros in 
the libdispatch sources. These are wrappers for the __builtin_expect() 
branch prediction macro and defined as:

     #define fastpath(x)	((typeof(x))__builtin_expect((long)(x), ~0l))
     #define slowpath(x)	((typeof(x))__builtin_expect((long)(x), 0l))

Everything I have read about __builtin_expect() says that it should be used 
within a conditional expression, like this:

     if (__builtin_expect(foo == NULL, 0)) {
              /* fast path */
     } else {
              /* slow path */

There are several cases in libdispatch where the __builtin_expect() macro is 
used separately from the conditional. Here's one example from semaphore.c:

	dispatch_semaphore_t dsema;
         dsema = fastpath(_dispatch_thread_getspecific(dispatch_sema4_key));

         if (!dsema) {
        	        while (!(dsema = dispatch_semaphore_create(0))) {
        _dispatch_thread_setspecific(dispatch_sema4_key, NULL);
        return dsema;

Can anyone explain the reason for using __builtin_expect() in this manner, 
and what the practical effect is?


  - Mark

More information about the libdispatch-dev mailing list