xref: /plan9/sys/src/cmd/unix/drawterm/libc/lock.c (revision ec59a3ddbfceee0efe34584c2c9981a5e5ff1ec4)
18ccd4a63SDavid du Colombier #include <u.h>
28ccd4a63SDavid du Colombier #include <libc.h>
38ccd4a63SDavid du Colombier 
48ccd4a63SDavid du Colombier int
58ccd4a63SDavid du Colombier canlock(Lock *lk)
68ccd4a63SDavid du Colombier {
78ccd4a63SDavid du Colombier 	return !tas(&lk->key);
88ccd4a63SDavid du Colombier }
98ccd4a63SDavid du Colombier 
108ccd4a63SDavid du Colombier void
118ccd4a63SDavid du Colombier lock(Lock *lk)
128ccd4a63SDavid du Colombier {
138ccd4a63SDavid du Colombier 	int i;
148ccd4a63SDavid du Colombier 
158ccd4a63SDavid du Colombier 	/* easy case */
168ccd4a63SDavid du Colombier 	if(canlock(lk))
178ccd4a63SDavid du Colombier 		return;
188ccd4a63SDavid du Colombier 
198ccd4a63SDavid du Colombier 	/* for multi processor machines */
208ccd4a63SDavid du Colombier 	for(i=0; i<100; i++)
218ccd4a63SDavid du Colombier 		if(canlock(lk))
228ccd4a63SDavid du Colombier 			return;
238ccd4a63SDavid du Colombier 
248ccd4a63SDavid du Colombier 	for(i=0; i<100; i++) {
258ccd4a63SDavid du Colombier 		osyield();
268ccd4a63SDavid du Colombier 		if(canlock(lk))
278ccd4a63SDavid du Colombier 			return;
288ccd4a63SDavid du Colombier 	}
298ccd4a63SDavid du Colombier 
308ccd4a63SDavid du Colombier 	/* looking bad - make sure it is not a priority problem */
318ccd4a63SDavid du Colombier 	for(i=0; i<12; i++) {
328ccd4a63SDavid du Colombier 		osmsleep(1<<i);
338ccd4a63SDavid du Colombier 		if(canlock(lk))
348ccd4a63SDavid du Colombier 			return;
358ccd4a63SDavid du Colombier 	}
368ccd4a63SDavid du Colombier 
378ccd4a63SDavid du Colombier 	/* we are in trouble */
388ccd4a63SDavid du Colombier 	for(;;) {
398ccd4a63SDavid du Colombier 		if(canlock(lk))
408ccd4a63SDavid du Colombier 			return;
41*ec59a3ddSDavid du Colombier 		iprint("lock loop %ld: val=%d &lock=%ux pc=%p\n", getpid(), lk->key, lk, getcallerpc(&lk));
428ccd4a63SDavid du Colombier 		osmsleep(1000);
438ccd4a63SDavid du Colombier 	}
448ccd4a63SDavid du Colombier }
458ccd4a63SDavid du Colombier 
468ccd4a63SDavid du Colombier void
478ccd4a63SDavid du Colombier unlock(Lock *lk)
488ccd4a63SDavid du Colombier {
498ccd4a63SDavid du Colombier 	assert(lk->key);
508ccd4a63SDavid du Colombier 	lk->key = 0;
518ccd4a63SDavid du Colombier }
528ccd4a63SDavid du Colombier 
538ccd4a63SDavid du Colombier void
548ccd4a63SDavid du Colombier ilock(Lock *lk)
558ccd4a63SDavid du Colombier {
568ccd4a63SDavid du Colombier 	lock(lk);
578ccd4a63SDavid du Colombier }
588ccd4a63SDavid du Colombier 
598ccd4a63SDavid du Colombier void
608ccd4a63SDavid du Colombier iunlock(Lock *lk)
618ccd4a63SDavid du Colombier {
628ccd4a63SDavid du Colombier 	unlock(lk);
638ccd4a63SDavid du Colombier }
648ccd4a63SDavid du Colombier 
65