diff options
| author | Yaniv Kaul <ykaul@redhat.com> | 2018-11-16 12:32:22 +0200 | 
|---|---|---|
| committer | Amar Tumballi <amarts@redhat.com> | 2018-11-20 03:11:30 +0000 | 
| commit | 5231d3d165135f7aae8716069c67788555332136 (patch) | |
| tree | c35f0831d7a100ddb4cd1d32e813abd9cc0b37c6 | |
| parent | bdf8d8684fa4814cf055350db38f53618c5de6ae (diff) | |
libglusterfs/src/common-utils.h: faster mem_0filled() function
based on the amusing discussion @ https://rusty.ozlabs.org/?p=560
Compile-tested only!
updates: bz#1193929
Signed-off-by: Yaniv Kaul <ykaul@redhat.com>
Change-Id: I1cac54067eb44801b216d5620fc5ee2c89befdd0
| -rw-r--r-- | libglusterfs/src/common-utils.h | 32 | 
1 files changed, 22 insertions, 10 deletions
diff --git a/libglusterfs/src/common-utils.h b/libglusterfs/src/common-utils.h index 51e05515401..c08c16ccedb 100644 --- a/libglusterfs/src/common-utils.h +++ b/libglusterfs/src/common-utils.h @@ -645,19 +645,31 @@ iov_copy(const struct iovec *dst, int dcnt, const struct iovec *src, int scnt)      return ret;  } -static inline int -mem_0filled(const char *buf, size_t size) +/* based on the amusing discussion @ https://rusty.ozlabs.org/?p=560 */ +static bool +memeqzero(const void *data, size_t length)  { -    int i = 0; -    int ret = 0; - -    for (i = 0; i < size; i++) { -        ret = buf[i]; -        if (ret) -            break; +    const unsigned char *p = data; +    size_t len; + +    /* Check first 16 bytes manually */ +    for (len = 0; len < 16; len++) { +        if (!length) +            return true; +        if (*p) +            return false; +        p++; +        length--;      } -    return ret; +    /* Now we know that's zero, memcmp with self. */ +    return memcmp(data, p, length) == 0; +} + +static inline int +mem_0filled(const char *buf, size_t size) +{ +    return !memeqzero(buf, size);  }  static inline int  | 
