struct cds_list_head *pdeq_pop_r(struct pdeq *d) { struct cds_list_head *e; spin_lock(&d->rlock); e = deq_pop_r(&d->rdeq); if (e == NULL) { spin_unlock(&d->rlock); spin_lock(&d->llock); spin_lock(&d->rlock); e = deq_pop_r(&d->rdeq); if (e == NULL) { e = deq_pop_r(&d->ldeq); cds_list_splice(&d->ldeq.chain, &d->rdeq.chain); CDS_INIT_LIST_HEAD(&d->ldeq.chain); } spin_unlock(&d->llock); } spin_unlock(&d->rlock); return e; }
struct cds_list_head *pdeq_pop_r(struct pdeq *d) //\lnlbl{popr:b} { struct cds_list_head *e; spin_lock(&d->rlock); //\lnlbl{popr:acq:r1} e = deq_pop_r(&d->rdeq); //\lnlbl{popr:deq:rr1} if (e == NULL) { //\lnlbl{popr:check1} spin_unlock(&d->rlock); //\lnlbl{popr:rel:r1} spin_lock(&d->llock); //\lnlbl{popr:acq:l} spin_lock(&d->rlock); //\lnlbl{popr:acq:r2} e = deq_pop_r(&d->rdeq); //\lnlbl{popr:deq:rr2} if (e == NULL) { //\lnlbl{popr:check2} e = deq_pop_r(&d->ldeq); //\lnlbl{popr:deq:rl} cds_list_splice(&d->ldeq.chain, &d->rdeq.chain);//\lnlbl{popr:move} CDS_INIT_LIST_HEAD(&d->ldeq.chain); //\lnlbl{popr:init:l} } spin_unlock(&d->llock); //\lnlbl{popr:rel:l} } //\lnlbl{popr:skip2} spin_unlock(&d->rlock); //\lnlbl{popr:rel:r2} return e; } //\lnlbl{popr:e}
struct cds_list_head *pdeq_pop_r(struct pdeq *d) { struct cds_list_head *e; int i; spin_lock(&d->rlock); i = moveleft(d->ridx); e = deq_pop_r(&d->bkt[i]); if (e != NULL) d->ridx = i; spin_unlock(&d->rlock); return e; }