1*6c6e36e1SDavid du Colombier #include "../plan9/lib.h" 2*6c6e36e1SDavid du Colombier #include "../plan9/sys9.h" 3*6c6e36e1SDavid du Colombier #define _LOCK_EXTENSION 4*6c6e36e1SDavid du Colombier #include <lock.h> 5*6c6e36e1SDavid du Colombier //#include <lib9.h> 6*6c6e36e1SDavid du Colombier 7*6c6e36e1SDavid du Colombier void lock(Lock * l)8*6c6e36e1SDavid du Colombierlock(Lock *l) 9*6c6e36e1SDavid du Colombier { 10*6c6e36e1SDavid du Colombier if(ainc(&l->key) == 1) 11*6c6e36e1SDavid du Colombier return; /* changed from 0 -> 1: we hold lock */ 12*6c6e36e1SDavid du Colombier /* otherwise wait in kernel */ 13*6c6e36e1SDavid du Colombier while(_SEMACQUIRE(&l->sem, 1) < 0){ 14*6c6e36e1SDavid du Colombier /* interrupted; try again */ 15*6c6e36e1SDavid du Colombier } 16*6c6e36e1SDavid du Colombier } 17*6c6e36e1SDavid du Colombier 18*6c6e36e1SDavid du Colombier void unlock(Lock * l)19*6c6e36e1SDavid du Colombierunlock(Lock *l) 20*6c6e36e1SDavid du Colombier { 21*6c6e36e1SDavid du Colombier if(adec(&l->key) == 0) 22*6c6e36e1SDavid du Colombier return; /* changed from 1 -> 0: no contention */ 23*6c6e36e1SDavid du Colombier _SEMRELEASE(&l->sem, 1); 24*6c6e36e1SDavid du Colombier } 25*6c6e36e1SDavid du Colombier 26*6c6e36e1SDavid du Colombier int canlock(Lock * l)27*6c6e36e1SDavid du Colombiercanlock(Lock *l) 28*6c6e36e1SDavid du Colombier { 29*6c6e36e1SDavid du Colombier if(ainc(&l->key) == 1) 30*6c6e36e1SDavid du Colombier return 1; /* changed from 0 -> 1: success */ 31*6c6e36e1SDavid du Colombier /* Undo increment (but don't miss wakeup) */ 32*6c6e36e1SDavid du Colombier if(adec(&l->key) == 0) 33*6c6e36e1SDavid du Colombier return 0; /* changed from 1 -> 0: no contention */ 34*6c6e36e1SDavid du Colombier _SEMRELEASE(&l->sem, 1); 35*6c6e36e1SDavid du Colombier return 0; 36*6c6e36e1SDavid du Colombier } 37