- if(p->state != Rendezvous)
- return ret;
-
- /* Try and pull out of a rendezvous */
- lock(p->rgrp);
- if(p->state == Rendezvous) {
- p->rendval = ~0;
- l = &REND(p->rgrp, p->rendtag);
- for(d = *l; d; d = d->rendhash) {
- if(d == p) {
- *l = p->rendhash;
- break;
+ switch(p->state){
+ case Queueing:
+ /* Try and pull out of a eqlock */
+ if((q = p->eql) != nil){
+ lock(&q->use);
+ if(p->state == Queueing && p->eql == q){
+ Proc *d, *l;
+
+ for(l = nil, d = q->head; d != nil; l = d, d = d->qnext){
+ if(d == p){
+ if(l != nil)
+ l->qnext = p->qnext;
+ else
+ q->head = p->qnext;
+ if(p->qnext == nil)
+ q->tail = l;
+ p->qnext = nil;
+ p->eql = nil; /* not taken */
+ ready(p);
+ break;
+ }
+ }