49 CX_TEST_ASSERT(pool->data != NULL); |
62 CX_TEST_ASSERT(pool->data != NULL); |
50 } |
63 } |
51 cxMempoolFree(pool); |
64 cxMempoolFree(pool); |
52 } |
65 } |
53 |
66 |
|
67 static CX_TEST_SUBROUTINE(test_mempool_malloc_verify, CxMempool *pool) { |
|
68 CX_TEST_ASSERT(cxMalloc(pool->allocator, sizeof(int)) != NULL); |
|
69 CX_TEST_ASSERT(cxMalloc(pool->allocator, sizeof(int)) != NULL); |
|
70 CX_TEST_ASSERT(pool->size == 2); |
|
71 CX_TEST_ASSERT(pool->capacity == 4); |
|
72 CX_TEST_ASSERT(cxMalloc(pool->allocator, sizeof(int)) != NULL); |
|
73 CX_TEST_ASSERT(cxMalloc(pool->allocator, sizeof(int)) != NULL); |
|
74 CX_TEST_ASSERT(pool->size == 4); |
|
75 CX_TEST_ASSERT(pool->capacity == 4); |
|
76 CX_TEST_ASSERT(cxMalloc(pool->allocator, sizeof(int)) != NULL); |
|
77 int *i = cxMalloc(pool->allocator, sizeof(int)); |
|
78 CX_TEST_ASSERT(i != NULL); |
|
79 *i = 4083914; // let asan / valgrind check |
|
80 CX_TEST_ASSERT(pool->size == 6); |
|
81 CX_TEST_ASSERT(pool->capacity >= 6); |
|
82 } |
|
83 |
|
84 CX_TEST(test_mempool_malloc0) { |
|
85 CxMempool *pool = cxMempoolCreatePure(4); |
|
86 CX_TEST_DO { |
|
87 CX_TEST_CALL_SUBROUTINE(test_mempool_malloc_verify, pool); |
|
88 } |
|
89 cxMempoolFree(pool); |
|
90 } |
|
91 |
54 CX_TEST(test_mempool_malloc) { |
92 CX_TEST(test_mempool_malloc) { |
55 CxMempool *pool = cxMempoolCreateSimple(4); |
93 CxMempool *pool = cxMempoolCreateSimple(4); |
56 CX_TEST_DO { |
94 CX_TEST_DO { |
57 CX_TEST_ASSERT(cxMalloc(pool->allocator, sizeof(int)) != NULL); |
95 CX_TEST_CALL_SUBROUTINE(test_mempool_malloc_verify, pool); |
58 CX_TEST_ASSERT(cxMalloc(pool->allocator, sizeof(int)) != NULL); |
96 } |
59 CX_TEST_ASSERT(pool->size == 2); |
97 cxMempoolFree(pool); |
60 CX_TEST_ASSERT(pool->capacity == 4); |
98 } |
61 CX_TEST_ASSERT(cxMalloc(pool->allocator, sizeof(int)) != NULL); |
99 |
62 CX_TEST_ASSERT(cxMalloc(pool->allocator, sizeof(int)) != NULL); |
100 CX_TEST(test_mempool_malloc2) { |
63 CX_TEST_ASSERT(pool->size == 4); |
101 CxMempool *pool = cxMempoolCreateAdvanced(4); |
64 CX_TEST_ASSERT(pool->capacity == 4); |
102 CX_TEST_DO { |
65 CX_TEST_ASSERT(cxMalloc(pool->allocator, sizeof(int)) != NULL); |
103 CX_TEST_CALL_SUBROUTINE(test_mempool_malloc_verify, pool); |
66 CX_TEST_ASSERT(cxMalloc(pool->allocator, sizeof(int)) != NULL); |
104 } |
67 CX_TEST_ASSERT(pool->size == 6); |
105 cxMempoolFree(pool); |
68 CX_TEST_ASSERT(pool->capacity >= 6); |
106 } |
|
107 |
|
108 static CX_TEST_SUBROUTINE(test_mempool_calloc_verify, CxMempool *pool) { |
|
109 int *test = cxCalloc(pool->allocator, 2, sizeof(int)); |
|
110 CX_TEST_ASSERT(test != NULL); |
|
111 CX_TEST_ASSERT(test[0] == 0); |
|
112 CX_TEST_ASSERT(test[1] == 0); |
|
113 #if __GNUC__ > 11 |
|
114 // we want to explicitly test the overflow |
|
115 #pragma GCC diagnostic push |
|
116 #pragma GCC diagnostic ignored "-Walloc-size-larger-than=" |
|
117 #endif |
|
118 errno = 0; |
|
119 CX_TEST_ASSERT(NULL == cxCalloc(pool->allocator, SIZE_MAX / 2, sizeof(int))); |
|
120 CX_TEST_ASSERT(errno == EOVERFLOW); |
|
121 #if __GNUC__ > 11 |
|
122 #pragma GCC diagnostic pop |
|
123 #endif |
|
124 } |
|
125 |
|
126 CX_TEST(test_mempool_calloc0) { |
|
127 CxMempool *pool = cxMempoolCreatePure(4); |
|
128 CX_TEST_DO { |
|
129 CX_TEST_CALL_SUBROUTINE(test_mempool_calloc_verify, pool); |
69 } |
130 } |
70 cxMempoolFree(pool); |
131 cxMempoolFree(pool); |
71 } |
132 } |
72 |
133 |
73 CX_TEST(test_mempool_calloc) { |
134 CX_TEST(test_mempool_calloc) { |
74 CxMempool *pool = cxMempoolCreateSimple(4); |
135 CxMempool *pool = cxMempoolCreateSimple(4); |
75 CX_TEST_DO { |
136 CX_TEST_DO { |
76 int *test = cxCalloc(pool->allocator, 2, sizeof(int)); |
137 CX_TEST_CALL_SUBROUTINE(test_mempool_calloc_verify, pool); |
77 CX_TEST_ASSERT(test != NULL); |
138 } |
78 CX_TEST_ASSERT(test[0] == 0); |
139 cxMempoolFree(pool); |
79 CX_TEST_ASSERT(test[1] == 0); |
140 } |
80 } |
141 |
81 cxMempoolFree(pool); |
142 CX_TEST(test_mempool_calloc2) { |
82 } |
143 CxMempool *pool = cxMempoolCreateAdvanced(4); |
83 |
144 CX_TEST_DO { |
84 static unsigned test_mempool_destructor_called; |
145 CX_TEST_CALL_SUBROUTINE(test_mempool_calloc_verify, pool); |
85 |
146 } |
86 static void test_mempool_destructor(cx_attr_unused void *mem) { |
147 cxMempoolFree(pool); |
87 test_mempool_destructor_called++; |
148 } |
88 } |
149 |
89 |
150 static CX_TEST_SUBROUTINE(test_mempool_realloc_verify, CxMempool *pool, enum cx_mempool_type type) { |
90 CX_TEST(test_mempool_realloc) { |
151 // use realloc with NULL which shall behave as a malloc |
91 CxMempool *pool = cxMempoolCreateSimple(4); |
152 int *data = cxRealloc(pool->allocator, NULL, 2*sizeof(int)); |
92 cxMempoolGlobalDestructor(pool, test_mempool_destructor); |
153 if (type == CX_MEMPOOL_TYPE_SIMPLE) { |
93 CX_TEST_DO { |
154 cxMempoolSetDestructor(data, test_mempool_destructor); |
94 CX_TEST_ASSERT(pool->destr == test_mempool_destructor); |
155 } else if (type == CX_MEMPOOL_TYPE_ADVANCED) { |
95 int *data = cxMalloc(pool->allocator, sizeof(int)); |
156 cxMempoolSetDestructor2(data, test_mempool_destructor2, &test_mempool_destructor_called); |
96 *data = 13; |
157 } |
97 |
158 *data = 13; |
98 int *rdata = data; |
159 |
99 unsigned n = 1; |
160 // shrink to actual sizeof(int) |
100 while (rdata == data) { |
161 data = cxRealloc(pool->allocator, data, sizeof(int)); |
101 n <<= 1; |
162 CX_TEST_ASSERT(*data == 13); |
102 // eventually the memory should be moved elsewhere |
163 |
103 CX_TEST_ASSERTM(n < 65536, "Reallocation attempt failed - test not executable"); |
164 // realloc with the same size (should not do anything) |
104 rdata = cxRealloc(pool->allocator, data, n * sizeof(intptr_t)); |
165 data = cxRealloc(pool->allocator, data, sizeof(int)); |
105 } |
166 CX_TEST_ASSERT(*data == 13); |
106 |
167 |
107 CX_TEST_ASSERT(*rdata == 13); |
168 // now try hard to trigger a memmove |
108 // test if destructor is still intact |
169 int *rdata = data; |
|
170 unsigned n = 1; |
|
171 while (rdata == data) { |
|
172 n <<= 1; |
|
173 // eventually the memory should be moved elsewhere |
|
174 CX_TEST_ASSERTM(n < 65536, "Reallocation attempt failed - test not executable"); |
|
175 rdata = cxRealloc(pool->allocator, data, n * sizeof(intptr_t)); |
|
176 } |
|
177 |
|
178 CX_TEST_ASSERT(*rdata == 13); |
|
179 // test if destructor is still intact |
|
180 if (type != CX_MEMPOOL_TYPE_PURE) { |
109 test_mempool_destructor_called = 0; |
181 test_mempool_destructor_called = 0; |
110 cxFree(pool->allocator, rdata); |
182 cxFree(pool->allocator, rdata); |
111 CX_TEST_ASSERT(test_mempool_destructor_called == 1); |
183 CX_TEST_ASSERT(test_mempool_destructor_called == 1); |
112 } |
184 } |
113 cxMempoolFree(pool); |
185 } |
114 } |
186 |
115 |
187 CX_TEST(test_mempool_realloc0) { |
|
188 CxMempool *pool = cxMempoolCreatePure(4); |
|
189 CX_TEST_DO { |
|
190 CX_TEST_CALL_SUBROUTINE(test_mempool_realloc_verify, pool, CX_MEMPOOL_TYPE_PURE); |
|
191 } |
|
192 cxMempoolFree(pool); |
|
193 } |
|
194 |
|
195 CX_TEST(test_mempool_realloc) { |
|
196 CxMempool *pool = cxMempoolCreateSimple(4); |
|
197 CX_TEST_DO { |
|
198 CX_TEST_CALL_SUBROUTINE(test_mempool_realloc_verify, pool, CX_MEMPOOL_TYPE_SIMPLE); |
|
199 } |
|
200 cxMempoolFree(pool); |
|
201 } |
|
202 |
|
203 CX_TEST(test_mempool_realloc2) { |
|
204 CxMempool *pool = cxMempoolCreateAdvanced(4); |
|
205 CX_TEST_DO { |
|
206 CX_TEST_CALL_SUBROUTINE(test_mempool_realloc_verify, pool, CX_MEMPOOL_TYPE_ADVANCED); |
|
207 } |
|
208 cxMempoolFree(pool); |
|
209 } |
|
210 |
|
211 static CX_TEST_SUBROUTINE(test_mempool_free_verify, CxMempool *pool) { |
|
212 void *mem1, *mem2; |
|
213 mem1 = cxMalloc(pool->allocator, 16); |
|
214 cxFree(pool->allocator, mem1); |
|
215 CX_TEST_ASSERT(pool->size == 0); |
|
216 |
|
217 mem1 = cxMalloc(pool->allocator, 16); |
|
218 mem1 = cxMalloc(pool->allocator, 16); |
|
219 mem1 = cxMalloc(pool->allocator, 16); |
|
220 mem2 = cxMalloc(pool->allocator, 16); |
|
221 mem2 = cxMalloc(pool->allocator, 16); |
|
222 |
|
223 CX_TEST_ASSERT(pool->size == 5); |
|
224 // a realloc with size zero shall behave like a free |
|
225 void *freed = cxRealloc(pool->allocator, mem1, 0); |
|
226 CX_TEST_ASSERT(freed == NULL); |
|
227 CX_TEST_ASSERT(pool->size == 4); |
|
228 cxFree(pool->allocator, mem2); |
|
229 CX_TEST_ASSERT(pool->size == 3); |
|
230 } |
|
231 |
|
232 CX_TEST(test_mempool_free0) { |
|
233 CxMempool *pool = cxMempoolCreatePure(4); |
|
234 CX_TEST_DO { |
|
235 CX_TEST_CALL_SUBROUTINE(test_mempool_free_verify, pool); |
|
236 } |
|
237 cxMempoolFree(pool); |
|
238 } |
116 |
239 |
117 CX_TEST(test_mempool_free) { |
240 CX_TEST(test_mempool_free) { |
118 CxMempool *pool = cxMempoolCreateSimple(4); |
241 CxMempool *pool = cxMempoolCreateSimple(4); |
119 void *mem1, *mem2; |
242 CX_TEST_DO { |
120 CX_TEST_DO { |
243 CX_TEST_CALL_SUBROUTINE(test_mempool_free_verify, pool); |
121 mem1 = cxMalloc(pool->allocator, 16); |
244 } |
122 cxFree(pool->allocator, mem1); |
245 cxMempoolFree(pool); |
123 CX_TEST_ASSERT(pool->size == 0); |
246 } |
124 |
247 |
125 mem1 = cxMalloc(pool->allocator, 16); |
248 CX_TEST(test_mempool_free2) { |
126 mem1 = cxMalloc(pool->allocator, 16); |
249 CxMempool *pool = cxMempoolCreateAdvanced(4); |
127 mem1 = cxMalloc(pool->allocator, 16); |
250 CX_TEST_DO { |
128 mem2 = cxMalloc(pool->allocator, 16); |
251 CX_TEST_CALL_SUBROUTINE(test_mempool_free_verify, pool); |
129 mem2 = cxMalloc(pool->allocator, 16); |
|
130 |
|
131 CX_TEST_ASSERT(pool->size == 5); |
|
132 cxFree(pool->allocator, mem1); |
|
133 CX_TEST_ASSERT(pool->size == 4); |
|
134 cxFree(pool->allocator, mem2); |
|
135 CX_TEST_ASSERT(pool->size == 3); |
|
136 } |
252 } |
137 cxMempoolFree(pool); |
253 cxMempoolFree(pool); |
138 } |
254 } |
139 |
255 |
140 CX_TEST(test_mempool_destroy) { |
256 CX_TEST(test_mempool_destroy) { |
152 cxMempoolFree(pool); |
268 cxMempoolFree(pool); |
153 CX_TEST_ASSERT(test_mempool_destructor_called == 2); |
269 CX_TEST_ASSERT(test_mempool_destructor_called == 2); |
154 } |
270 } |
155 } |
271 } |
156 |
272 |
|
273 CX_TEST(test_mempool_destroy2) { |
|
274 CxMempool *pool = cxMempoolCreateAdvanced(4); |
|
275 CX_TEST_DO { |
|
276 int *data = cxMalloc(pool->allocator, sizeof(int)); |
|
277 int ctr = 0; |
|
278 *data = 47; |
|
279 cxMempoolSetDestructor2(data, test_mempool_destructor2, &ctr); |
|
280 CX_TEST_ASSERT(*data == 47); |
|
281 cxFree(pool->allocator, data); |
|
282 CX_TEST_ASSERT(ctr == 1); |
|
283 data = cxMalloc(pool->allocator, sizeof(int)); |
|
284 cxMempoolSetDestructor2(data, test_mempool_destructor2, &ctr); |
|
285 cxMempoolFree(pool); |
|
286 CX_TEST_ASSERT(ctr == 2); |
|
287 } |
|
288 } |
|
289 |
|
290 CX_TEST(test_mempool_remove_destructor) { |
|
291 CxMempool *pool = cxMempoolCreateSimple(4); |
|
292 CX_TEST_DO { |
|
293 int *data = cxMalloc(pool->allocator, sizeof(int)); |
|
294 *data = 13; |
|
295 cxMempoolSetDestructor(data, test_mempool_destructor); |
|
296 CX_TEST_ASSERT(*data == 13); |
|
297 cxMempoolRemoveDestructor(data); |
|
298 CX_TEST_ASSERT(*data == 13); |
|
299 test_mempool_destructor_called = 0; |
|
300 cxFree(pool->allocator, data); |
|
301 CX_TEST_ASSERT(test_mempool_destructor_called == 0); |
|
302 data = cxMalloc(pool->allocator, sizeof(int)); |
|
303 *data = 99; |
|
304 cxMempoolSetDestructor(data, test_mempool_destructor); |
|
305 cxMempoolRemoveDestructor(data); |
|
306 CX_TEST_ASSERT(*data == 99); |
|
307 cxMempoolFree(pool); |
|
308 CX_TEST_ASSERT(test_mempool_destructor_called == 0); |
|
309 } |
|
310 } |
|
311 |
|
312 CX_TEST(test_mempool_remove_destructor2) { |
|
313 CxMempool *pool = cxMempoolCreateAdvanced(4); |
|
314 CX_TEST_DO { |
|
315 int *data = cxMalloc(pool->allocator, sizeof(int)); |
|
316 int ctr = 0; |
|
317 *data = 47; |
|
318 cxMempoolSetDestructor2(data, test_mempool_destructor2, &ctr); |
|
319 CX_TEST_ASSERT(*data == 47); |
|
320 cxMempoolRemoveDestructor2(data); |
|
321 CX_TEST_ASSERT(*data == 47); |
|
322 cxFree(pool->allocator, data); |
|
323 CX_TEST_ASSERT(ctr == 0); |
|
324 data = cxMalloc(pool->allocator, sizeof(int)); |
|
325 *data = 99; |
|
326 cxMempoolSetDestructor2(data, test_mempool_destructor2, &ctr); |
|
327 cxMempoolRemoveDestructor2(data); |
|
328 CX_TEST_ASSERT(*data == 99); |
|
329 cxMempoolFree(pool); |
|
330 CX_TEST_ASSERT(ctr == 0); |
|
331 } |
|
332 } |
|
333 |
|
334 static CX_TEST_SUBROUTINE(test_mempool_global_destructors_verify, CxMempool *pool) { |
|
335 int *data = cxMalloc(pool->allocator, sizeof(int)); |
|
336 int ctr = 0; |
|
337 cxMempoolGlobalDestructor(pool, test_mempool_destructor); |
|
338 cxMempoolGlobalDestructor2(pool, test_mempool_destructor2, &ctr); |
|
339 test_mempool_destructor_called = 0; |
|
340 cxFree(pool->allocator, data); |
|
341 CX_TEST_ASSERT(ctr == 1); |
|
342 CX_TEST_ASSERT(test_mempool_destructor_called == 1); |
|
343 data = cxMalloc(pool->allocator, sizeof(int)); |
|
344 cxMempoolFree(pool); |
|
345 CX_TEST_ASSERT(ctr == 2); |
|
346 CX_TEST_ASSERT(test_mempool_destructor_called == 2); |
|
347 } |
|
348 |
|
349 CX_TEST(test_mempool_global_destructors0) { |
|
350 CxMempool *pool = cxMempoolCreatePure(4); |
|
351 CX_TEST_DO { |
|
352 CX_TEST_CALL_SUBROUTINE(test_mempool_global_destructors_verify, pool); |
|
353 } |
|
354 } |
|
355 |
|
356 CX_TEST(test_mempool_global_destructors) { |
|
357 CxMempool *pool = cxMempoolCreateSimple(4); |
|
358 CX_TEST_DO { |
|
359 CX_TEST_CALL_SUBROUTINE(test_mempool_global_destructors_verify, pool); |
|
360 } |
|
361 } |
|
362 |
|
363 CX_TEST(test_mempool_global_destructors2) { |
|
364 CxMempool *pool = cxMempoolCreateAdvanced(4); |
|
365 CX_TEST_DO { |
|
366 CX_TEST_CALL_SUBROUTINE(test_mempool_global_destructors_verify, pool); |
|
367 } |
|
368 } |
|
369 |
157 CX_TEST(test_mempool_register) { |
370 CX_TEST(test_mempool_register) { |
|
371 CxMempool *pool = cxMempoolCreateAdvanced(4); |
|
372 CX_TEST_DO { |
|
373 int *data = cxMalloc(pool->allocator, sizeof(int)); |
|
374 test_mempool_destructor_called = 0; |
|
375 cxMempoolSetDestructor2(data, test_mempool_destructor2, &test_mempool_destructor_called); |
|
376 int donotfree = 0; |
|
377 cxMempoolRegister(pool, &donotfree, test_mempool_destructor); |
|
378 cxMempoolFree(pool); |
|
379 CX_TEST_ASSERT(test_mempool_destructor_called == 2); |
|
380 } |
|
381 } |
|
382 |
|
383 CX_TEST(test_mempool_register2) { |
158 CxMempool *pool = cxMempoolCreateSimple(4); |
384 CxMempool *pool = cxMempoolCreateSimple(4); |
159 CX_TEST_DO { |
385 CX_TEST_DO { |
160 int *data = cxMalloc(pool->allocator, sizeof(int)); |
386 int *data = cxMalloc(pool->allocator, sizeof(int)); |
161 test_mempool_destructor_called = 0; |
387 test_mempool_destructor_called = 0; |
162 cxMempoolSetDestructor(data, test_mempool_destructor); |
388 cxMempoolSetDestructor(data, test_mempool_destructor); |
163 int donotfree = 0; |
389 int donotfree = 0; |
164 cxMempoolRegister(pool, &donotfree, test_mempool_destructor); |
390 cxMempoolRegister2(pool, &donotfree, test_mempool_destructor2, &test_mempool_destructor_called); |
165 cxMempoolFree(pool); |
391 cxMempoolFree(pool); |
166 CX_TEST_ASSERT(test_mempool_destructor_called == 2); |
392 CX_TEST_ASSERT(test_mempool_destructor_called == 2); |
167 } |
393 } |
168 } |
394 } |
169 |
395 |
220 |
446 |
221 CX_TEST(test_mempool_transfer_object) { |
447 CX_TEST(test_mempool_transfer_object) { |
222 CxMempool *src = cxMempoolCreateSimple(4); |
448 CxMempool *src = cxMempoolCreateSimple(4); |
223 CxMempool *dest = cxMempoolCreateSimple(4); |
449 CxMempool *dest = cxMempoolCreateSimple(4); |
224 CX_TEST_DO { |
450 CX_TEST_DO { |
|
451 int *a = cxMalloc(src->allocator, sizeof(int)); |
225 int *b = cxMalloc(src->allocator, sizeof(int)); |
452 int *b = cxMalloc(src->allocator, sizeof(int)); |
226 b = cxMalloc(src->allocator, sizeof(int)); |
|
227 int *c = malloc(sizeof(int)); |
453 int *c = malloc(sizeof(int)); |
228 cxMempoolRegister(src, c, free); |
454 cxMempoolRegister(src, c, free); |
|
455 int *d = malloc(sizeof(int)); |
|
456 cxMempoolRegister(src, d, free); |
229 CX_TEST_ASSERT(src->size == 2); |
457 CX_TEST_ASSERT(src->size == 2); |
230 CX_TEST_ASSERT(src->registered_size == 1); |
458 CX_TEST_ASSERT(src->registered_size == 2); |
231 |
459 |
232 int result = cxMempoolTransferObject(src, dest, b); |
460 int result = cxMempoolTransferObject(src, dest, a); |
233 CX_TEST_ASSERT(result == 0); |
461 CX_TEST_ASSERT(result == 0); |
234 CX_TEST_ASSERT(src->size == 1); |
462 CX_TEST_ASSERT(src->size == 1); |
|
463 CX_TEST_ASSERT(src->registered_size == 2); |
235 CX_TEST_ASSERT(dest->size == 1); |
464 CX_TEST_ASSERT(dest->size == 1); |
236 result = cxMempoolTransferObject(src, dest, b); |
465 CX_TEST_ASSERT(dest->registered_size == 0); |
|
466 result = cxMempoolTransferObject(src, dest, a); |
237 CX_TEST_ASSERT(result != 0); |
467 CX_TEST_ASSERT(result != 0); |
238 CX_TEST_ASSERT(src->size == 1); |
468 CX_TEST_ASSERT(src->size == 1); |
|
469 CX_TEST_ASSERT(src->registered_size == 2); |
239 CX_TEST_ASSERT(dest->size == 1); |
470 CX_TEST_ASSERT(dest->size == 1); |
|
471 CX_TEST_ASSERT(dest->registered_size == 0); |
240 |
472 |
241 // can also transfer foreign memory this way |
473 // can also transfer foreign memory this way |
242 CX_TEST_ASSERT(src->registered_size == 1); |
|
243 CX_TEST_ASSERT(dest->registered_size == 0); |
|
244 result = cxMempoolTransferObject(src, dest, c); |
474 result = cxMempoolTransferObject(src, dest, c); |
245 CX_TEST_ASSERT(result == 0); |
475 CX_TEST_ASSERT(result == 0); |
246 CX_TEST_ASSERT(src->registered_size == 0); |
476 CX_TEST_ASSERT(src->size == 1); |
|
477 CX_TEST_ASSERT(src->registered_size == 1); |
|
478 CX_TEST_ASSERT(dest->size == 1); |
247 CX_TEST_ASSERT(dest->registered_size == 1); |
479 CX_TEST_ASSERT(dest->registered_size == 1); |
248 |
480 |
|
481 // src==dest is an error |
249 result = cxMempoolTransferObject(dest, dest, b); |
482 result = cxMempoolTransferObject(dest, dest, b); |
250 CX_TEST_ASSERT(result != 0); |
483 CX_TEST_ASSERT(result != 0); |
251 CX_TEST_ASSERT(src->size == 1); |
484 CX_TEST_ASSERT(src->size == 1); |
252 CX_TEST_ASSERT(dest->size == 1); |
485 CX_TEST_ASSERT(dest->size == 1); |
|
486 |
|
487 // check that we don't die when we free memory that's still in the source pool |
|
488 cxFree(src->allocator, b); |
253 } |
489 } |
254 cxMempoolFree(src); |
490 cxMempoolFree(src); |
255 cxMempoolFree(dest); |
491 cxMempoolFree(dest); |
256 // let valgrind check that everything worked |
492 // let valgrind check that everything else worked |
257 } |
493 } |
258 |
494 |
259 CxTestSuite *cx_test_suite_mempool(void) { |
495 CxTestSuite *cx_test_suite_mempool(void) { |
260 CxTestSuite *suite = cx_test_suite_new("mempool"); |
496 CxTestSuite *suite = cx_test_suite_new("mempool"); |
261 |
497 |
262 cx_test_register(suite, test_mempool_create); |
498 cx_test_register(suite, test_mempool_create); |
|
499 cx_test_register(suite, test_mempool_malloc0); |
|
500 cx_test_register(suite, test_mempool_calloc0); |
|
501 cx_test_register(suite, test_mempool_realloc0); |
|
502 cx_test_register(suite, test_mempool_free0); |
263 cx_test_register(suite, test_mempool_malloc); |
503 cx_test_register(suite, test_mempool_malloc); |
264 cx_test_register(suite, test_mempool_calloc); |
504 cx_test_register(suite, test_mempool_calloc); |
265 cx_test_register(suite, test_mempool_realloc); |
505 cx_test_register(suite, test_mempool_realloc); |
266 cx_test_register(suite, test_mempool_free); |
506 cx_test_register(suite, test_mempool_free); |
267 cx_test_register(suite, test_mempool_destroy); |
507 cx_test_register(suite, test_mempool_destroy); |
|
508 cx_test_register(suite, test_mempool_malloc2); |
|
509 cx_test_register(suite, test_mempool_calloc2); |
|
510 cx_test_register(suite, test_mempool_realloc2); |
|
511 cx_test_register(suite, test_mempool_free2); |
|
512 cx_test_register(suite, test_mempool_destroy2); |
|
513 cx_test_register(suite, test_mempool_remove_destructor); |
|
514 cx_test_register(suite, test_mempool_remove_destructor2); |
|
515 cx_test_register(suite, test_mempool_global_destructors0); |
|
516 cx_test_register(suite, test_mempool_global_destructors); |
|
517 cx_test_register(suite, test_mempool_global_destructors2); |
268 cx_test_register(suite, test_mempool_register); |
518 cx_test_register(suite, test_mempool_register); |
|
519 cx_test_register(suite, test_mempool_register2); |
269 cx_test_register(suite, test_mempool_transfer); |
520 cx_test_register(suite, test_mempool_transfer); |
270 cx_test_register(suite, test_mempool_transfer_object); |
521 cx_test_register(suite, test_mempool_transfer_object); |
271 |
522 |
272 return suite; |
523 return suite; |
273 } |
524 } |