xref: /plan9-contrib/sys/src/ape/lib/ap/spim/lock.c (revision 12b1df16f1a9233fb47d4260d51ef450cc19c368)
1*12b1df16SDavid du Colombier #include "../plan9/lib.h"
2*12b1df16SDavid du Colombier #include "../plan9/sys9.h"
3*12b1df16SDavid du Colombier #define _LOCK_EXTENSION
4*12b1df16SDavid du Colombier #include <lock.h>
5*12b1df16SDavid du Colombier //#include <lib9.h>
6*12b1df16SDavid du Colombier 
7*12b1df16SDavid du Colombier void
lock(Lock * l)8*12b1df16SDavid du Colombier lock(Lock *l)
9*12b1df16SDavid du Colombier {
10*12b1df16SDavid du Colombier 	if(ainc(&l->key) == 1)
11*12b1df16SDavid du Colombier 		return;	/* changed from 0 -> 1: we hold lock */
12*12b1df16SDavid du Colombier 	/* otherwise wait in kernel */
13*12b1df16SDavid du Colombier 	while(_SEMACQUIRE(&l->sem, 1) < 0){
14*12b1df16SDavid du Colombier 		/* interrupted; try again */
15*12b1df16SDavid du Colombier 	}
16*12b1df16SDavid du Colombier }
17*12b1df16SDavid du Colombier 
18*12b1df16SDavid du Colombier void
unlock(Lock * l)19*12b1df16SDavid du Colombier unlock(Lock *l)
20*12b1df16SDavid du Colombier {
21*12b1df16SDavid du Colombier 	if(adec(&l->key) == 0)
22*12b1df16SDavid du Colombier 		return;	/* changed from 1 -> 0: no contention */
23*12b1df16SDavid du Colombier 	_SEMRELEASE(&l->sem, 1);
24*12b1df16SDavid du Colombier }
25*12b1df16SDavid du Colombier 
26*12b1df16SDavid du Colombier int
canlock(Lock * l)27*12b1df16SDavid du Colombier canlock(Lock *l)
28*12b1df16SDavid du Colombier {
29*12b1df16SDavid du Colombier 	if(ainc(&l->key) == 1)
30*12b1df16SDavid du Colombier 		return 1;	/* changed from 0 -> 1: success */
31*12b1df16SDavid du Colombier 	/* Undo increment (but don't miss wakeup) */
32*12b1df16SDavid du Colombier 	if(adec(&l->key) == 0)
33*12b1df16SDavid du Colombier 		return 0;	/* changed from 1 -> 0: no contention */
34*12b1df16SDavid du Colombier 	_SEMRELEASE(&l->sem, 1);
35*12b1df16SDavid du Colombier 	return 0;
36*12b1df16SDavid du Colombier }
37