Fix: update automake following README to README.md change
[urcu.git] / doc / examples / urcu-flavors / qsbr.c
index 1c50b8aedaf9b368309acc92e3b5bf840437f7a0..1dbd54635cbe06a4ca71bb9a60fdb87bcb8c9dec 100644 (file)
@@ -16,6 +16,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include <unistd.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <stdint.h>
@@ -84,21 +85,12 @@ int main(int argc, char **argv)
                        goto end;
        }
 
-       /*
-        * For all RCU flavors except QSBR, 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.
-        */
-       rcu_read_lock();
-
        /*
         * RCU traversal of the linked list.
         */
        cds_list_for_each_entry_rcu(node, &mylist, node) {
                printf("Value: %" PRIu64 "\n", node->value);
        }
-       rcu_read_unlock();
 
        /*
         * Removing nodes from linked list. Safe against concurrent RCU
@@ -106,6 +98,12 @@ int main(int argc, char **argv)
         */
        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.
+                */
                call_rcu(&node->rcu_head, rcu_free_node);
        }
 
@@ -128,6 +126,16 @@ int main(int argc, char **argv)
 
        rcu_thread_online();
 
+       /*
+        * 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() ensures the
+        * caller thread is offline, thus acting as a quiescent state.
+        */
+       synchronize_rcu();
+
        /*
         * Waiting for previously called call_rcu handlers to complete
         * before program exits, or in library destructors, is a good
This page took 0.023103 seconds and 4 git commands to generate.