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