projects
/
urcu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
wfstack test: test if number of push to empty vs pop_all match
[urcu.git]
/
urcu
/
static
/
urcu.h
diff --git
a/urcu/static/urcu.h
b/urcu/static/urcu.h
index c517693ff1cf187982882bf30f412e454ae8d26f..973826a52bfa021423bbb8cce12545357d2df48b 100644
(file)
--- a/
urcu/static/urcu.h
+++ b/
urcu/static/urcu.h
@@
-96,6
+96,12
@@
extern "C" {
#define SIGRCU SIGUSR1
#endif
#define SIGRCU SIGUSR1
#endif
+enum rcu_state {
+ RCU_READER_ACTIVE_CURRENT,
+ RCU_READER_ACTIVE_OLD,
+ RCU_READER_INACTIVE,
+};
+
#ifdef DEBUG_RCU
#define rcu_assert(args...) assert(args)
#else
#ifdef DEBUG_RCU
#define rcu_assert(args...) assert(args)
#else
@@
-108,8
+114,8
@@
extern "C" {
#include <pthread.h>
#include <unistd.h>
#include <pthread.h>
#include <unistd.h>
-#define
YIELD_READ
(1 << 0)
-#define
YIELD_WRITE
(1 << 1)
+#define
RCU_YIELD_READ
(1 << 0)
+#define
RCU_YIELD_WRITE
(1 << 1)
/*
* Updates with RCU_SIGNAL are much slower. Account this in the delay.
/*
* Updates with RCU_SIGNAL are much slower. Account this in the delay.
@@
-121,37
+127,37
@@
extern "C" {
#define MAX_SLEEP 50
#endif
#define MAX_SLEEP 50
#endif
-extern unsigned int yield_active;
-extern DECLARE_URCU_TLS(unsigned int, rand_yield);
+extern unsigned int
rcu_
yield_active;
+extern DECLARE_URCU_TLS(unsigned int, r
cu_r
and_yield);
-static inline void debug_yield_read(void)
+static inline void
rcu_
debug_yield_read(void)
{
{
- if (
yield_active &
YIELD_READ)
- if (rand_r(&URCU_TLS(rand_yield)) & 0x1)
- usleep(rand_r(&URCU_TLS(rand_yield)) % MAX_SLEEP);
+ if (
rcu_yield_active & RCU_
YIELD_READ)
+ if (rand_r(&URCU_TLS(r
cu_r
and_yield)) & 0x1)
+ usleep(rand_r(&URCU_TLS(r
cu_r
and_yield)) % MAX_SLEEP);
}
}
-static inline void debug_yield_write(void)
+static inline void
rcu_
debug_yield_write(void)
{
{
- if (
yield_active &
YIELD_WRITE)
- if (rand_r(&URCU_TLS(rand_yield)) & 0x1)
- usleep(rand_r(&URCU_TLS(rand_yield)) % MAX_SLEEP);
+ if (
rcu_yield_active & RCU_
YIELD_WRITE)
+ if (rand_r(&URCU_TLS(r
cu_r
and_yield)) & 0x1)
+ usleep(rand_r(&URCU_TLS(r
cu_r
and_yield)) % MAX_SLEEP);
}
}
-static inline void debug_yield_init(void)
+static inline void
rcu_
debug_yield_init(void)
{
{
- URCU_TLS(rand_yield) = time(NULL) ^ (unsigned long) pthread_self();
+ URCU_TLS(r
cu_r
and_yield) = time(NULL) ^ (unsigned long) pthread_self();
}
#else
}
#else
-static inline void debug_yield_read(void)
+static inline void
rcu_
debug_yield_read(void)
{
}
{
}
-static inline void debug_yield_write(void)
+static inline void
rcu_
debug_yield_write(void)
{
}
{
}
-static inline void debug_yield_init(void)
+static inline void
rcu_
debug_yield_init(void)
{
}
{
}
@@
-173,11
+179,11
@@
static inline void debug_yield_init(void)
#define RCU_MB_GROUP MB_GROUP_ALL
#ifdef RCU_MEMBARRIER
#define RCU_MB_GROUP MB_GROUP_ALL
#ifdef RCU_MEMBARRIER
-extern int has_sys_membarrier;
+extern int
rcu_
has_sys_membarrier;
static inline void smp_mb_slave(int group)
{
static inline void smp_mb_slave(int group)
{
- if (caa_likely(has_sys_membarrier))
+ if (caa_likely(
rcu_
has_sys_membarrier))
cmm_barrier();
else
cmm_smp_mb();
cmm_barrier();
else
cmm_smp_mb();
@@
-225,21
+231,21
@@
struct rcu_reader {
extern DECLARE_URCU_TLS(struct rcu_reader, rcu_reader);
extern DECLARE_URCU_TLS(struct rcu_reader, rcu_reader);
-extern int32_t gp_futex;
+extern int32_t
rcu_
gp_futex;
/*
* Wake-up waiting synchronize_rcu(). Called from many concurrent threads.
*/
static inline void wake_up_gp(void)
{
/*
* Wake-up waiting synchronize_rcu(). Called from many concurrent threads.
*/
static inline void wake_up_gp(void)
{
- if (caa_unlikely(uatomic_read(&gp_futex) == -1)) {
- uatomic_set(&gp_futex, 0);
- futex_async(&gp_futex, FUTEX_WAKE, 1,
+ if (caa_unlikely(uatomic_read(&
rcu_
gp_futex) == -1)) {
+ uatomic_set(&
rcu_
gp_futex, 0);
+ futex_async(&
rcu_
gp_futex, FUTEX_WAKE, 1,
NULL, NULL, 0);
}
}
NULL, NULL, 0);
}
}
-static inline
int rcu_gp_ongoing
(unsigned long *ctr)
+static inline
enum rcu_state rcu_reader_state
(unsigned long *ctr)
{
unsigned long v;
{
unsigned long v;
@@
-248,8
+254,11
@@
static inline int rcu_gp_ongoing(unsigned long *ctr)
* to insure consistency.
*/
v = CMM_LOAD_SHARED(*ctr);
* to insure consistency.
*/
v = CMM_LOAD_SHARED(*ctr);
- return (v & RCU_GP_CTR_NEST_MASK) &&
- ((v ^ rcu_gp_ctr) & RCU_GP_CTR_PHASE);
+ if (!(v & RCU_GP_CTR_NEST_MASK))
+ return RCU_READER_INACTIVE;
+ if (!((v ^ rcu_gp_ctr) & RCU_GP_CTR_PHASE))
+ return RCU_READER_ACTIVE_CURRENT;
+ return RCU_READER_ACTIVE_OLD;
}
/*
}
/*
This page took
0.02516 seconds
and
4
git commands to generate.