| #include <ck_array.h> |
| #include <limits.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| #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; |
| } |
| |