Blame


1 c6687d45 2004-09-21 devnull #include <u.h>
2 c6687d45 2004-09-21 devnull #include <unistd.h>
3 c6687d45 2004-09-21 devnull #include <sys/time.h>
4 c6687d45 2004-09-21 devnull #include <sched.h>
5 c6687d45 2004-09-21 devnull #include <libc.h>
6 c6687d45 2004-09-21 devnull
7 c6687d45 2004-09-21 devnull int _ntas;
8 c6687d45 2004-09-21 devnull static int
9 c6687d45 2004-09-21 devnull _xtas(void *v)
10 c6687d45 2004-09-21 devnull {
11 c6687d45 2004-09-21 devnull int x;
12 c6687d45 2004-09-21 devnull
13 c6687d45 2004-09-21 devnull _ntas++;
14 c6687d45 2004-09-21 devnull x = _tas(v);
15 c6687d45 2004-09-21 devnull if(x != 0 && x != 0xcafebabe){
16 c6687d45 2004-09-21 devnull print("bad tas value %d\n", x);
17 c6687d45 2004-09-21 devnull abort();
18 c6687d45 2004-09-21 devnull }
19 c6687d45 2004-09-21 devnull return x;
20 c6687d45 2004-09-21 devnull }
21 c6687d45 2004-09-21 devnull
22 c6687d45 2004-09-21 devnull int
23 c6687d45 2004-09-21 devnull canlock(Lock *l)
24 c6687d45 2004-09-21 devnull {
25 c6687d45 2004-09-21 devnull return !_xtas(&l->val);
26 c6687d45 2004-09-21 devnull }
27 c6687d45 2004-09-21 devnull
28 c6687d45 2004-09-21 devnull void
29 c6687d45 2004-09-21 devnull unlock(Lock *l)
30 c6687d45 2004-09-21 devnull {
31 c6687d45 2004-09-21 devnull l->val = 0;
32 c6687d45 2004-09-21 devnull }
33 c6687d45 2004-09-21 devnull
34 c6687d45 2004-09-21 devnull void
35 c6687d45 2004-09-21 devnull lock(Lock *lk)
36 c6687d45 2004-09-21 devnull {
37 c6687d45 2004-09-21 devnull int i;
38 c6687d45 2004-09-21 devnull
39 c6687d45 2004-09-21 devnull /* once fast */
40 c6687d45 2004-09-21 devnull if(!_xtas(&lk->val))
41 c6687d45 2004-09-21 devnull return;
42 c6687d45 2004-09-21 devnull /* a thousand times pretty fast */
43 c6687d45 2004-09-21 devnull for(i=0; i<1000; i++){
44 c6687d45 2004-09-21 devnull if(!_xtas(&lk->val))
45 c6687d45 2004-09-21 devnull return;
46 c6687d45 2004-09-21 devnull sched_yield();
47 c6687d45 2004-09-21 devnull }
48 c6687d45 2004-09-21 devnull /* now nice and slow */
49 c6687d45 2004-09-21 devnull for(i=0; i<1000; i++){
50 c6687d45 2004-09-21 devnull if(!_xtas(&lk->val))
51 c6687d45 2004-09-21 devnull return;
52 c6687d45 2004-09-21 devnull usleep(100*1000);
53 c6687d45 2004-09-21 devnull }
54 c6687d45 2004-09-21 devnull /* take your time */
55 c6687d45 2004-09-21 devnull while(_xtas(&lk->val))
56 c6687d45 2004-09-21 devnull usleep(1000*1000);
57 c6687d45 2004-09-21 devnull }