diff --git a/Makefile b/Makefile index cceb43a11b1c4eb2e27ee8433990797d5b055f0c..964b50c09d20e36953004df618b91f8764f76197 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ else endif TESTS_SQUEUE = squeue_single_fill squeue_push_pop -TESTS_MQUEUE = mqueue_push_pop mqueue_empty +TESTS_MQUEUE = mqueue_push_pop mqueue_empty mqueue_multiple_queues PRIMES_THREADS = 1 2 4 8 16 32 64 SLEEPERS = 10 SLEEPERS_THREADS=$(shell seq 1 $(SLEEPERS)) diff --git a/tests/mqueue_multiple_queues.c b/tests/mqueue_multiple_queues.c new file mode 100644 index 0000000000000000000000000000000000000000..bfed6a4fc330e806406f9df98806e38e15c860c6 --- /dev/null +++ b/tests/mqueue_multiple_queues.c @@ -0,0 +1,55 @@ +#include <assert.h> +#include <pthread.h> +#include <time.h> + +#include "queue.h" + +const size_t QUEUES = 10; +const size_t QUEUE_VALUES = 10; +const size_t REPETITIONS = 100; +const struct timespec ENQUEUE_DELAY = {.tv_sec = 0, .tv_nsec = 1000000}; + +queue_t *queues[QUEUES]; + +void *enqueuer(void *_queue_index) { + size_t queue_index = (size_t) _queue_index; + queue_t *queue = queues[queue_index]; + for (size_t i = 0; i < QUEUE_VALUES; i++) { + size_t value = queue_index + i * QUEUES; + queue_enqueue(queue, (void *) value); + int result = nanosleep(&ENQUEUE_DELAY, NULL); + assert(result == 0); + } + return NULL; +} + +void *dequeuer(void *_queue_index) { + size_t queue_index = (size_t) _queue_index; + queue_t *queue = queues[queue_index]; + for (size_t i = 0; i < QUEUE_VALUES; i++) { + size_t value = (size_t) queue_dequeue(queue); + assert(value == queue_index + i * QUEUES); + } + return NULL; +} + +int main() { + for (size_t repetition = 0; repetition < REPETITIONS; repetition++) { + pthread_t enqueue_threads[QUEUES]; + pthread_t dequeue_threads[QUEUES]; + for (size_t i = 0; i < QUEUES; i++) { + queues[i] = queue_init(); + int result = pthread_create(&dequeue_threads[i], NULL, dequeuer, (void *) i); + assert(result == 0); + result = pthread_create(&enqueue_threads[i], NULL, enqueuer, (void *) i); + assert(result == 0); + } + for (size_t i = 0; i < QUEUES; i++) { + int result = pthread_join(enqueue_threads[i], NULL); + assert(result == 0); + result = pthread_join(dequeue_threads[i], NULL); + assert(result == 0); + queue_free(queues[i]); + } + } +}