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 push nodes into a wfstack. 7 */ 8 9 #include <stdio.h> 10 #include <stdlib.h> 11 12 #include <urcu/wfstack.h> /* Wait-free stack */ 13 #include <urcu/compiler.h> /* For CAA_ARRAY_SIZE */ 14 15 /* 16 * Nodes populated into the stack. 17 */ 18 struct mynode { 19 int value; /* Node content */ 20 struct cds_wfs_node node; /* Chaining in stack */ 21 }; 22 23 int main(void) 24 { 25 int values[] = { -5, 42, 36, 24, }; 26 struct cds_wfs_stack mystack; /* Stack */ 27 unsigned int i; 28 int ret = 0; 29 struct cds_wfs_node *snode; 30 struct cds_wfs_head *shead; 31 32 cds_wfs_init(&mystack); 33 34 /* 35 * Push 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_wfs_node_init(&node->node); 47 node->value = values[i]; 48 cds_wfs_push(&mystack, &node->node); 49 } 50 51 /* 52 * Show the stack content, iterate in reverse order of push, 53 * from newest to oldest. 54 */ 55 printf("mystack content:"); 56 shead = cds_wfs_pop_all_blocking(&mystack); 57 cds_wfs_for_each_blocking(shead, snode) { 58 struct mynode *node = 59 caa_container_of(snode, struct mynode, node); 60 printf(" %d", node->value); 61 } 62 printf("\n"); 63 end: 64 cds_wfs_destroy(&mystack); 65 return ret; 66 } 67