X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=urcu-call-rcu-impl.h;h=d5b75c076de22de777244cc26fb86f0791f898a5;hb=b75dffe654debbf8fd5a62d94cfeea15df6223e7;hp=f9250e8b4129b925aeb7b47f609d3e91dd3f790d;hpb=356c8794ee9e562954a52653fbb8f37b7fe16082;p=urcu.git diff --git a/urcu-call-rcu-impl.h b/urcu-call-rcu-impl.h index f9250e8..d5b75c0 100644 --- a/urcu-call-rcu-impl.h +++ b/urcu-call-rcu-impl.h @@ -609,6 +609,8 @@ void call_rcu_data_free(struct call_rcu_data *crdp) _CMM_STORE_SHARED(crdp->cbs.head, NULL); cbs_tail = (struct cds_wfq_node **) uatomic_xchg(&crdp->cbs.tail, &crdp->cbs.head); + /* Create default call rcu data if need be */ + (void) get_default_call_rcu_data(); cbs_endprev = (struct cds_wfq_node **) uatomic_xchg(&default_call_rcu_data, cbs_tail); *cbs_endprev = cbs; @@ -617,7 +619,10 @@ void call_rcu_data_free(struct call_rcu_data *crdp) wake_call_rcu_thread(default_call_rcu_data); } + call_rcu_lock(&call_rcu_mutex); cds_list_del(&crdp->list); + call_rcu_unlock(&call_rcu_mutex); + free(crdp); }