xref: /plan9/sys/src/ape/lib/ap/arm/lock.c (revision 51f48f69b4c3e5c9d9f7955d28612ef2d4048ccc)
1*51f48f69SDavid du Colombier #include "../plan9/lib.h"
280ee5cbfSDavid du Colombier #include "../plan9/sys9.h"
3*51f48f69SDavid du Colombier #define _LOCK_EXTENSION
480ee5cbfSDavid du Colombier #include <lock.h>
5*51f48f69SDavid du Colombier //#include <lib9.h>
680ee5cbfSDavid du Colombier 
780ee5cbfSDavid du Colombier void
lock(Lock * l)8*51f48f69SDavid du Colombier lock(Lock *l)
980ee5cbfSDavid du Colombier {
10*51f48f69SDavid du Colombier 	if(ainc(&l->key) == 1)
11*51f48f69SDavid du Colombier 		return;	/* changed from 0 -> 1: we hold lock */
12*51f48f69SDavid du Colombier 	/* otherwise wait in kernel */
13*51f48f69SDavid du Colombier 	while(_SEMACQUIRE(&l->sem, 1) < 0){
14*51f48f69SDavid du Colombier 		/* interrupted; try again */
15*51f48f69SDavid du Colombier 	}
16*51f48f69SDavid du Colombier }
17*51f48f69SDavid du Colombier 
18*51f48f69SDavid du Colombier void
unlock(Lock * l)19*51f48f69SDavid du Colombier unlock(Lock *l)
20*51f48f69SDavid du Colombier {
21*51f48f69SDavid du Colombier 	if(adec(&l->key) == 0)
22*51f48f69SDavid du Colombier 		return;	/* changed from 1 -> 0: no contention */
23*51f48f69SDavid du Colombier 	_SEMRELEASE(&l->sem, 1);
2480ee5cbfSDavid du Colombier }
2580ee5cbfSDavid du Colombier 
2680ee5cbfSDavid du Colombier int
canlock(Lock * l)27*51f48f69SDavid du Colombier canlock(Lock *l)
2880ee5cbfSDavid du Colombier {
29*51f48f69SDavid du Colombier 	if(ainc(&l->key) == 1)
30*51f48f69SDavid du Colombier 		return 1;	/* changed from 0 -> 1: success */
31*51f48f69SDavid du Colombier 	/* Undo increment (but don't miss wakeup) */
32*51f48f69SDavid du Colombier 	if(adec(&l->key) == 0)
33*51f48f69SDavid du Colombier 		return 0;	/* changed from 1 -> 0: no contention */
34*51f48f69SDavid du Colombier 	_SEMRELEASE(&l->sem, 1);
3580ee5cbfSDavid du Colombier 	return 0;
3680ee5cbfSDavid du Colombier }
37