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