static pthread_mutex_t defer_thread_mutex = PTHREAD_MUTEX_INITIALIZER;
static int defer_thread_futex;
static pthread_mutex_t defer_thread_mutex = PTHREAD_MUTEX_INITIALIZER;
static int defer_thread_futex;
unsigned long num_items = 0, head;
struct defer_queue *index;
unsigned long num_items = 0, head;
struct defer_queue *index;
list_for_each_entry(index, ®istry, list) {
head = LOAD_SHARED(index->head);
num_items += head - index->tail;
}
list_for_each_entry(index, ®istry, list) {
head = LOAD_SHARED(index->head);
num_items += head - index->tail;
}
list_for_each_entry(index, ®istry, list) {
index->last_head = LOAD_SHARED(index->head);
num_items += index->last_head - index->tail;
list_for_each_entry(index, ®istry, list) {
index->last_head = LOAD_SHARED(index->head);
num_items += index->last_head - index->tail;
list_for_each_entry(index, ®istry, list)
rcu_defer_barrier_queue(index, index->last_head);
end:
list_for_each_entry(index, ®istry, list)
rcu_defer_barrier_queue(index, index->last_head);
end:
* Worse-case: must allow 2 supplementary entries for fct pointer.
*/
if (unlikely(head - tail >= DEFER_QUEUE_SIZE - 2)) {
* Worse-case: must allow 2 supplementary entries for fct pointer.
*/
if (unlikely(head - tail >= DEFER_QUEUE_SIZE - 2)) {
was_empty = list_empty(®istry);
list_add(&defer_queue.list, ®istry);
was_empty = list_empty(®istry);
list_add(&defer_queue.list, ®istry);
list_del(&defer_queue.list);
_rcu_defer_barrier_thread();
free(defer_queue.q);
defer_queue.q = NULL;
is_empty = list_empty(®istry);
list_del(&defer_queue.list);
_rcu_defer_barrier_thread();
free(defer_queue.q);
defer_queue.q = NULL;
is_empty = list_empty(®istry);