/*---------------------- posix_memalign ----------------------*/
+#if defined(VGO_solaris)
+#define VG_POSIX_MEMALIGN_SIZE_0_RETURN_NULL 1
+#else
+#define VG_POSIX_MEMALIGN_SIZE_0_RETURN_NULL 0
+#endif
+
#define POSIX_MEMALIGN(soname, fnname) \
\
int VG_REPLACE_FUNCTION_EZU(10160,soname,fnname) \
|| (alignment & (alignment - 1)) != 0) { \
return VKI_EINVAL; \
} \
+ if (VG_POSIX_MEMALIGN_SIZE_0_RETURN_NULL && \
+ size == 0U) { \
+ /* no allocation for zro size on Solaris/Illumos */ \
+ *memptr = NULL; \
+ return 0; \
+ } \
/* Round up to minimum alignment if necessary. */ \
if (alignment < VG_MIN_MALLOC_SZB) \
alignment = VG_MIN_MALLOC_SZB; \
POSIX_MEMALIGN(SO_SYN_MALLOC, posix_memalign);
#elif defined(VGO_darwin)
- //POSIX_MEMALIGN(VG_Z_LIBC_SONAME, posix_memalign);
+#if (DARWIN_VERSIO >= DARWIN_10_6)
+ POSIX_MEMALIGN(VG_Z_LIBC_SONAME, posix_memalign);
+#endif
#elif defined(VGO_solaris)
POSIX_MEMALIGN(VG_Z_LIBC_SONAME, posix_memalign);
# define PM(a,b,c) posix_memalign((void**)a, b, c)
+ // test for size 0
+ res = PM(&p, 64, 0);
+#if defined(VGO_solaris)
+ assert(NULL == p);
+#else
+ assert(0 == res && p && 0 == (long)p % 64);
+#endif
+
res = PM(&p, -1,100); assert(EINVAL == res);
res = PM(&p, 0, 100); assert(EINVAL == res);
res = PM(&p, 1, 100); assert(EINVAL == res);
res = PM(&p, 2, 100); assert(EINVAL == res);
res = PM(&p, 3, 100); assert(EINVAL == res);
res = PM(&p, sizeof(void*), 100);
- assert(0 == res && 0 == (long)p % sizeof(void*));
+ assert(0 == res && p && 0 == (long)p % sizeof(void*));
res = PM(&p, 31, 100); assert(EINVAL == res);
- res = PM(&p, 32, 100); assert(0 == res && 0 == (long)p % 32);
+ res = PM(&p, 32, 100); assert(0 == res && p && 0 == (long)p % 32);
res = PM(&p, 33, 100); assert(EINVAL == res);
res = PM(&p, 4095, 100); assert(EINVAL == res);
- res = PM(&p, 4096, 100); assert(0 == res && 0 == (long)p % 4096);
+ res = PM(&p, 4096, 100); assert(0 == res && p && 0 == (long)p % 4096);
res = PM(&p, 4097, 100); assert(EINVAL == res);
- res = PM(&p, 4 * 1024 * 1024, 100); assert(0 == res
+ res = PM(&p, 4 * 1024 * 1024, 100); assert(0 == res && p
&& 0 == (long)p % (4 * 1024 * 1024));
- res = PM(&p, 16 * 1024 * 1024, 100); assert(0 == res
+ res = PM(&p, 16 * 1024 * 1024, 100); assert(0 == res &&p
&& 0 == (long)p % (16 * 1024 * 1024));
#endif
}