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 pop all nodes from a lfstack. 7 */ 8 9 #include <stdio.h> 10 #include <stdlib.h> 11 12 #include <urcu/lfstack.h> /* Lock-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_lfs_node node; /* Chaining in stack */ 21 }; 22 23 int main(void) 24 { 25 int values[] = { -5, 42, 36, 24, }; 26 struct cds_lfs_stack mystack; /* Stack */ 27 unsigned int i; 28 int ret = 0; 29 struct cds_lfs_node *snode, *sn; 30 struct cds_lfs_head *shead; 31 32 cds_lfs_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_lfs_node_init(&node->node); 47 node->value = values[i]; 48 cds_lfs_push(&mystack, &node->node); 49 } 50 51 /* 52 * Pop all nodes from mystack into shead. The head can the be 53 * used for iteration. 54 */ 55 shead = cds_lfs_pop_all_blocking(&mystack); 56 57 /* 58 * Show the stack content, iterate in reverse order of push, 59 * from newest to oldest. Use cds_lfs_for_each_safe() so we can 60 * free the nodes as we iterate. 61 */ 62 printf("mystack content:"); 63 cds_lfs_for_each_safe(shead, snode, sn) { 64 struct mynode *node = 65 caa_container_of(snode, struct mynode, node); 66 printf(" %d", node->value); 67 free(node); 68 } 69 printf("\n"); 70 end: 71 cds_lfs_destroy(&mystack); 72 return ret; 73 } 74