17dd7cddfSDavid du Colombier #include "../plan9/lib.h" 27dd7cddfSDavid du Colombier #include "../plan9/sys9.h" 37dd7cddfSDavid du Colombier #define _LOCK_EXTENSION 47dd7cddfSDavid du Colombier #include <lock.h> 5*51f48f69SDavid du Colombier //#include <lib9.h> 67dd7cddfSDavid du Colombier 77dd7cddfSDavid du Colombier void lock(Lock * l)8*51f48f69SDavid du Colombierlock(Lock *l) 97dd7cddfSDavid du Colombier { 10*51f48f69SDavid du Colombier if(ainc(&l->key) == 1) 11*51f48f69SDavid du Colombier return; /* changed from 0 -> 1: we hold lock */ 12*51f48f69SDavid du Colombier /* otherwise wait in kernel */ 13*51f48f69SDavid du Colombier while(_SEMACQUIRE(&l->sem, 1) < 0){ 14*51f48f69SDavid du Colombier /* interrupted; try again */ 15*51f48f69SDavid du Colombier } 16*51f48f69SDavid du Colombier } 177dd7cddfSDavid du Colombier 18*51f48f69SDavid du Colombier void unlock(Lock * l)19*51f48f69SDavid du Colombierunlock(Lock *l) 20*51f48f69SDavid du Colombier { 21*51f48f69SDavid du Colombier if(adec(&l->key) == 0) 22*51f48f69SDavid du Colombier return; /* changed from 1 -> 0: no contention */ 23*51f48f69SDavid du Colombier _SEMRELEASE(&l->sem, 1); 247dd7cddfSDavid du Colombier } 257dd7cddfSDavid du Colombier 267dd7cddfSDavid du Colombier int canlock(Lock * l)27*51f48f69SDavid du Colombiercanlock(Lock *l) 287dd7cddfSDavid du Colombier { 29*51f48f69SDavid du Colombier if(ainc(&l->key) == 1) 30*51f48f69SDavid du Colombier return 1; /* changed from 0 -> 1: success */ 31*51f48f69SDavid du Colombier /* Undo increment (but don't miss wakeup) */ 32*51f48f69SDavid du Colombier if(adec(&l->key) == 0) 33*51f48f69SDavid du Colombier return 0; /* changed from 1 -> 0: no contention */ 34*51f48f69SDavid du Colombier _SEMRELEASE(&l->sem, 1); 357dd7cddfSDavid du Colombier return 0; 367dd7cddfSDavid du Colombier } 37