ref: a43c1e6fab4d75c8d173a482ee8f4aa04de151c0
dir: /libc/lock.c/
#include <u.h> #include <libc.h> int canlock(Lock *lk) { return !tas(&lk->key); } void lock(Lock *lk) { int i; /* easy case */ if(canlock(lk)) return; /* for multi processor machines */ for(i=0; i<100; i++) if(canlock(lk)) return; for(i=0; i<100; i++) { osyield(0); if(canlock(lk)) return; } /* looking bad - make sure it is not a priority problem */ for(i=0; i<12; i++) { osmsleep(1<<i); if(canlock(lk)) return; } /* we are in trouble */ for(;;) { if(canlock(lk)) return; iprint("lock loop %ld: val=%d &lock=%ux pc=%ux\n", getpid(), lk->key, lk, getcallerpc(&lk)); osmsleep(1000); } } void unlock(Lock *lk) { assert(lk->key); lk->key = 0; } void ilock(Lock *lk) { lock(lk); } void iunlock(Lock *lk) { unlock(lk); }