170 CX_TEST_DO { |
170 CX_TEST_DO { |
171 // check that the destructor functions are also transferred |
171 // check that the destructor functions are also transferred |
172 src->auto_destr = test_mempool_destructor; |
172 src->auto_destr = test_mempool_destructor; |
173 |
173 |
174 // allocate first object |
174 // allocate first object |
175 int *a = cxMalloc(src->allocator, sizeof(int)); |
175 int *c = cxMalloc(src->allocator, sizeof(int)); |
176 // allocate second object |
176 // allocate second object |
177 int *b = cxMalloc(src->allocator, sizeof(int)); |
177 c = cxMalloc(src->allocator, sizeof(int)); |
178 // register foreign object |
178 // register foreign object |
179 int *c = malloc(sizeof(int)); |
179 c = malloc(sizeof(int)); |
180 cxMempoolRegister(src, c, test_mempool_destructor); |
180 cxMempoolRegister(src, c, test_mempool_destructor); |
181 |
181 |
182 // check source pool |
182 // check source pool |
183 CX_TEST_ASSERT(src->size == 3); |
183 CX_TEST_ASSERT(src->size == 3); |
184 const CxAllocator *old_allocator = src->allocator; |
184 const CxAllocator *old_allocator = src->allocator; |
204 cxMempoolFree(dest); |
204 cxMempoolFree(dest); |
205 CX_TEST_ASSERT(test_mempool_destructor_called == 3); |
205 CX_TEST_ASSERT(test_mempool_destructor_called == 3); |
206 |
206 |
207 // free the foreign object |
207 // free the foreign object |
208 free(c); |
208 free(c); |
|
209 |
|
210 // cover illegal arguments |
|
211 result = cxMempoolTransfer(dest, dest); |
|
212 CX_TEST_ASSERT(result != 0); |
|
213 } |
|
214 } |
|
215 |
|
216 CX_TEST(test_mempool_transfer_object) { |
|
217 CxMempool *src = cxMempoolCreateSimple(4); |
|
218 CxMempool *dest = cxMempoolCreateSimple(4); |
|
219 CX_TEST_DO { |
|
220 int *b = cxMalloc(src->allocator, sizeof(int)); |
|
221 b = cxMalloc(src->allocator, sizeof(int)); |
|
222 int *c = malloc(sizeof(int)); |
|
223 cxMempoolRegister(src, c, free); |
|
224 |
|
225 CX_TEST_ASSERT(src->size == 3); |
|
226 int result = cxMempoolTransferObject(src, dest, b); |
|
227 CX_TEST_ASSERT(result == 0); |
|
228 CX_TEST_ASSERT(src->size == 2); |
|
229 CX_TEST_ASSERT(dest->size == 1); |
|
230 result = cxMempoolTransferObject(src, dest, b); |
|
231 CX_TEST_ASSERT(result != 0); |
|
232 CX_TEST_ASSERT(src->size == 2); |
|
233 CX_TEST_ASSERT(dest->size == 1); |
|
234 // cannot transfer foreign memory this way |
|
235 result = cxMempoolTransferObject(src, dest, c); |
|
236 CX_TEST_ASSERT(result != 0); |
|
237 CX_TEST_ASSERT(src->size == 2); |
|
238 CX_TEST_ASSERT(dest->size == 1); |
|
239 result = cxMempoolTransferObject(dest, dest, b); |
|
240 CX_TEST_ASSERT(result != 0); |
|
241 CX_TEST_ASSERT(src->size == 2); |
|
242 CX_TEST_ASSERT(dest->size == 1); |
|
243 |
|
244 cxMempoolFree(src); |
|
245 cxMempoolFree(dest); |
|
246 // let valgrind check that everything worked |
209 } |
247 } |
210 } |
248 } |
211 |
249 |
212 CxTestSuite *cx_test_suite_mempool(void) { |
250 CxTestSuite *cx_test_suite_mempool(void) { |
213 CxTestSuite *suite = cx_test_suite_new("mempool"); |
251 CxTestSuite *suite = cx_test_suite_new("mempool"); |
218 cx_test_register(suite, test_mempool_realloc); |
256 cx_test_register(suite, test_mempool_realloc); |
219 cx_test_register(suite, test_mempool_free); |
257 cx_test_register(suite, test_mempool_free); |
220 cx_test_register(suite, test_mempool_destroy); |
258 cx_test_register(suite, test_mempool_destroy); |
221 cx_test_register(suite, test_mempool_register); |
259 cx_test_register(suite, test_mempool_register); |
222 cx_test_register(suite, test_mempool_transfer); |
260 cx_test_register(suite, test_mempool_transfer); |
|
261 cx_test_register(suite, test_mempool_transfer_object); |
223 |
262 |
224 return suite; |
263 return suite; |
225 } |
264 } |