From 9a82127c476bf99556bbc69e181025afcba19d26 Mon Sep 17 00:00:00 2001 From: nodist Date: Thu, 24 Sep 2026 14:36:15 -0400 Subject: ring buffer tests --- test/queue.c | 47 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) (limited to 'test/queue.c') diff --git a/test/queue.c b/test/queue.c index 9886225..b011725 100644 --- a/test/queue.c +++ b/test/queue.c @@ -16,7 +16,7 @@ static const int32_t kpl_task_queue_total_increments = TASK_QUEUE_THREAD_COUNT * static kpl_task_queue_thread_test task_queue_threads[TASK_QUEUE_THREAD_COUNT] = {}; -static void *queue_task_queue_thread_fn(void *arg) { +static void *task_queue_thread_fn(void *arg) { const int32_t thread_id = (int32_t) (intptr_t) arg; for (int32_t round = 0; round < TASK_QUEUE_PER_THREAD_INCREMENTS; round++) { for (int32_t id = 0; id < TASK_QUEUE_THREAD_COUNT; id++) { @@ -35,11 +35,11 @@ static void *queue_task_queue_thread_fn(void *arg) { return NULL; } -KPL_TEST(queue_task_queue_threads) { +KPL_TEST(task_queue_threads) { for (int32_t id = 0; id < TASK_QUEUE_THREAD_COUNT; id++) kpl_task_queue_init(&task_queue_threads[id].task_queue); for (int32_t id = 0; id < TASK_QUEUE_THREAD_COUNT; id++) - pthread_create(&task_queue_threads[id].pthread, NULL, queue_task_queue_thread_fn, (void*) (intptr_t) id); + pthread_create(&task_queue_threads[id].pthread, NULL, task_queue_thread_fn, (void*) (intptr_t) id); for (int32_t id = 0; id < TASK_QUEUE_THREAD_COUNT; id++) pthread_join(task_queue_threads[id].pthread, NULL); for (int32_t id = 0; id < TASK_QUEUE_THREAD_COUNT; id++) { @@ -53,3 +53,44 @@ KPL_TEST(queue_task_queue_threads) { "Invalid number of increments"); } } + +#define RING_QUEUE_THREAD_COUNT 3 + +#define RING_QUEUE_SLOTS_PER_THREAD 1000 + +#define RING_QUEUE_SLOT_LENGTH (RING_QUEUE_THREAD_COUNT * RING_QUEUE_SLOTS_PER_THREAD) + +static pthread_t ring_queue_threads[RING_QUEUE_THREAD_COUNT] = {}; + +static bool ring_queue_test_slots[RING_QUEUE_SLOT_LENGTH] = {}; + +static kpl_ring_queue ring_queue; + +static void *ring_queue_thread_fn(void *arg) { + const int32_t thread_id = (int32_t) (intptr_t) arg; + int32_t slot_index; + for (int32_t round = 1; round < RING_QUEUE_SLOTS_PER_THREAD; round++) { + slot_index = thread_id * RING_QUEUE_SLOTS_PER_THREAD + round; + if (!kpl_ring_queue_add(&ring_queue, (void*) (intptr_t) slot_index)) + break; + if ((slot_index = (int32_t) (intptr_t) kpl_ring_queue_next(&ring_queue))) + ring_queue_test_slots[slot_index] = true; + } + while ((slot_index = (int32_t) (intptr_t) kpl_ring_queue_next(&ring_queue))) + ring_queue_test_slots[slot_index] = true; + return NULL; +} + +KPL_TEST(ring_queue_threads) { + for (int32_t skip_round = 0; skip_round < RING_QUEUE_THREAD_COUNT; skip_round++) + ring_queue_test_slots[skip_round * RING_QUEUE_SLOTS_PER_THREAD] = true; + kpl_ring_queue_init(&ring_queue, 12); + for (int32_t id = 0; id < RING_QUEUE_THREAD_COUNT; id++) + pthread_create(&ring_queue_threads[id], NULL, ring_queue_thread_fn, (void*) (intptr_t) id); + for (int32_t id = 0; id < RING_QUEUE_THREAD_COUNT; id++) + pthread_join(ring_queue_threads[id], NULL); + for (int32_t slot_index = 0; slot_index < RING_QUEUE_SLOT_LENGTH; slot_index++) { + KPL_ASSERT(ring_queue_test_slots[slot_index], "Slot should have been set"); + } + kpl_ring_queue_free(&ring_queue); +} -- cgit v1.2.3