#include <unistd.h> | |
#include <sched.h> | |
#include <lib9.h> | |
int _ntas; | |
static int | |
_xtas(void *v) | |
{ | |
int x; | |
_ntas++; | |
x = _tas(v); | |
return x; | |
} | |
int | |
canlock(Lock *l) | |
{ | |
return !_xtas(&l->val); | |
} | |
void | |
unlock(Lock *l) | |
{ | |
l->val = 0; | |
} | |
void | |
lock(Lock *lk) | |
{ | |
int i; | |
/* once fast */ | |
if(!_xtas(&lk->val)) | |
return; | |
/* a thousand times pretty fast */ | |
for(i=0; i<1000; i++){ | |
if(!_xtas(&lk->val)) | |
return; | |
sched_yield(); | |
} | |
/* now nice and slow */ | |
for(i=0; i<1000; i++){ | |
if(!_xtas(&lk->val)) | |
return; | |
usleep(100*1000); | |
} | |
/* take your time */ | |
while(_xtas(&lk->val)) | |
usleep(1000*1000); | |
} |