Home | History | Annotate | Line # | Download | only in unit
      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