doc/examples: rename qsbr-minimal to rcu-flavor-qsbr
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sat, 22 Jun 2013 17:02:46 +0000 (13:02 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sat, 22 Jun 2013 17:02:46 +0000 (13:02 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
doc/examples/Makefile.am
doc/examples/qsbr-minimal/Makefile [deleted file]
doc/examples/qsbr-minimal/qsbr-minimal.c [deleted file]
doc/examples/rcu-flavor-qsbr/Makefile [new file with mode: 0644]
doc/examples/rcu-flavor-qsbr/rcu-flavor-qsbr.c [new file with mode: 0644]

index d48686484930418cd4162970f21d1f643bcc8fd1..acdaaac1d9f2583b2fbf3c3aafded2b82761a116 100644 (file)
@@ -1,10 +1,10 @@
 doc_examplesdir = ${docdir}/examples
 
-doc_examples_qsbr_minimaldir = ${doc_examplesdir}/qsbr-minimal
+doc_examples_rcu_flavor_qsbrdir = ${doc_examplesdir}/rcu-flavor-qsbr
 
-dist_doc_examples_qsbr_minimal_DATA = \
-       qsbr-minimal/Makefile \
-       qsbr-minimal/qsbr-minimal.c
+dist_doc_examples_rcu_flavor_qsbr_DATA = \
+       rcu-flavor-qsbr/Makefile \
+       rcu-flavor-qsbr/rcu-flavor-qsbr.c
 
 dist_doc_examples_DATA = \
        Makefile.examples.template
@@ -76,7 +76,7 @@ if NO_SHARED
 # Don't build examples if shared libraries support was explicitly
 # disabled.
 else
-SUBDIRS_PROXY = qsbr-minimal list hlist wfcqueue wfstack lfstack
+SUBDIRS_PROXY = rcu-flavor-qsbr list hlist wfcqueue wfstack lfstack
 
 all-local:
        for subdir in $(SUBDIRS_PROXY); do \
diff --git a/doc/examples/qsbr-minimal/Makefile b/doc/examples/qsbr-minimal/Makefile
deleted file mode 100644 (file)
index b0400cb..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
-#
-# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
-# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
-#
-# Permission is hereby granted to use or copy this program for any
-# purpose,  provided the above notices are retained on all copies.
-# Permission to modify the code and to distribute modified code is
-# granted, provided the above notices are retained, and a notice that
-# the code was modified is included with the above copyright notice.
-#
-# This makefile is purposefully kept simple to support GNU and BSD make.
-
-CC = gcc
-LIBS = -lurcu-qsbr
-CFLAGS = -g -O2 -Wall
-OBJECTS = qsbr-minimal.o
-
-all: qsbr-minimal
-
-qsbr-minimal: $(OBJECTS)
-       $(CC) $(CFLAGS) $(LDFLAGS) $(AM_CFLAGS) $(AM_LDFLAGS) \
-               $(LIBS) -o $@ $(OBJECTS)
-
-qsbr-minimal.o: qsbr-minimal.c
-       $(CC) $(CPPFLAGS) $(CFLAGS) $(AM_CPPFLAGS) $(AM_CFLAGS) \
-               -c -o $@ $<
-
-.PHONY: clean
-clean:
-       rm -f *.o qsbr-minimal
diff --git a/doc/examples/qsbr-minimal/qsbr-minimal.c b/doc/examples/qsbr-minimal/qsbr-minimal.c
deleted file mode 100644 (file)
index a7a6ff4..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * 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
- */
-
-#define _LGPL_SOURCE
-#include <urcu-qsbr.h>
-#include <urcu/rculist.h>
-#include <urcu/compiler.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <inttypes.h>
-
-/*
- * 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(int argc, char **argv)
-{
-       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.
-        */
-       rcu_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;
-       }
-
-       /*
-        * 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
-        * 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(&node->rcu_head, rcu_free_node);
-       }
-
-       /*
-        * For QSBR flavor, we need to explicitly announce quiescent
-        * states.
-        */
-       rcu_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();
-
-       sleep(1);
-
-       rcu_thread_online();
-
-       /*
-        * Waiting for previously called call_rcu handlers to complete
-        * before program exits is a good practice.
-        */
-       rcu_barrier();
-
-end:
-       rcu_unregister_thread();
-       return ret;
-}
diff --git a/doc/examples/rcu-flavor-qsbr/Makefile b/doc/examples/rcu-flavor-qsbr/Makefile
new file mode 100644 (file)
index 0000000..b91d205
--- /dev/null
@@ -0,0 +1,31 @@
+# Copyright (C) 2013  Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+#
+# THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
+# OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+#
+# Permission is hereby granted to use or copy this program for any
+# purpose,  provided the above notices are retained on all copies.
+# Permission to modify the code and to distribute modified code is
+# granted, provided the above notices are retained, and a notice that
+# the code was modified is included with the above copyright notice.
+#
+# This makefile is purposefully kept simple to support GNU and BSD make.
+
+CC = gcc
+LIBS = -lurcu-qsbr
+CFLAGS = -g -O2 -Wall
+OBJECTS = rcu-flavor-qsbr.o
+
+all: rcu-flavor-qsbr
+
+rcu-flavor-qsbr: $(OBJECTS)
+       $(CC) $(CFLAGS) $(LDFLAGS) $(AM_CFLAGS) $(AM_LDFLAGS) \
+               $(LIBS) -o $@ $(OBJECTS)
+
+rcu-flavor-qsbr.o: rcu-flavor-qsbr.c
+       $(CC) $(CPPFLAGS) $(CFLAGS) $(AM_CPPFLAGS) $(AM_CFLAGS) \
+               -c -o $@ $<
+
+.PHONY: clean
+clean:
+       rm -f *.o rcu-flavor-qsbr
diff --git a/doc/examples/rcu-flavor-qsbr/rcu-flavor-qsbr.c b/doc/examples/rcu-flavor-qsbr/rcu-flavor-qsbr.c
new file mode 100644 (file)
index 0000000..a7a6ff4
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * 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
+ */
+
+#define _LGPL_SOURCE
+#include <urcu-qsbr.h>
+#include <urcu/rculist.h>
+#include <urcu/compiler.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <inttypes.h>
+
+/*
+ * 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(int argc, char **argv)
+{
+       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.
+        */
+       rcu_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;
+       }
+
+       /*
+        * 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
+        * 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(&node->rcu_head, rcu_free_node);
+       }
+
+       /*
+        * For QSBR flavor, we need to explicitly announce quiescent
+        * states.
+        */
+       rcu_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();
+
+       sleep(1);
+
+       rcu_thread_online();
+
+       /*
+        * Waiting for previously called call_rcu handlers to complete
+        * before program exits is a good practice.
+        */
+       rcu_barrier();
+
+end:
+       rcu_unregister_thread();
+       return ret;
+}
This page took 0.029092 seconds and 4 git commands to generate.