cleanup: explicitly mark unused parameters (-Wunused-parameter)
[urcu.git] / doc / examples / urcu-flavors / mb.c
index 24daaef75c5735580457476408a1e3424478b3a4..5280598eb0a9a69659b5068e96ba44eff32af3ce 100644 (file)
@@ -22,8 +22,7 @@
 #include <stdint.h>
 #include <inttypes.h>
 
-#define RCU_MB                 /* Memory barrier RCU flavor */
-#include <urcu.h>
+#include <urcu/urcu-mb.h>      /* Memory barrier RCU flavor */
 #include <urcu/rculist.h>      /* List example */
 #include <urcu/compiler.h>     /* For CAA_ARRAY_SIZE */
 
@@ -64,7 +63,7 @@ void rcu_free_node(struct rcu_head *rh)
        free(node);
 }
 
-int main(int argc, char **argv)
+int main(void)
 {
        uint64_t values[] = { 42, 36, 24, };
        unsigned int i;
@@ -75,7 +74,7 @@ int main(int argc, char **argv)
         * Each thread need using RCU read-side need to be explicitly
         * registered.
         */
-       rcu_register_thread();
+       urcu_mb_register_thread();
 
        /*
         * Adding nodes to the linked-list. Safe against concurrent
@@ -92,7 +91,7 @@ int main(int argc, char **argv)
         * with rcu_read_lock() and rcu_read_unlock(). They can be
         * nested. Those are no-ops for the QSBR flavor.
         */
-       rcu_read_lock();
+       urcu_mb_read_lock();
 
        /*
         * RCU traversal of the linked list.
@@ -100,7 +99,7 @@ int main(int argc, char **argv)
        cds_list_for_each_entry_rcu(node, &mylist, node) {
                printf("Value: %" PRIu64 "\n", node->value);
        }
-       rcu_read_unlock();
+       urcu_mb_read_unlock();
 
        /*
         * Removing nodes from linked list. Safe against concurrent RCU
@@ -108,9 +107,24 @@ int main(int argc, char **argv)
         */
        cds_list_for_each_entry_safe(node, n, &mylist, node) {
                cds_list_del_rcu(&node->node);
-               call_rcu(&node->rcu_head, rcu_free_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_mb_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_mb_synchronize_rcu();
+
        sleep(1);
 
        /*
@@ -118,9 +132,9 @@ int main(int argc, char **argv)
         * before program exits, or in library destructors, is a good
         * practice.
         */
-       rcu_barrier();
+       urcu_mb_barrier();
 
 end:
-       rcu_unregister_thread();
+       urcu_mb_unregister_thread();
        return ret;
 }
This page took 0.023195 seconds and 4 git commands to generate.