Blame


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