From: Mathieu Desnoyers Date: Mon, 21 Aug 2023 15:57:07 +0000 (-0400) Subject: doc/examples: Remove urcu-signal example X-Git-Url: http://git.liburcu.org/?a=commitdiff_plain;h=3d003c571cd461aba1935e5d21e1e04da7183970;hp=546d9a117ef442847203e82f6b1bf6abd2d13b25;p=urcu.git doc/examples: Remove urcu-signal example Remove the urcu-signal example from documentation. Signed-off-by: Mathieu Desnoyers Change-Id: I6497855e63f39420cb1ffa44e07c2cbf5d39c791 --- diff --git a/doc/examples/Makefile.am b/doc/examples/Makefile.am index 4fcfa2c..8169169 100644 --- a/doc/examples/Makefile.am +++ b/doc/examples/Makefile.am @@ -11,12 +11,10 @@ dist_doc_examples_urcu_flavors_DATA = \ urcu-flavors/Makefile.qsbr \ urcu-flavors/Makefile.mb \ urcu-flavors/Makefile.membarrier \ - urcu-flavors/Makefile.signal \ urcu-flavors/Makefile.bp \ urcu-flavors/qsbr.c \ urcu-flavors/mb.c \ urcu-flavors/membarrier.c \ - urcu-flavors/signal.c \ urcu-flavors/bp.c dist_doc_examples_DATA = \ diff --git a/doc/examples/urcu-flavors/Makefile b/doc/examples/urcu-flavors/Makefile index 221d51c..6738eaf 100644 --- a/doc/examples/urcu-flavors/Makefile +++ b/doc/examples/urcu-flavors/Makefile @@ -8,7 +8,6 @@ all: $(AM_V_at)$(MAKE) -f Makefile.qsbr $(AM_V_at)$(MAKE) -f Makefile.mb $(AM_V_at)$(MAKE) -f Makefile.membarrier - $(AM_V_at)$(MAKE) -f Makefile.signal $(AM_V_at)$(MAKE) -f Makefile.bp .PHONY: clean @@ -16,5 +15,4 @@ clean: $(AM_V_at)$(MAKE) -f Makefile.qsbr clean $(AM_V_at)$(MAKE) -f Makefile.mb clean $(AM_V_at)$(MAKE) -f Makefile.membarrier clean - $(AM_V_at)$(MAKE) -f Makefile.signal clean $(AM_V_at)$(MAKE) -f Makefile.bp clean diff --git a/doc/examples/urcu-flavors/Makefile.signal b/doc/examples/urcu-flavors/Makefile.signal deleted file mode 100644 index eeebd8c..0000000 --- a/doc/examples/urcu-flavors/Makefile.signal +++ /dev/null @@ -1,14 +0,0 @@ -# SPDX-FileCopyrightText: 2013 Mathieu Desnoyers -# -# SPDX-License-Identifier: MIT - -# This makefile is purposefully kept simple to support GNU and BSD make. - -EXAMPLE_NAME = signal - -SOURCES = $(EXAMPLE_NAME).c -OBJECTS = $(EXAMPLE_NAME).o -BINARY = $(EXAMPLE_NAME) -LIBS = -lurcu-signal - -include ../Makefile.examples.template diff --git a/doc/examples/urcu-flavors/signal.c b/doc/examples/urcu-flavors/signal.c deleted file mode 100644 index 62c6cf2..0000000 --- a/doc/examples/urcu-flavors/signal.c +++ /dev/null @@ -1,125 +0,0 @@ -// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers -// -// SPDX-License-Identifier: LGPL-2.1-or-later - -#include -#include -#include -#include -#include - -#include /* Signal-based RCU flavor */ -#include /* List example */ -#include /* For CAA_ARRAY_SIZE */ - -/* - * Example showing how to use the signal-based Userspace RCU flavor. - * - * This is a mock-up example where updates and RCU traversals are - * performed by the same thread to keep things simple on purpose. - */ - -static CDS_LIST_HEAD(mylist); - -struct mynode { - uint64_t value; - struct cds_list_head node; /* linked-list chaining */ - struct rcu_head rcu_head; /* for call_rcu() */ -}; - -static -int add_node(uint64_t v) -{ - struct mynode *node; - - node = calloc(sizeof(*node), 1); - if (!node) - return -1; - node->value = v; - cds_list_add_rcu(&node->node, &mylist); - return 0; -} - -static -void rcu_free_node(struct rcu_head *rh) -{ - struct mynode *node = caa_container_of(rh, struct mynode, rcu_head); - - free(node); -} - -int main(void) -{ - uint64_t values[] = { 42, 36, 24, }; - unsigned int i; - int ret; - struct mynode *node, *n; - - /* - * Each thread need using RCU read-side need to be explicitly - * registered. - */ - urcu_signal_register_thread(); - - /* - * Adding nodes to the linked-list. Safe against concurrent - * RCU traversals, require mutual exclusion with list updates. - */ - for (i = 0; i < CAA_ARRAY_SIZE(values); i++) { - ret = add_node(values[i]); - if (ret) - goto end; - } - - /* - * We need to explicitly mark RCU read-side critical sections - * with rcu_read_lock() and rcu_read_unlock(). They can be - * nested. Those are no-ops for the QSBR flavor. - */ - urcu_signal_read_lock(); - - /* - * RCU traversal of the linked list. - */ - cds_list_for_each_entry_rcu(node, &mylist, node) { - printf("Value: %" PRIu64 "\n", node->value); - } - urcu_signal_read_unlock(); - - /* - * Removing nodes from linked list. Safe against concurrent RCU - * traversals, require mutual exclusion with list updates. - */ - cds_list_for_each_entry_safe(node, n, &mylist, node) { - cds_list_del_rcu(&node->node); - /* - * call_rcu() will ensure that the handler - * "rcu_free_node" is executed after a grace period. - * call_rcu() can be called from RCU read-side critical - * sections. - */ - urcu_signal_call_rcu(&node->rcu_head, rcu_free_node); - } - - /* - * We can also wait for a quiescent state by calling - * synchronize_rcu() rather than using call_rcu(). It is usually - * a slower approach than call_rcu(), because the latter can - * batch work. Moreover, call_rcu() can be called from a RCU - * read-side critical section, but synchronize_rcu() should not. - */ - urcu_signal_synchronize_rcu(); - - sleep(1); - - /* - * Waiting for previously called call_rcu handlers to complete - * before program exits, or in library destructors, is a good - * practice. - */ - urcu_signal_barrier(); - -end: - urcu_signal_unregister_thread(); - return ret; -}