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