1 1.1 christos // SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers (at) efficios.com> 2 1.1 christos // 3 1.1 christos // SPDX-License-Identifier: MIT 4 1.1 christos 5 1.1 christos /* 6 1.1 christos * This example shows how to enqueue nodes into a wfcqueue. 7 1.1 christos */ 8 1.1 christos 9 1.1 christos #include <stdio.h> 10 1.1 christos #include <stdlib.h> 11 1.1 christos 12 1.1 christos #include <urcu/wfcqueue.h> /* Wait-free concurrent queue */ 13 1.1 christos #include <urcu/compiler.h> /* For CAA_ARRAY_SIZE */ 14 1.1 christos 15 1.1 christos /* 16 1.1 christos * Nodes populated into the queue. 17 1.1 christos */ 18 1.1 christos struct mynode { 19 1.1 christos int value; /* Node content */ 20 1.1 christos struct cds_wfcq_node node; /* Chaining in queue */ 21 1.1 christos }; 22 1.1 christos 23 1.1 christos int main(void) 24 1.1 christos { 25 1.1 christos int values[] = { -5, 42, 36, 24, }; 26 1.1 christos struct cds_wfcq_head myqueue_head; /* Queue head */ 27 1.1 christos struct cds_wfcq_tail myqueue_tail; /* Queue tail */ 28 1.1 christos unsigned int i; 29 1.1 christos int ret = 0; 30 1.1 christos struct cds_wfcq_node *qnode; 31 1.1 christos 32 1.1 christos cds_wfcq_init(&myqueue_head, &myqueue_tail); 33 1.1 christos 34 1.1 christos /* 35 1.1 christos * Enqueue nodes. 36 1.1 christos */ 37 1.1 christos for (i = 0; i < CAA_ARRAY_SIZE(values); i++) { 38 1.1 christos struct mynode *node; 39 1.1 christos 40 1.1 christos node = malloc(sizeof(*node)); 41 1.1 christos if (!node) { 42 1.1 christos ret = -1; 43 1.1 christos goto end; 44 1.1 christos } 45 1.1 christos 46 1.1 christos cds_wfcq_node_init(&node->node); 47 1.1 christos node->value = values[i]; 48 1.1 christos cds_wfcq_enqueue(&myqueue_head, &myqueue_tail, 49 1.1 christos &node->node); 50 1.1 christos } 51 1.1 christos 52 1.1 christos /* 53 1.1 christos * Show the queue content, iterate in the same order nodes were 54 1.1 christos * enqueued, from oldest to newest. 55 1.1 christos */ 56 1.1 christos printf("myqueue content:"); 57 1.1 christos __cds_wfcq_for_each_blocking(&myqueue_head, &myqueue_tail, qnode) { 58 1.1 christos struct mynode *node = 59 1.1 christos caa_container_of(qnode, struct mynode, node); 60 1.1 christos printf(" %d", node->value); 61 1.1 christos } 62 1.1 christos printf("\n"); 63 1.1 christos end: 64 1.1 christos cds_wfcq_destroy(&myqueue_head, &myqueue_tail); 65 1.1 christos return ret; 66 1.1 christos } 67