qsbr urcu: make it safe to call rcu_sychronize from a registered thread.
[urcu.git] / urcu-qsbr.c
index 878a550b9291d21a464f5e4c1db9e58f1d741ea3..c0f055441930ab8718cd4d4347325bd6671dc2fc 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * urcu.c
+ * urcu-qsbr.c
  *
- * Userspace RCU library
+ * Userspace RCU QSBR library
  *
  * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
  * Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
@@ -32,9 +32,9 @@
 #include <errno.h>
 #include <poll.h>
 
-#include "urcu-qsbr.h"
+#include "urcu-qsbr-static.h"
 /* Do not #define _LGPL_SOURCE to ensure we can emit the wrapper symbols */
-//#include "urcu.h"
+#include "urcu-qsbr.h"
 
 pthread_mutex_t urcu_mutex = PTHREAD_MUTEX_INITIALIZER;
 
@@ -55,7 +55,6 @@ long __thread rcu_reader_qs_gp;
 struct reader_registry {
        pthread_t tid;
        long *rcu_reader_qs_gp;
-       char *need_mb;
 };
 
 #ifdef DEBUG_YIELD
@@ -64,10 +63,9 @@ unsigned int __thread rand_yield;
 #endif
 
 static struct reader_registry *registry;
-static char __thread need_mb;
 static int num_readers, alloc_readers;
 
-void internal_urcu_lock(void)
+static void internal_urcu_lock(void)
 {
        int ret;
 
@@ -84,17 +82,12 @@ void internal_urcu_lock(void)
                        perror("Error in pthread mutex lock");
                        exit(-1);
                }
-               if (need_mb) {
-                       smp_mb();
-                       need_mb = 0;
-                       smp_mb();
-               }
                poll(NULL,0,10);
        }
 #endif /* #else #ifndef DISTRUST_SIGNALS_EXTREME */
 }
 
-void internal_urcu_unlock(void)
+static void internal_urcu_unlock(void)
 {
        int ret;
 
@@ -117,10 +110,13 @@ static void force_mb_all_threads(void)
        smp_mb();
 }
 
-void wait_for_quiescent_state(void)
+static void wait_for_quiescent_state(void)
 {
        struct reader_registry *index;
 
+        if (rcu_reader_qs_gp & 1)
+            rcu_reader_qs_gp = urcu_gp_ctr + 1;
+
        if (!registry)
                return;
        /*
@@ -200,6 +196,21 @@ void *rcu_publish_content_sym(void **p, void *v)
        return oldptr;
 }
 
+void rcu_quiescent_state(void)
+{
+       _rcu_quiescent_state();
+}
+
+void rcu_thread_offline(void)
+{
+       _rcu_thread_offline();
+}
+
+void rcu_thread_online(void)
+{
+       _rcu_thread_online();
+}
+
 static void rcu_add_reader(pthread_t id)
 {
        struct reader_registry *oldarray;
@@ -222,7 +233,6 @@ static void rcu_add_reader(pthread_t id)
        registry[num_readers].tid = id;
        /* reference to the TLS of _this_ reader thread. */
        registry[num_readers].rcu_reader_qs_gp = &rcu_reader_qs_gp;
-       registry[num_readers].need_mb = &need_mb;
        num_readers++;
 }
 
@@ -251,10 +261,10 @@ static void rcu_remove_reader(pthread_t id)
 
 void rcu_register_thread(void)
 {
-       _rcu_thread_online();
        internal_urcu_lock();
        rcu_add_reader(pthread_self());
        internal_urcu_unlock();
+       _rcu_thread_online();
 }
 
 void rcu_unregister_thread(void)
This page took 0.024923 seconds and 4 git commands to generate.