X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=urcu-defer.c;h=b7b3c51f2c0eed98562b1a0b8c726c5daf30a3cc;hb=a1cbdce3b16f269291fb2c6f2ecb88c96d57539b;hp=dd570713ee8234a82fa80208f612565c5028c112;hpb=b4f313b7ffb3215d54790f303c2ff3e4a41e5919;p=urcu.git diff --git a/urcu-defer.c b/urcu-defer.c index dd57071..b7b3c51 100644 --- a/urcu-defer.c +++ b/urcu-defer.c @@ -244,10 +244,10 @@ void _defer_rcu(void (*fct)(void *p), void *p) 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. */ - 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);