Russ Coxa934846f21 years agoHistory
94 lines · 1.1 KB · C
RawDownload
#include "u.h"#include "lib.h"#include "dat.h"#include "fns.h" static voidqueue(Proc **first, Proc **last){	Proc *t; 	t = *last;	if(t == 0)		*first = up;	else		t->qnext = up;	*last = up;	up->qnext = 0;} static Proc*dequeue(Proc **first, Proc **last){	Proc *t; 	t = *first;	if(t == 0)		return 0;	*first = t->qnext;	if(*first == 0)		*last = 0;	return t;} voidqlock(QLock *q){	lock(&q->lk); 	if(q->hold == 0) {		q->hold = up;		unlock(&q->lk);		return;	} 	/*	 * Can't assert this because of RWLock	assert(q->hold != up);	 */		 	queue((Proc**)&q->first, (Proc**)&q->last);	unlock(&q->lk);	procsleep();} intcanqlock(QLock *q){	lock(&q->lk);	if(q->hold == 0) {		q->hold = up;		unlock(&q->lk);		return 1;	}	unlock(&q->lk);	return 0;} voidqunlock(QLock *q){	Proc *p; 	lock(&q->lk);	/* 	 * Can't assert this because of RWlock	assert(q->hold == CT);	 */	p = dequeue((Proc**)&q->first, (Proc**)&q->last);	if(p) {		q->hold = p;		unlock(&q->lk);		procwakeup(p);	} else {		q->hold = 0;		unlock(&q->lk);	}} intholdqlock(QLock *q){	return q->hold == up;} 

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t