examples: use SPDX identifiers
[urcu.git] / doc / examples / urcu-flavors / qsbr.c
index 6f5b9b51d46b796adcaf26792dcfcfd5eb1b1c4f..0b5b1a91ab44e2ece5cdbc9c1b47217a5443e8db 100644 (file)
@@ -1,20 +1,6 @@
-/*
- * Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
+// SPDX-FileCopyrightText: 2013 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
 
 #include <unistd.h>
 #include <stdlib.h>
@@ -22,7 +8,7 @@
 #include <stdint.h>
 #include <inttypes.h>
 
-#include <urcu-qsbr.h>         /* QSBR RCU flavor */
+#include <urcu/urcu-qsbr.h>    /* QSBR RCU flavor */
 #include <urcu/rculist.h>      /* List example */
 #include <urcu/compiler.h>     /* For CAA_ARRAY_SIZE */
 
@@ -62,7 +48,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;
@@ -73,7 +59,7 @@ int main(int argc, char **argv)
         * Each thread need using RCU read-side need to be explicitly
         * registered.
         */
-       rcu_register_thread();
+       urcu_qsbr_register_thread();
 
        /*
         * Adding nodes to the linked-list. Safe against concurrent
@@ -104,7 +90,7 @@ int main(int argc, char **argv)
                 * call_rcu() can be called from RCU read-side critical
                 * sections.
                 */
-               call_rcu(&node->rcu_head, rcu_free_node);
+               urcu_qsbr_call_rcu(&node->rcu_head, rcu_free_node);
        }
 
        /*
@@ -113,27 +99,37 @@ int main(int argc, char **argv)
         * every online registered RCU threads in the program
         * periodically.
         */
-       rcu_quiescent_state();
+       urcu_qsbr_quiescent_state();
 
        /*
         * For QSBR flavor, when a thread needs to be in a quiescent
         * state for a long period of time, we use rcu_thread_offline()
         * and rcu_thread_online().
         */
-       rcu_thread_offline();
+       urcu_qsbr_thread_offline();
 
        sleep(1);
 
-       rcu_thread_online();
+       urcu_qsbr_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.
+        */
+       urcu_qsbr_synchronize_rcu();
 
        /*
         * Waiting for previously called call_rcu handlers to complete
         * before program exits, or in library destructors, is a good
         * practice.
         */
-       rcu_barrier();
+       urcu_qsbr_barrier();
 
 end:
-       rcu_unregister_thread();
+       urcu_qsbr_unregister_thread();
        return ret;
 }
This page took 0.02474 seconds and 4 git commands to generate.