#include #include #include #include #include "../../common.h" #ifndef ITERATION #define ITERATION 128 #endif static void my_free(void *p, size_t m, bool d) { (void)m; (void)d; free(p); return; } static void * my_malloc(size_t b) { return malloc(b); } static void * my_realloc(void *r, size_t a, size_t b, bool d) { (void)a; (void)d; return realloc(r, b); } int main(void) { void *r; uintptr_t i; ck_array_t array; ck_array_iterator_t iterator; struct ck_malloc m = { .malloc = my_malloc, .free = NULL, .realloc = my_realloc }; if (ck_array_init(&array, CK_ARRAY_MODE_SPMC, &m, 4) == true) ck_error("ck_array_init with NULL free succeeded\n"); m.free = my_free; if (ck_array_init(&array, CK_ARRAY_MODE_SPMC, &m, 4) == false) ck_error("ck_array_init\n"); for (i = 0; i < ITERATION; i++) { if (ck_array_put(&array, (void *)i) == false) ck_error("ck_error_put\n"); if (ck_array_remove(&array, (void *)i) == false) ck_error("ck_error_remove after put\n"); } i = 0; CK_ARRAY_FOREACH(&array, &iterator, &r) i++; if (i != 0) ck_error("Non-empty array after put -> remove workload.\n"); ck_array_commit(&array); i = 0; CK_ARRAY_FOREACH(&array, &iterator, &r) i++; if (i != 0) ck_error("Non-empty array after put -> remove -> commit workload.\n"); for (i = 0; i < ITERATION; i++) { if (ck_array_put(&array, (void *)i) == false) ck_error("ck_error_put\n"); } i = 0; CK_ARRAY_FOREACH(&array, &iterator, &r) i++; if (i != 0) ck_error("Non-empty array after put workload.\n"); for (i = 0; i < ITERATION; i++) { if (ck_array_remove(&array, (void *)i) == false) ck_error("ck_error_remove after put\n"); } i = 0; CK_ARRAY_FOREACH(&array, &iterator, &r) i++; if (i != 0) ck_error("Non-empty array after put -> remove workload.\n"); ck_array_commit(&array); i = 0; CK_ARRAY_FOREACH(&array, &iterator, &r) i++; if (i != 0) ck_error("Non-empty array after put -> remove -> commit workload.\n"); for (i = 0; i < ITERATION; i++) { if (ck_array_put(&array, (void *)i) == false) ck_error("ck_error_put\n"); } ck_array_commit(&array); i = 0; CK_ARRAY_FOREACH(&array, &iterator, &r) { i++; } if (i != ITERATION) ck_error("Incorrect item count in iteration\n"); ck_array_remove(&array, (void *)(uintptr_t)0); ck_array_remove(&array, (void *)(uintptr_t)1); ck_array_commit(&array); i = 0; CK_ARRAY_FOREACH(&array, &iterator, &r) i++; if (i != ITERATION - 2 || ck_array_length(&array) != ITERATION - 2) ck_error("Incorrect item count in iteration after remove\n"); if (ck_array_put_unique(&array, (void *)UINTPTR_MAX) != 0) ck_error("Unique value put failed.\n"); if (ck_array_put_unique(&array, (void *)(uintptr_t)4) != 1) ck_error("put of 4 not detected as non-unique.\n"); if (ck_array_put_unique(&array, (void *)UINTPTR_MAX) != 1) ck_error("put of UINTPTR_MAX not detected as non-unique.\n"); ck_array_commit(&array); i = 0; CK_ARRAY_FOREACH(&array, &iterator, &r) { i++; } if (i != ITERATION - 1 || ck_array_length(&array) != ITERATION - 1) ck_error("Incorrect item count in iteration after unique put\n"); if (ck_array_initialized(&array) == false) ck_error("Error, expected array to be initialized.\n"); for (i = 0; i < ITERATION * 4; i++) { ck_array_remove(&array, (void *)i); } for (i = 0; i < ITERATION * 16; i++) { ck_array_put(&array, (void *)i); } ck_array_commit(&array); for (i = 0; i < ITERATION * 128; i++) { ck_array_put(&array, (void *)i); if (ck_array_put_unique(&array, (void *)i) != 1) ck_error("put_unique for non-unique value should fail.\n"); } for (i = 0; i < ITERATION * 64; i++) { bool f = ck_array_remove(&array, (void *)i); if (f == false && i < ITERATION * 144) ck_error("Remove failed for existing entry.\n"); if (f == true && i > ITERATION * 144) ck_error("Remove succeeded for non-existing entry.\n"); } ck_array_commit(&array); ck_array_deinit(&array, false); if (ck_array_initialized(&array) == true) ck_error("Error, expected array to be uninitialized.\n"); return 0; }