Exemple #1
0
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;
}
Exemple #2
0
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}
Exemple #3
0
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;
}