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