xref: /plan9-contrib/sys/src/ape/lib/ap/amd64/lock.c (revision 285246837f6ada0b67af5868b125ec5a52651955)
1*28524683SDavid du Colombier #include "../plan9/lib.h"
2272efad7SDavid du Colombier #include "../plan9/sys9.h"
3*28524683SDavid du Colombier #define _LOCK_EXTENSION
4272efad7SDavid du Colombier #include <lock.h>
5*28524683SDavid du Colombier //#include <lib9.h>
6272efad7SDavid du Colombier 
7272efad7SDavid du Colombier void
lock(Lock * l)8*28524683SDavid du Colombier lock(Lock *l)
9272efad7SDavid du Colombier {
10*28524683SDavid du Colombier 	if(ainc(&l->key) == 1)
11*28524683SDavid du Colombier 		return;	/* changed from 0 -> 1: we hold lock */
12*28524683SDavid du Colombier 	/* otherwise wait in kernel */
13*28524683SDavid du Colombier 	while(_SEMACQUIRE(&l->sem, 1) < 0){
14*28524683SDavid du Colombier 		/* interrupted; try again */
15*28524683SDavid du Colombier 	}
16*28524683SDavid du Colombier }
17*28524683SDavid du Colombier 
18*28524683SDavid du Colombier void
unlock(Lock * l)19*28524683SDavid du Colombier unlock(Lock *l)
20*28524683SDavid du Colombier {
21*28524683SDavid du Colombier 	if(adec(&l->key) == 0)
22*28524683SDavid du Colombier 		return;	/* changed from 1 -> 0: no contention */
23*28524683SDavid du Colombier 	_SEMRELEASE(&l->sem, 1);
24272efad7SDavid du Colombier }
25272efad7SDavid du Colombier 
26272efad7SDavid du Colombier int
canlock(Lock * l)27*28524683SDavid du Colombier canlock(Lock *l)
28272efad7SDavid du Colombier {
29*28524683SDavid du Colombier 	if(ainc(&l->key) == 1)
30*28524683SDavid du Colombier 		return 1;	/* changed from 0 -> 1: success */
31*28524683SDavid du Colombier 	/* Undo increment (but don't miss wakeup) */
32*28524683SDavid du Colombier 	if(adec(&l->key) == 0)
33*28524683SDavid du Colombier 		return 0;	/* changed from 1 -> 0: no contention */
34*28524683SDavid du Colombier 	_SEMRELEASE(&l->sem, 1);
35272efad7SDavid du Colombier 	return 0;
36272efad7SDavid du Colombier }
37