[Libguestfs] [PATCH] daemon: Move the useful 'is_zero' function into common code.

Eric Blake eblake at redhat.com
Wed Apr 19 14:35:16 UTC 2017


On 04/19/2017 09:17 AM, Richard W.M. Jones wrote:
> This is largely a simple refactoring, but it combines another
> definition of this function from virt-builder which had a slightly
> different prototype.
> ---

> +/* Return true iff the buffer is all zero bytes.
> + *
> + * Note that gcc is smart enough to optimize this properly:
> + * http://stackoverflow.com/questions/1493936/faster-means-of-checking-for-an-empty-buffer-in-c/1493989#1493989
> + */
> +static inline int
> +is_zero (const char *buffer, size_t size)
> +{
> +  size_t i;
> +
> +  for (i = 0; i < size; ++i) {
> +    if (buffer[i] != 0)
> +      return 0;
> +  }
> +
> +  return 1;
> +}

This is still byte-at-a-time.  Often, you can get even faster results by
exploiting libc's optimizations in memcmp (particularly when it is
comparing pointers with nice alignments), by manually checking that the
first 16 bytes are zero, then letting memcmp do the rest:

size_t i;
size_t limit = MIN(size, 16);
for (i = 0; i < limit; ++i)
  if (buffer[i])
    return 0;
if (size != limit)
  return !memcmp(buffer, buffer + 16, size - 16);
return 1;

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 604 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20170419/945b0fb7/attachment.sig>


More information about the Libguestfs mailing list