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