3 /* Test that low-latency realloc and free chains are sound. */
8 #pragma omp requires dynamic_allocators
11 check (int cond
, const char *msg
)
15 __builtin_printf ("%s\n", msg
);
23 if (omp_get_initial_device () == omp_get_default_device ())
24 return 0; /* This test isn't interesting with host-fallback. */
28 /* Ensure that the memory we get *is* low-latency with a null-fallback. */
29 omp_alloctrait_t traits
[2]
30 = { { omp_atk_fallback
, omp_atv_null_fb
},
31 { omp_atk_access
, omp_atv_cgroup
} };
32 omp_allocator_handle_t lowlat
= omp_init_allocator (omp_low_lat_mem_space
,
37 char *a
= (char *) omp_alloc (size
, lowlat
);
38 char *b
= (char *) omp_alloc (size
, lowlat
);
39 char *c
= (char *) omp_alloc (size
, lowlat
);
40 char *d
= (char *) omp_alloc (size
, lowlat
);
42 /* There are headers and padding to account for. */
43 int size2
= size
+ (b
-a
);
44 int size3
= size
+ (c
-a
);
45 int size4
= size
+ (d
-a
) + 100; /* Random larger amount. */
47 check (a
!= NULL
&& b
!= NULL
&& c
!= NULL
&& d
!= NULL
,
48 "omp_alloc returned NULL\n");
50 char *p
= omp_realloc (b
, size
, lowlat
, lowlat
);
51 check (p
== b
, "realloc did not reuse same size chunk, no space after");
53 p
= omp_realloc (b
, size
-8, lowlat
, lowlat
);
54 check (p
== b
, "realloc did not reuse smaller chunk, no space after");
56 p
= omp_realloc (b
, size
, lowlat
, lowlat
);
57 check (p
== b
, "realloc did not reuse original size chunk, no space after");
59 /* Make space after b. */
62 p
= omp_realloc (b
, size
, lowlat
, lowlat
);
63 check (p
== b
, "realloc did not reuse same size chunk");
65 p
= omp_realloc (b
, size
-8, lowlat
, lowlat
);
66 check (p
== b
, "realloc did not reuse smaller chunk");
68 p
= omp_realloc (b
, size
, lowlat
, lowlat
);
69 check (p
== b
, "realloc did not reuse original size chunk");
71 p
= omp_realloc (b
, size
+8, lowlat
, lowlat
);
72 check (p
== b
, "realloc did not extend in place by a little");
74 p
= omp_realloc (b
, size2
, lowlat
, lowlat
);
75 check (p
== b
, "realloc did not extend into whole next chunk");
77 p
= omp_realloc (b
, size3
, lowlat
, lowlat
);
78 check (p
!= b
, "realloc did not move b elsewhere");
82 p
= omp_realloc (a
, size
, lowlat
, lowlat
);
83 check (p
== a
, "realloc did not reuse same size chunk, first position");
85 p
= omp_realloc (a
, size
-8, lowlat
, lowlat
);
86 check (p
== a
, "realloc did not reuse smaller chunk, first position");
88 p
= omp_realloc (a
, size
, lowlat
, lowlat
);
89 check (p
== a
, "realloc did not reuse original size chunk, first position");
91 p
= omp_realloc (a
, size
+8, lowlat
, lowlat
);
92 check (p
== a
, "realloc did not extend in place by a little, first position");
94 p
= omp_realloc (a
, size3
, lowlat
, lowlat
);
95 check (p
== a
, "realloc did not extend into whole next chunk, first position");
97 p
= omp_realloc (a
, size4
, lowlat
, lowlat
);
98 check (p
!= a
, "realloc did not move a elsewhere, first position");
102 p
= omp_realloc (d
, size
, lowlat
, lowlat
);
103 check (p
== d
, "realloc did not reuse same size chunk, last position");
105 p
= omp_realloc (d
, size
-8, lowlat
, lowlat
);
106 check (p
== d
, "realloc did not reuse smaller chunk, last position");
108 p
= omp_realloc (d
, size
, lowlat
, lowlat
);
109 check (p
== d
, "realloc did not reuse original size chunk, last position");
111 p
= omp_realloc (d
, size
+8, lowlat
, lowlat
);
112 check (p
== d
, "realloc did not extend in place by d little, last position");
114 /* Larger than low latency memory. */
115 p
= omp_realloc (d
, 100000000, lowlat
, lowlat
);
116 check (p
== NULL
, "realloc did not fail on OOM");