extern struct defer_queue __thread defer_queue;
extern void rcu_defer_barrier_thread(void);
+extern void wake_up_defer(void);
/*
* not signal-safe.
assert(head - LOAD_SHARED(defer_queue.tail) == 0);
}
- smp_wmb(); /* Publish new pointer before write q[] */
if (unlikely(defer_queue.last_fct_in != fct)) {
defer_queue.last_fct_in = fct;
if (unlikely(DQ_IS_FCT_BIT(fct) || fct == DQ_FCT_MARK)) {
}
}
_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);
+ /*
+ * Wake-up any waiting defer thread.
+ */
+ wake_up_defer();
}
#endif /* _URCU_DEFER_STATIC_H */