projects
/
urcu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
qsbr urcu: simplifications and fixes.
[urcu.git]
/
urcu-qsbr.c
diff --git
a/urcu-qsbr.c
b/urcu-qsbr.c
index 6ba03642f852763057781dcf14bf2ff4a01dc5b9..14733ab21e1b61d10bf93ecc082967cdf9d717cd 100644
(file)
--- a/
urcu-qsbr.c
+++ b/
urcu-qsbr.c
@@
-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.
*
* 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 <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 */
/* 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;
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;
struct reader_registry {
pthread_t tid;
long *rcu_reader_qs_gp;
- char *need_mb;
};
#ifdef DEBUG_YIELD
};
#ifdef DEBUG_YIELD
@@
-64,10
+63,9
@@
unsigned int __thread rand_yield;
#endif
static struct reader_registry *registry;
#endif
static struct reader_registry *registry;
-static char __thread need_mb;
static int num_readers, alloc_readers;
static int num_readers, alloc_readers;
-void internal_urcu_lock(void)
+
static
void internal_urcu_lock(void)
{
int ret;
{
int ret;
@@
-84,17
+82,12
@@
void internal_urcu_lock(void)
perror("Error in pthread mutex lock");
exit(-1);
}
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 */
}
poll(NULL,0,10);
}
#endif /* #else #ifndef DISTRUST_SIGNALS_EXTREME */
}
-void internal_urcu_unlock(void)
+
static
void internal_urcu_unlock(void)
{
int ret;
{
int ret;
@@
-117,7
+110,7
@@
static void force_mb_all_threads(void)
smp_mb();
}
smp_mb();
}
-void wait_for_quiescent_state(void)
+
static
void wait_for_quiescent_state(void)
{
struct reader_registry *index;
{
struct reader_registry *index;
@@
-200,6
+193,21
@@
void *rcu_publish_content_sym(void **p, void *v)
return oldptr;
}
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;
static void rcu_add_reader(pthread_t id)
{
struct reader_registry *oldarray;
@@
-222,7
+230,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].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++;
}
num_readers++;
}
@@
-254,10
+261,16
@@
void rcu_register_thread(void)
internal_urcu_lock();
rcu_add_reader(pthread_self());
internal_urcu_unlock();
internal_urcu_lock();
rcu_add_reader(pthread_self());
internal_urcu_unlock();
+ _rcu_thread_online();
}
void rcu_unregister_thread(void)
{
}
void rcu_unregister_thread(void)
{
+ /*
+ * We have to make the thread offline otherwise we end up dealocking
+ * with a waiting writer.
+ */
+ _rcu_thread_offline();
internal_urcu_lock();
rcu_remove_reader(pthread_self());
internal_urcu_unlock();
internal_urcu_lock();
rcu_remove_reader(pthread_self());
internal_urcu_unlock();
This page took
0.024811 seconds
and
4
git commands to generate.