On 9/17/18 3:39 PM, Nir Soffer wrote:
+#define IS_ALIGNED(size, align) ({ \ + assert (is_power_of_2 ((align))); \ + !((size) & ((align) - 1)); \ +})
But this version will happily accept singed int, and I think this code behavior with signed int is undefined.
Well, sort of. Bit shifts are very likely to hit undefined behavior on ints. But & and | are not shifts.
See https://wiki.sei.cmu.edu/confluence/display/c/INT13-C.+Use+bitwise+operators...
Why use a macro when we can use a function that is likely to be inlined anyway? This is not used in tight loops, so there is no reason to use a macro.
If you want to use a macro, see the kernel align macros:
Alas, the kernel has a more restrictive license (GPLv2 in general); which means we can't copy it into nbdkit. (True, the definitions will look similar, but if we claim we copied from somewhere, that source had better be permissively licensed). -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org