17dd7cddfSDavid du Colombier #include <u.h> 27dd7cddfSDavid du Colombier #include <libc.h> 37dd7cddfSDavid du Colombier 47dd7cddfSDavid du Colombier void lock(Lock * l)5*51f48f69SDavid du Colombierlock(Lock *l) 67dd7cddfSDavid du Colombier { 7*51f48f69SDavid du Colombier if(ainc(&l->key) == 1) 8*51f48f69SDavid du Colombier return; /* changed from 0 -> 1: we hold lock */ 9*51f48f69SDavid du Colombier /* otherwise wait in kernel */ 10*51f48f69SDavid du Colombier while(semacquire(&l->sem, 1) < 0){ 11*51f48f69SDavid du Colombier /* interrupted; try again */ 127dd7cddfSDavid du Colombier } 137dd7cddfSDavid du Colombier } 147dd7cddfSDavid du Colombier 157dd7cddfSDavid du Colombier void unlock(Lock * l)16*51f48f69SDavid du Colombierunlock(Lock *l) 177dd7cddfSDavid du Colombier { 18*51f48f69SDavid du Colombier if(adec(&l->key) == 0) 19*51f48f69SDavid du Colombier return; /* changed from 1 -> 0: no contention */ 20*51f48f69SDavid du Colombier semrelease(&l->sem, 1); 21*51f48f69SDavid du Colombier } 22*51f48f69SDavid du Colombier 23*51f48f69SDavid du Colombier int canlock(Lock * l)24*51f48f69SDavid du Colombiercanlock(Lock *l) 25*51f48f69SDavid du Colombier { 26*51f48f69SDavid du Colombier if(ainc(&l->key) == 1) 27*51f48f69SDavid du Colombier return 1; /* changed from 0 -> 1: success */ 28*51f48f69SDavid du Colombier /* Undo increment (but don't miss wakeup) */ 29*51f48f69SDavid du Colombier if(adec(&l->key) == 0) 30*51f48f69SDavid du Colombier return 0; /* changed from 1 -> 0: no contention */ 31*51f48f69SDavid du Colombier semrelease(&l->sem, 1); 32*51f48f69SDavid du Colombier return 0; 337dd7cddfSDavid du Colombier } 34