-void nbd_defer_free (void *x) {
- LOCALIZE_THREAD_LOCAL(tid_, int);
- fifo_enqueue(pending_[tid_], x);
- TRACE("r0", "nbd_defer_free: put %p on queue at position %llu", x, pending_[tid_]->head);
- rcu_post(pending_[tid_]->head);
+void rcu_defer_free (void *x) {
+ assert(x);
+ int thread_index = GET_THREAD_INDEX();
+ fifo_t *q = pending_[thread_index];
+ assert(MOD_SCALE(q->head + 1, q->scale) != MOD_SCALE(q->tail, q->scale));
+ uint32_t i = MOD_SCALE(q->head, q->scale);
+ q->x[i] = x;
+ TRACE("r0", "rcu_defer_free: put %p on queue at position %llu", x, q->head);
+ q->head++;
+
+ if (pending_[thread_index]->head - rcu_last_posted_[thread_index][thread_index] >= RCU_POST_THRESHOLD) {
+ TRACE("r0", "rcu_defer_free: posting %llu", pending_[thread_index]->head, 0);
+ int next_thread_index = (thread_index + 1) % num_threads_;
+ rcu_[next_thread_index][thread_index] = pending_[thread_index]->head;
+ rcu_last_posted_[thread_index][thread_index] = pending_[thread_index]->head;
+ }