projects
/
urcu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Document urcu-defer usage with dlclose()
[urcu.git]
/
urcu-defer.c
diff --git
a/urcu-defer.c
b/urcu-defer.c
index dd570713ee8234a82fa80208f612565c5028c112..3cc1a0c0b32b9132673b47a361ea116f9a8bf338 100644
(file)
--- a/
urcu-defer.c
+++ b/
urcu-defer.c
@@
-232,9
+232,15
@@
end:
/*
* _defer_rcu - Queue a RCU callback.
*/
/*
* _defer_rcu - Queue a RCU callback.
*/
-void _defer_rcu
(void (*fct)(void *p), void *p
)
+void _defer_rcu
_ratelimit(void (*fct)(void *p), void *p, int (*rl)(void *p)
)
{
unsigned long head, tail;
{
unsigned long head, tail;
+ int sync;
+
+ /*
+ * Verify if we reached the rate limiter threshold.
+ */
+ sync = rl ? rl(p) : 0;
/*
* Head is only modified by ourself. Tail can be modified by reclamation
/*
* Head is only modified by ourself. Tail can be modified by reclamation
@@
-244,10
+250,10
@@
void _defer_rcu(void (*fct)(void *p), void *p)
tail = LOAD_SHARED(defer_queue.tail);
/*
tail = LOAD_SHARED(defer_queue.tail);
/*
- * If queue is full,
empty it
ourself.
+ * If queue is full,
or reached threshold. Empty queue
ourself.
* Worse-case: must allow 2 supplementary entries for fct pointer.
*/
* Worse-case: must allow 2 supplementary entries for fct pointer.
*/
- if (unlikely(
head - tail >= DEFER_QUEUE_SIZE - 2
)) {
+ if (unlikely(
sync || (head - tail >= DEFER_QUEUE_SIZE - 2)
)) {
assert(head - tail <= DEFER_QUEUE_SIZE);
rcu_defer_barrier_thread();
assert(head - LOAD_SHARED(defer_queue.tail) == 0);
assert(head - tail <= DEFER_QUEUE_SIZE);
rcu_defer_barrier_thread();
assert(head - LOAD_SHARED(defer_queue.tail) == 0);
@@
-315,9
+321,9
@@
void *thr_defer(void *args)
* library wrappers to be used by non-LGPL compatible source code.
*/
* library wrappers to be used by non-LGPL compatible source code.
*/
-void defer_rcu
(void (*fct)(void *p), void *p
)
+void defer_rcu
_ratelimit(void (*fct)(void *p), void *p, int (*rl)(void *p)
)
{
{
- _defer_rcu
(fct, p
);
+ _defer_rcu
_ratelimit(fct, p, rl
);
}
static void start_defer_thread(void)
}
static void start_defer_thread(void)
This page took
0.023162 seconds
and
4
git commands to generate.