xref: /plan9-contrib/sys/src/cmd/unix/drawterm/libc/lock.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier #include <u.h>
2*8ccd4a63SDavid du Colombier #include <libc.h>
3*8ccd4a63SDavid du Colombier 
4*8ccd4a63SDavid du Colombier int
5*8ccd4a63SDavid du Colombier canlock(Lock *lk)
6*8ccd4a63SDavid du Colombier {
7*8ccd4a63SDavid du Colombier 	return !tas(&lk->key);
8*8ccd4a63SDavid du Colombier }
9*8ccd4a63SDavid du Colombier 
10*8ccd4a63SDavid du Colombier void
11*8ccd4a63SDavid du Colombier lock(Lock *lk)
12*8ccd4a63SDavid du Colombier {
13*8ccd4a63SDavid du Colombier 	int i;
14*8ccd4a63SDavid du Colombier 
15*8ccd4a63SDavid du Colombier 	/* easy case */
16*8ccd4a63SDavid du Colombier 	if(canlock(lk))
17*8ccd4a63SDavid du Colombier 		return;
18*8ccd4a63SDavid du Colombier 
19*8ccd4a63SDavid du Colombier 	/* for multi processor machines */
20*8ccd4a63SDavid du Colombier 	for(i=0; i<100; i++)
21*8ccd4a63SDavid du Colombier 		if(canlock(lk))
22*8ccd4a63SDavid du Colombier 			return;
23*8ccd4a63SDavid du Colombier 
24*8ccd4a63SDavid du Colombier 	for(i=0; i<100; i++) {
25*8ccd4a63SDavid du Colombier 		osyield();
26*8ccd4a63SDavid du Colombier 		if(canlock(lk))
27*8ccd4a63SDavid du Colombier 			return;
28*8ccd4a63SDavid du Colombier 	}
29*8ccd4a63SDavid du Colombier 
30*8ccd4a63SDavid du Colombier 	/* looking bad - make sure it is not a priority problem */
31*8ccd4a63SDavid du Colombier 	for(i=0; i<12; i++) {
32*8ccd4a63SDavid du Colombier 		osmsleep(1<<i);
33*8ccd4a63SDavid du Colombier 		if(canlock(lk))
34*8ccd4a63SDavid du Colombier 			return;
35*8ccd4a63SDavid du Colombier 	}
36*8ccd4a63SDavid du Colombier 
37*8ccd4a63SDavid du Colombier 	/* we are in trouble */
38*8ccd4a63SDavid du Colombier 	for(;;) {
39*8ccd4a63SDavid du Colombier 		if(canlock(lk))
40*8ccd4a63SDavid du Colombier 			return;
41*8ccd4a63SDavid du Colombier 		iprint("lock loop %ld: val=%d &lock=%ux pc=%ux\n", getpid(), lk->key, lk, getcallerpc(&lk));
42*8ccd4a63SDavid du Colombier 		osmsleep(1000);
43*8ccd4a63SDavid du Colombier 	}
44*8ccd4a63SDavid du Colombier }
45*8ccd4a63SDavid du Colombier 
46*8ccd4a63SDavid du Colombier void
47*8ccd4a63SDavid du Colombier unlock(Lock *lk)
48*8ccd4a63SDavid du Colombier {
49*8ccd4a63SDavid du Colombier 	assert(lk->key);
50*8ccd4a63SDavid du Colombier 	lk->key = 0;
51*8ccd4a63SDavid du Colombier }
52*8ccd4a63SDavid du Colombier 
53*8ccd4a63SDavid du Colombier void
54*8ccd4a63SDavid du Colombier ilock(Lock *lk)
55*8ccd4a63SDavid du Colombier {
56*8ccd4a63SDavid du Colombier 	lock(lk);
57*8ccd4a63SDavid du Colombier }
58*8ccd4a63SDavid du Colombier 
59*8ccd4a63SDavid du Colombier void
60*8ccd4a63SDavid du Colombier iunlock(Lock *lk)
61*8ccd4a63SDavid du Colombier {
62*8ccd4a63SDavid du Colombier 	unlock(lk);
63*8ccd4a63SDavid du Colombier }
64*8ccd4a63SDavid du Colombier 
65