blob: b6d7b562a8c3cf086ea712b21eb2f0d5a16c3520 [file] [log] [blame]
#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;
}