Files
pocketsphinx/test/unit/test_thread_utils_self.c
Kevin Lenzo fde56d93af test: Add cross-platform thread utilities for testing
Introduces portable thread utilities to enable multi-threaded testing
across different platforms:

- Thread creation and joining
- Mutexes for synchronization
- Barriers for thread coordination
- Platform detection for Windows (threads.h) vs POSIX (pthread)
- macOS-specific pthread barrier emulation

These utilities enable comprehensive testing of thread safety in
the RNG implementation and other concurrent code paths.
2025-07-23 08:49:19 -04:00

102 lines
2.3 KiB
C

/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */
/**
* @file test_thread_utils_self.c
* @brief Self-test for thread utilities
*/
#include "test_thread_utils.h"
#include <stdio.h>
#include <assert.h>
/* Shared data for testing */
static volatile int shared_counter = 0;
static mutex_t counter_mutex;
static barrier_t thread_barrier;
#ifdef _WIN32
static unsigned __stdcall test_thread_func(void *arg)
#else
static void *test_thread_func(void *arg)
#endif
{
int thread_id = *(int *)arg;
int i;
printf("Thread %d: Started\n", thread_id);
/* Test barrier - wait for all threads to start */
barrier_wait(&thread_barrier);
printf("Thread %d: Passed barrier\n", thread_id);
/* Test mutex - increment shared counter */
for (i = 0; i < 1000; i++) {
mutex_lock(&counter_mutex);
shared_counter++;
mutex_unlock(&counter_mutex);
}
/* Test thread sleep */
thread_sleep_ms(10);
/* Test assertion macro */
THREAD_TEST_ASSERT(1 == 1);
THREAD_TEST_ASSERT(thread_id >= 0);
printf("Thread %d: Completed\n", thread_id);
#ifdef _WIN32
return 0;
#else
return NULL;
#endif
}
int main(int argc, char *argv[])
{
thread_t threads[4];
int thread_ids[4];
int i;
(void)argc;
(void)argv;
printf("Testing thread utilities...\n");
/* Reset test state */
thread_test_failed = 0;
shared_counter = 0;
/* Initialize synchronization primitives */
assert(mutex_init(&counter_mutex) == 0);
assert(barrier_init(&thread_barrier, 4) == 0);
/* Start memory tracking */
thread_test_start_memory_tracking();
/* Create threads */
for (i = 0; i < 4; i++) {
thread_ids[i] = i;
assert(thread_create(&threads[i], test_thread_func, &thread_ids[i]) == 0);
}
/* Join threads */
for (i = 0; i < 4; i++) {
assert(thread_join(threads[i]) == 0);
}
/* Verify results */
assert(shared_counter == 4000); /* 4 threads * 1000 increments */
assert(thread_test_failed == 0);
/* Check for memory leaks */
assert(thread_test_check_memory_leaks() == 0);
/* Cleanup */
assert(mutex_destroy(&counter_mutex) == 0);
assert(barrier_destroy(&thread_barrier) == 0);
printf("Thread utilities self-test PASSED\n");
printf("Shared counter: %d (expected 4000)\n", shared_counter);
return 0;
}