1 1.1 christos // SPDX-FileCopyrightText: 2023 Olivier Dion <odion (at) efficios.com> 2 1.1 christos // 3 1.1 christos // SPDX-License-Identifier: GPL-2.0-or-later 4 1.1 christos 5 1.1 christos /* 6 1.1 christos * test_wfstack.c 7 1.1 christos * 8 1.1 christos * Userspace RCU library - test wftack race conditions 9 1.1 christos */ 10 1.1 christos 11 1.1 christos #define _LGPL_SOURCE 12 1.1 christos 13 1.1 christos #include <stdlib.h> 14 1.1 christos 15 1.1 christos #include <pthread.h> 16 1.1 christos 17 1.1 christos #include <urcu/wfstack.h> 18 1.1 christos 19 1.1 christos #include "tap.h" 20 1.1 christos 21 1.1 christos #define NR_TESTS 1 22 1.1 christos #define NR_PRODUCERS 4 23 1.1 christos #define LOOP 100 24 1.1 christos 25 1.1 christos static void async_run(struct cds_wfs_stack *queue) 26 1.1 christos { 27 1.1 christos struct cds_wfs_node *node = malloc(sizeof(*node)); 28 1.1 christos 29 1.1 christos cds_wfs_node_init(node); 30 1.1 christos 31 1.1 christos cds_wfs_push(queue, node); 32 1.1 christos } 33 1.1 christos 34 1.1 christos static void *async_loop(void *queue) 35 1.1 christos { 36 1.1 christos size_t k = 0; 37 1.1 christos 38 1.1 christos while (k < LOOP * NR_PRODUCERS) { 39 1.1 christos free(cds_wfs_pop_blocking(queue)); 40 1.1 christos ++k; 41 1.1 christos } 42 1.1 christos 43 1.1 christos return NULL; 44 1.1 christos } 45 1.1 christos 46 1.1 christos static void *spawn_jobs(void *queue) 47 1.1 christos { 48 1.1 christos for (size_t k = 0; k < LOOP; ++k) { 49 1.1 christos async_run(queue); 50 1.1 christos } 51 1.1 christos 52 1.1 christos return 0; 53 1.1 christos } 54 1.1 christos 55 1.1 christos int main(void) 56 1.1 christos { 57 1.1 christos pthread_t consumer; 58 1.1 christos pthread_t producers[NR_PRODUCERS]; 59 1.1 christos struct cds_wfs_stack queue; 60 1.1 christos 61 1.1 christos plan_tests(NR_TESTS); 62 1.1 christos 63 1.1 christos cds_wfs_init(&queue); 64 1.1 christos pthread_create(&consumer, NULL, async_loop, &queue); 65 1.1 christos 66 1.1 christos for (size_t k = 0; k < NR_PRODUCERS; ++k) { 67 1.1 christos pthread_create(&producers[k], NULL, spawn_jobs, &queue); 68 1.1 christos } 69 1.1 christos 70 1.1 christos pthread_join(consumer, NULL); 71 1.1 christos for (size_t k = 0; k < NR_PRODUCERS; ++k) { 72 1.1 christos pthread_join(producers[k], NULL); 73 1.1 christos } 74 1.1 christos 75 1.1 christos ok1("No race conditions"); 76 1.1 christos 77 1.1 christos return exit_status(); 78 1.1 christos } 79