projects
/
urcu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Build urcu-qsbr.so library, update README
[urcu.git]
/
urcu-qsbr.c
diff --git
a/urcu-qsbr.c
b/urcu-qsbr.c
index 48bc62ec25e09e18395970d591f9dc64b57a1ed7..300eb970e17f5031be51d4421a1e4a3a0080cd38 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-static.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;
@@
-47,14
+47,14
@@
long urcu_gp_ctr = 0;
* Written to only by each individual reader. Read by both the reader and the
* writers.
*/
* Written to only by each individual reader. Read by both the reader and the
* writers.
*/
-long __thread
urcu_active_readers
;
+long __thread
rcu_reader_qs_gp
;
/* Thread IDs of registered readers */
#define INIT_NUM_THREADS 4
struct reader_registry {
pthread_t tid;
/* Thread IDs of registered readers */
#define INIT_NUM_THREADS 4
struct reader_registry {
pthread_t tid;
- long *
urcu_active_readers
;
+ long *
rcu_reader_qs_gp
;
char *need_mb;
};
char *need_mb;
};
@@
-124,19
+124,21
@@
void wait_for_quiescent_state(void)
if (!registry)
return;
/*
if (!registry)
return;
/*
- * Wait for each thread
urcu_active_readers
count to become 0.
+ * Wait for each thread
rcu_reader_qs_gp
count to become 0.
*/
for (index = registry; index < registry + num_readers; index++) {
#ifndef HAS_INCOHERENT_CACHES
*/
for (index = registry; index < registry + num_readers; index++) {
#ifndef HAS_INCOHERENT_CACHES
- while (rcu_old_gp_ongoing(index->urcu_active_readers))
+ while (rcu_gp_ongoing(index->rcu_reader_qs_gp) &&
+ (*index->rcu_reader_qs_gp - urcu_gp_ctr < 0))
cpu_relax();
#else /* #ifndef HAS_INCOHERENT_CACHES */
int wait_loops = 0;
/*
* BUSY-LOOP. Force the reader thread to commit its
cpu_relax();
#else /* #ifndef HAS_INCOHERENT_CACHES */
int wait_loops = 0;
/*
* BUSY-LOOP. Force the reader thread to commit its
- *
urcu_active_readers
update to memory if we wait for too long.
+ *
rcu_reader_qs_gp
update to memory if we wait for too long.
*/
*/
- while (rcu_old_gp_ongoing(index->urcu_active_readers)) {
+ while (rcu_gp_ongoing(index->rcu_reader_qs_gp) &&
+ (*index->rcu_reader_qs_gp - urcu_gp_ctr < 0)) {
if (wait_loops++ == KICK_READER_LOOPS) {
force_mb_single_thread(index);
wait_loops = 0;
if (wait_loops++ == KICK_READER_LOOPS) {
force_mb_single_thread(index);
wait_loops = 0;
@@
-198,6
+200,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;
@@
-219,7
+236,7
@@
static void rcu_add_reader(pthread_t id)
}
registry[num_readers].tid = id;
/* reference to the TLS of _this_ reader thread. */
}
registry[num_readers].tid = id;
/* reference to the TLS of _this_ reader thread. */
- registry[num_readers].
urcu_active_readers = &urcu_active_readers
;
+ registry[num_readers].
rcu_reader_qs_gp = &rcu_reader_qs_gp
;
registry[num_readers].need_mb = &need_mb;
num_readers++;
}
registry[num_readers].need_mb = &need_mb;
num_readers++;
}
@@
-238,7
+255,7
@@
static void rcu_remove_reader(pthread_t id)
memcpy(index, ®istry[num_readers - 1],
sizeof(struct reader_registry));
registry[num_readers - 1].tid = 0;
memcpy(index, ®istry[num_readers - 1],
sizeof(struct reader_registry));
registry[num_readers - 1].tid = 0;
- registry[num_readers - 1].
urcu_active_readers
= NULL;
+ registry[num_readers - 1].
rcu_reader_qs_gp
= NULL;
num_readers--;
return;
}
num_readers--;
return;
}
@@
-252,10
+269,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.02434 seconds
and
4
git commands to generate.