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