Blame


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