xref: /plan9/sys/src/libc/port/lock.c (revision 51f48f69b4c3e5c9d9f7955d28612ef2d4048ccc)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier 
47dd7cddfSDavid du Colombier void
lock(Lock * l)5*51f48f69SDavid du Colombier lock(Lock *l)
67dd7cddfSDavid du Colombier {
7*51f48f69SDavid du Colombier 	if(ainc(&l->key) == 1)
8*51f48f69SDavid du Colombier 		return;	/* changed from 0 -> 1: we hold lock */
9*51f48f69SDavid du Colombier 	/* otherwise wait in kernel */
10*51f48f69SDavid du Colombier 	while(semacquire(&l->sem, 1) < 0){
11*51f48f69SDavid du Colombier 		/* interrupted; try again */
127dd7cddfSDavid du Colombier 	}
137dd7cddfSDavid du Colombier }
147dd7cddfSDavid du Colombier 
157dd7cddfSDavid du Colombier void
unlock(Lock * l)16*51f48f69SDavid du Colombier unlock(Lock *l)
177dd7cddfSDavid du Colombier {
18*51f48f69SDavid du Colombier 	if(adec(&l->key) == 0)
19*51f48f69SDavid du Colombier 		return;	/* changed from 1 -> 0: no contention */
20*51f48f69SDavid du Colombier 	semrelease(&l->sem, 1);
21*51f48f69SDavid du Colombier }
22*51f48f69SDavid du Colombier 
23*51f48f69SDavid du Colombier int
canlock(Lock * l)24*51f48f69SDavid du Colombier canlock(Lock *l)
25*51f48f69SDavid du Colombier {
26*51f48f69SDavid du Colombier 	if(ainc(&l->key) == 1)
27*51f48f69SDavid du Colombier 		return 1;	/* changed from 0 -> 1: success */
28*51f48f69SDavid du Colombier 	/* Undo increment (but don't miss wakeup) */
29*51f48f69SDavid du Colombier 	if(adec(&l->key) == 0)
30*51f48f69SDavid du Colombier 		return 0;	/* changed from 1 -> 0: no contention */
31*51f48f69SDavid du Colombier 	semrelease(&l->sem, 1);
32*51f48f69SDavid du Colombier 	return 0;
337dd7cddfSDavid du Colombier }
34