[Libguestfs] [PATCH nbdkit] server: Use GCC hints to move debug and error handling code out of hot paths.

Richard W.M. Jones rjones at redhat.com
Mon Nov 4 21:15:50 UTC 2019


On Mon, Nov 04, 2019 at 01:30:58PM -0600, Eric Blake wrote:
> On 11/2/19 4:24 PM, Richard W.M. Jones wrote:
> >For GCC only, define unlikely() macro.  Use it on error paths to move
> >code out of the hot path.
> >
> >In the server only, use the debug() macro (don't call nbdkit_debug
> >directly).  This macro checks the verbose flag and moves the call to
> >nbdkit_debug out of the hot path.
> >---
> 
> >+++ b/server/internal.h
> >@@ -45,6 +45,17 @@
> >  #include "cleanup.h"
> >  #include "nbd-protocol.h"
> >+/* Define unlikely macro, but only for GCC.  These are used to move
> >+ * debug and error handling code out of hot paths.
> >+ */
> >+#if defined(__GNUC__)
> >+#define unlikely(x) __builtin_expect (!!(x), 0)
> >+#define if_verbose if (unlikely (verbose))
> 
> Doesn't clang define __GNUC__, at which point all of our supported
> compilers (since we require __attribute__((cleanup)) support) also
> have __builtin_expect?
> 
> >+#else
> >+#define unlikely(x) (x)
> >+#define if_verbose if (verbose)
> >+#endif
> 
> Or put another way, this #else may be dead code, and the #if may be
> unnecessary compared to just unconditionally defining unlikely() and
> if_verbose.

Yes ... https://bugs.llvm.org/show_bug.cgi?id=30446

However it seems to be fine in this particular case.  I agree the
other branch is dead code but it's probably best to keep it for future
portability.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-top is 'top' for virtual machines.  Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://people.redhat.com/~rjones/virt-top




More information about the Libguestfs mailing list