projects
/
urcu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
call_rcu: add back delay in list non-empty case
[urcu.git]
/
urcu-bp-static.h
diff --git
a/urcu-bp-static.h
b/urcu-bp-static.h
index 933f2349a4c015dc9c77ffbabe9491cb3357a3fb..14c6cfecac3af01a3bc4680c36381736f37a30f7 100644
(file)
--- a/
urcu-bp-static.h
+++ b/
urcu-bp-static.h
@@
-9,7
+9,7
@@
* TO BE INCLUDED ONLY IN LGPL-COMPATIBLE CODE. See urcu.h for linking
* dynamically with the userspace rcu library.
*
* TO BE INCLUDED ONLY IN LGPL-COMPATIBLE CODE. See urcu.h for linking
* dynamically with the userspace rcu library.
*
- * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@
polymtl.ca
>
+ * Copyright (c) 2009 Mathieu Desnoyers <mathieu.desnoyers@
efficios.com
>
* Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
*
* This library is free software; you can redistribute it and/or
* Copyright (c) 2009 Paul E. McKenney, IBM Corporation.
*
* This library is free software; you can redistribute it and/or
@@
-140,7
+140,7
@@
struct rcu_reader {
/* Data used by both reader and synchronize_rcu() */
long ctr;
/* Data used for registry */
/* Data used by both reader and synchronize_rcu() */
long ctr;
/* Data used for registry */
- struct
list_head head __attribute__((aligned(
CACHE_LINE_SIZE)));
+ struct
cds_list_head node __attribute__((aligned(CAA_
CACHE_LINE_SIZE)));
pthread_t tid;
int alloc; /* registry entry allocated */
};
pthread_t tid;
int alloc; /* registry entry allocated */
};
@@
-162,7
+162,7
@@
static inline int rcu_old_gp_ongoing(long *value)
* Make sure both tests below are done on the same version of *value
* to insure consistency.
*/
* Make sure both tests below are done on the same version of *value
* to insure consistency.
*/
- v = LOAD_SHARED(*value);
+ v =
CMM_
LOAD_SHARED(*value);
return (v & RCU_GP_CTR_NEST_MASK) &&
((v ^ rcu_gp_ctr) & RCU_GP_CTR_PHASE);
}
return (v & RCU_GP_CTR_NEST_MASK) &&
((v ^ rcu_gp_ctr) & RCU_GP_CTR_PHASE);
}
@@
-175,20
+175,21
@@
static inline void _rcu_read_lock(void)
if (unlikely(!rcu_reader))
rcu_bp_register();
if (unlikely(!rcu_reader))
rcu_bp_register();
+ cmm_barrier(); /* Ensure the compiler does not reorder us with mutex */
tmp = rcu_reader->ctr;
/*
* rcu_gp_ctr is
* RCU_GP_COUNT | (~RCU_GP_CTR_PHASE or RCU_GP_CTR_PHASE)
*/
if (likely(!(tmp & RCU_GP_CTR_NEST_MASK))) {
tmp = rcu_reader->ctr;
/*
* rcu_gp_ctr is
* RCU_GP_COUNT | (~RCU_GP_CTR_PHASE or RCU_GP_CTR_PHASE)
*/
if (likely(!(tmp & RCU_GP_CTR_NEST_MASK))) {
- _
STORE_SHARED(rcu_reader->ctr,
_LOAD_SHARED(rcu_gp_ctr));
+ _
CMM_STORE_SHARED(rcu_reader->ctr, _CMM
_LOAD_SHARED(rcu_gp_ctr));
/*
* Set active readers count for outermost nesting level before
* accessing the pointer.
*/
/*
* Set active readers count for outermost nesting level before
* accessing the pointer.
*/
- smp_mb();
+
cmm_
smp_mb();
} else {
} else {
- _STORE_SHARED(rcu_reader->ctr, tmp + RCU_GP_COUNT);
+ _
CMM_
STORE_SHARED(rcu_reader->ctr, tmp + RCU_GP_COUNT);
}
}
}
}
@@
-197,8
+198,9
@@
static inline void _rcu_read_unlock(void)
/*
* Finish using rcu before decrementing the pointer.
*/
/*
* Finish using rcu before decrementing the pointer.
*/
- smp_mb();
- _STORE_SHARED(rcu_reader->ctr, rcu_reader->ctr - RCU_GP_COUNT);
+ cmm_smp_mb();
+ _CMM_STORE_SHARED(rcu_reader->ctr, rcu_reader->ctr - RCU_GP_COUNT);
+ cmm_barrier(); /* Ensure the compiler does not reorder us with mutex */
}
#ifdef __cplusplus
}
#ifdef __cplusplus
This page took
0.02399 seconds
and
4
git commands to generate.