2 // These #defines attempt to ensure that posix_memalign() is declared, and
3 // so no spurious warning is given about using it.
5 // Advertise compliance of the code to the XSI (a POSIX superset that
6 // defines what a system must be like to be called "UNIX")
8 #define _XOPEN_SOURCE 600
10 // Advertise compliance to POSIX
11 #undef _POSIX_C_SOURCE
12 #define _POSIX_C_SOURCE 200112L
17 #include "tests/malloc.h"
22 # if defined(VGO_darwin)
23 // Mac OS X has neither memalign() nor posix_memalign(); do nothing.
24 // Still true for 10.6 / 10.7 ?
27 // Nb: assuming VG_MIN_MALLOC_SZB is 8 or more...
31 assert(sizeof(long int) == sizeof(void*));
33 // Check behaviour of memalign/free for big alignment.
34 // In particular, the below aims at checking that a
35 // superblock with a big size is not marked as reclaimable
36 // if the superblock is used to provide a big aligned block
37 // (see bug 250101, comment #14).
38 // Valgrind m_mallocfree.c will allocate a big superblock for the memalign
39 // call and will split it in two. This splitted superblock was
40 // wrongly marked as reclaimable, which was then causing
41 // assert failures (as reclaimable blocks cannot be splitted).
42 p
= memalign(1024 * 1024, 4 * 1024 * 1024 + 1); assert(0 == (long)p
% (1024 * 1024));
43 // We allocate (and then free) a piece of memory smaller than
44 // the hole created in the big superblock.
45 // If the superblock is marked as reclaimable, the below free(s) will cause
46 // an assert. Note that the test has to be run with a --free-list-vol
47 // parameter smaller than the released blocks size to ensure the free is directly
48 // executed (otherwise memcheck does not really release the memory and so
49 // the bug is not properly tested).
50 piece
= malloc(1024 * 1000); assert (piece
);
54 // Same as above but do the free in the reverse order.
55 p
= memalign(1024 * 1024, 4 * 1024 * 1024 + 1); assert(0 == (long)p
% (1024 * 1024));
56 piece
= malloc(1024 * 100); assert (piece
);
60 p
= memalign(0, 100); assert(0 == (long)p
% 8);
61 p
= memalign(1, 100); assert(0 == (long)p
% 8);
62 p
= memalign(2, 100); assert(0 == (long)p
% 8);
63 p
= memalign(3, 100); assert(0 == (long)p
% 8);
64 p
= memalign(4, 100); assert(0 == (long)p
% 8);
65 p
= memalign(5, 100); assert(0 == (long)p
% 8);
67 p
= memalign(7, 100); assert(0 == (long)p
% 8);
68 p
= memalign(8, 100); assert(0 == (long)p
% 8);
69 p
= memalign(9, 100); assert(0 == (long)p
% 16);
71 p
= memalign(31, 100); assert(0 == (long)p
% 32);
72 p
= memalign(32, 100); assert(0 == (long)p
% 32);
73 p
= memalign(33, 100); assert(0 == (long)p
% 64);
75 p
= memalign(4095, 100); assert(0 == (long)p
% 4096);
76 p
= memalign(4096, 100); assert(0 == (long)p
% 4096);
77 p
= memalign(4097, 100); assert(0 == (long)p
% 8192);
79 p
= memalign(4 * 1024 * 1024, 100); assert(0 == (long)p
% (4 * 1024 * 1024));
80 p
= memalign(16 * 1024 * 1024, 100); assert(0 == (long)p
% (16 * 1024 * 1024));
82 # define PM(a,b,c) posix_memalign((void**)a, b, c)
84 res
= PM(&p
, -1,100); assert(EINVAL
== res
);
85 res
= PM(&p
, 0, 100); assert(0 == res
&& 0 == (long)p
% 8);
86 res
= PM(&p
, 1, 100); assert(EINVAL
== res
);
87 res
= PM(&p
, 2, 100); assert(EINVAL
== res
);
88 res
= PM(&p
, 3, 100); assert(EINVAL
== res
);
89 res
= PM(&p
, sizeof(void*), 100);
90 assert(0 == res
&& 0 == (long)p
% sizeof(void*));
92 res
= PM(&p
, 31, 100); assert(EINVAL
== res
);
93 res
= PM(&p
, 32, 100); assert(0 == res
&& 0 == (long)p
% 32);
94 res
= PM(&p
, 33, 100); assert(EINVAL
== res
);
96 res
= PM(&p
, 4095, 100); assert(EINVAL
== res
);
97 res
= PM(&p
, 4096, 100); assert(0 == res
&& 0 == (long)p
% 4096);
98 res
= PM(&p
, 4097, 100); assert(EINVAL
== res
);
100 res
= PM(&p
, 4 * 1024 * 1024, 100); assert(0 == res
101 && 0 == (long)p
% (4 * 1024 * 1024));
102 res
= PM(&p
, 16 * 1024 * 1024, 100); assert(0 == res
103 && 0 == (long)p
% (16 * 1024 * 1024));