projects
/
userspace-rcu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
doc/examples: add mb flavor
[userspace-rcu.git]
/
urcu-qsbr.c
diff --git
a/urcu-qsbr.c
b/urcu-qsbr.c
index 3c2c65da4aa14e5b6cbf4a7c8b259ab6d86adf3c..d6adc5bfaafa9d4d851842bad7d398967b081eec 100644
(file)
--- a/
urcu-qsbr.c
+++ b/
urcu-qsbr.c
@@
-53,13
+53,7
@@
void __attribute__((destructor)) rcu_exit(void);
static pthread_mutex_t rcu_gp_lock = PTHREAD_MUTEX_INITIALIZER;
void __attribute__((destructor)) rcu_exit(void);
static pthread_mutex_t rcu_gp_lock = PTHREAD_MUTEX_INITIALIZER;
-
-int32_t rcu_gp_futex;
-
-/*
- * Global grace period counter.
- */
-unsigned long rcu_gp_ctr = RCU_GP_ONLINE;
+struct rcu_gp rcu_gp = { .ctr = RCU_GP_ONLINE };
/*
* Active attempts to check for reader Q.S. before calling futex().
/*
* Active attempts to check for reader Q.S. before calling futex().
@@
-118,8
+112,8
@@
static void wait_gp(void)
{
/* Read reader_gp before read futex */
cmm_smp_rmb();
{
/* Read reader_gp before read futex */
cmm_smp_rmb();
- if (uatomic_read(&rcu_gp
_
futex) == -1)
- futex_noasync(&rcu_gp
_
futex, FUTEX_WAIT, -1,
+ if (uatomic_read(&rcu_gp
.
futex) == -1)
+ futex_noasync(&rcu_gp
.
futex, FUTEX_WAIT, -1,
NULL, NULL, 0);
}
NULL, NULL, 0);
}
@@
-133,12
+127,12
@@
static void wait_for_readers(struct cds_list_head *input_readers,
/*
* Wait for each thread URCU_TLS(rcu_reader).ctr to either
* indicate quiescence (offline), or for them to observe the
/*
* Wait for each thread URCU_TLS(rcu_reader).ctr to either
* indicate quiescence (offline), or for them to observe the
- * current rcu_gp
_
ctr value.
+ * current rcu_gp
.
ctr value.
*/
for (;;) {
wait_loops++;
if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) {
*/
for (;;) {
wait_loops++;
if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) {
- uatomic_set(&rcu_gp
_
futex, -1);
+ uatomic_set(&rcu_gp
.
futex, -1);
/*
* Write futex before write waiting (the other side
* reads them in the opposite order).
/*
* Write futex before write waiting (the other side
* reads them in the opposite order).
@@
-177,7
+171,7
@@
static void wait_for_readers(struct cds_list_head *input_readers,
if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) {
/* Read reader_gp before write futex */
cmm_smp_mb();
if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) {
/* Read reader_gp before write futex */
cmm_smp_mb();
- uatomic_set(&rcu_gp
_
futex, 0);
+ uatomic_set(&rcu_gp
.
futex, 0);
}
break;
} else {
}
break;
} else {
@@
-208,7
+202,7
@@
void synchronize_rcu(void)
DEFINE_URCU_WAIT_NODE(wait, URCU_WAIT_WAITING);
struct urcu_waiters waiters;
DEFINE_URCU_WAIT_NODE(wait, URCU_WAIT_WAITING);
struct urcu_waiters waiters;
- was_online =
URCU_TLS(rcu_reader).ctr
;
+ was_online =
rcu_read_ongoing()
;
/* All threads should read qparity before accessing data structure
* where new ptr points to. In the "then" case, rcu_thread_offline
/* All threads should read qparity before accessing data structure
* where new ptr points to. In the "then" case, rcu_thread_offline
@@
-253,11
+247,11
@@
void synchronize_rcu(void)
/*
* Must finish waiting for quiescent state for original parity
/*
* Must finish waiting for quiescent state for original parity
- * before committing next rcu_gp
_
ctr update to memory. Failure
+ * before committing next rcu_gp
.
ctr update to memory. Failure
* to do so could result in the writer waiting forever while new
* readers are always accessing data (no progress). Enforce
* compiler-order of load URCU_TLS(rcu_reader).ctr before store
* to do so could result in the writer waiting forever while new
* readers are always accessing data (no progress). Enforce
* compiler-order of load URCU_TLS(rcu_reader).ctr before store
- * to rcu_gp
_
ctr.
+ * to rcu_gp
.
ctr.
*/
cmm_barrier();
*/
cmm_barrier();
@@
-269,13
+263,13
@@
void synchronize_rcu(void)
cmm_smp_mb();
/* Switch parity: 0 -> 1, 1 -> 0 */
cmm_smp_mb();
/* Switch parity: 0 -> 1, 1 -> 0 */
- CMM_STORE_SHARED(rcu_gp
_ctr, rcu_gp_
ctr ^ RCU_GP_CTR);
+ CMM_STORE_SHARED(rcu_gp
.ctr, rcu_gp.
ctr ^ RCU_GP_CTR);
/*
/*
- * Must commit rcu_gp
_
ctr update to memory before waiting for
+ * Must commit rcu_gp
.
ctr update to memory before waiting for
* quiescent state. Failure to do so could result in the writer
* waiting forever while new readers are always accessing data
* quiescent state. Failure to do so could result in the writer
* waiting forever while new readers are always accessing data
- * (no progress). Enforce compiler-order of store to rcu_gp
_
ctr
+ * (no progress). Enforce compiler-order of store to rcu_gp
.
ctr
* before load URCU_TLS(rcu_reader).ctr.
*/
cmm_barrier();
* before load URCU_TLS(rcu_reader).ctr.
*/
cmm_barrier();
@@
-317,7
+311,7
@@
void synchronize_rcu(void)
DEFINE_URCU_WAIT_NODE(wait, URCU_WAIT_WAITING);
struct urcu_waiters waiters;
DEFINE_URCU_WAIT_NODE(wait, URCU_WAIT_WAITING);
struct urcu_waiters waiters;
- was_online =
URCU_TLS(rcu_reader).ctr
;
+ was_online =
rcu_read_ongoing()
;
/*
* Mark the writer thread offline to make sure we don't wait for
/*
* Mark the writer thread offline to make sure we don't wait for
@@
-353,13
+347,13
@@
void synchronize_rcu(void)
goto out;
/* Increment current G.P. */
goto out;
/* Increment current G.P. */
- CMM_STORE_SHARED(rcu_gp
_ctr, rcu_gp_
ctr + RCU_GP_CTR);
+ CMM_STORE_SHARED(rcu_gp
.ctr, rcu_gp.
ctr + RCU_GP_CTR);
/*
/*
- * Must commit rcu_gp
_
ctr update to memory before waiting for
+ * Must commit rcu_gp
.
ctr update to memory before waiting for
* quiescent state. Failure to do so could result in the writer
* waiting forever while new readers are always accessing data
* quiescent state. Failure to do so could result in the writer
* waiting forever while new readers are always accessing data
- * (no progress). Enforce compiler-order of store to rcu_gp
_
ctr
+ * (no progress). Enforce compiler-order of store to rcu_gp
.
ctr
* before load URCU_TLS(rcu_reader).ctr.
*/
cmm_barrier();
* before load URCU_TLS(rcu_reader).ctr.
*/
cmm_barrier();
@@
-405,6
+399,11
@@
void rcu_read_unlock(void)
_rcu_read_unlock();
}
_rcu_read_unlock();
}
+int rcu_read_ongoing(void)
+{
+ return _rcu_read_ongoing();
+}
+
void rcu_quiescent_state(void)
{
_rcu_quiescent_state();
void rcu_quiescent_state(void)
{
_rcu_quiescent_state();
This page took
0.024429 seconds
and
4
git commands to generate.