projects
/
urcu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
urcu-defer: make call_rcu() energy efficient using futex()
[urcu.git]
/
urcu-defer-static.h
diff --git
a/urcu-defer-static.h
b/urcu-defer-static.h
index 7d0ed52cf88b624d5a236a5a35c3d1f8920ef661..dd24c61d85d7885d685323757f83c52c2df2f15f 100644
(file)
--- a/
urcu-defer-static.h
+++ b/
urcu-defer-static.h
@@
-125,6
+125,7
@@
struct defer_queue {
extern struct defer_queue __thread defer_queue;
extern void rcu_defer_barrier_thread(void);
extern struct defer_queue __thread defer_queue;
extern void rcu_defer_barrier_thread(void);
+extern void wake_up_defer(void);
/*
* not signal-safe.
/*
* not signal-safe.
@@
-150,9
+151,7
@@
static inline void _rcu_defer_queue(void (*fct)(void *p), void *p)
assert(head - LOAD_SHARED(defer_queue.tail) == 0);
}
assert(head - LOAD_SHARED(defer_queue.tail) == 0);
}
- smp_wmb(); /* Publish new pointer before write q[] */
if (unlikely(defer_queue.last_fct_in != fct)) {
if (unlikely(defer_queue.last_fct_in != fct)) {
- //printf("fct diff %p %p\n", defer_queue.last_fct, fct);
defer_queue.last_fct_in = fct;
if (unlikely(DQ_IS_FCT_BIT(fct) || fct == DQ_FCT_MARK)) {
/*
defer_queue.last_fct_in = fct;
if (unlikely(DQ_IS_FCT_BIT(fct) || fct == DQ_FCT_MARK)) {
/*
@@
-170,7
+169,6
@@
static inline void _rcu_defer_queue(void (*fct)(void *p), void *p)
fct);
}
} else {
fct);
}
} else {
- //printf("fct same %p\n", fct);
if (unlikely(DQ_IS_FCT_BIT(p) || p == DQ_FCT_MARK)) {
/*
* If the data to encode is not aligned or the marker,
if (unlikely(DQ_IS_FCT_BIT(p) || p == DQ_FCT_MARK)) {
/*
* If the data to encode is not aligned or the marker,
@@
-183,8
+181,13
@@
static inline void _rcu_defer_queue(void (*fct)(void *p), void *p)
}
}
_STORE_SHARED(defer_queue.q[head++ & DEFER_QUEUE_MASK], p);
}
}
_STORE_SHARED(defer_queue.q[head++ & DEFER_QUEUE_MASK], p);
- smp_wmb(); /* Write q[] before head. */
+ smp_wmb(); /* Publish new pointer before head */
+ /* Write q[] before head. */
STORE_SHARED(defer_queue.head, head);
STORE_SHARED(defer_queue.head, head);
+ /*
+ * Wake-up any waiting defer thread.
+ */
+ wake_up_defer();
}
#endif /* _URCU_DEFER_STATIC_H */
}
#endif /* _URCU_DEFER_STATIC_H */
This page took
0.022771 seconds
and
4
git commands to generate.