Blame


1 b3994ec5 2003-12-11 devnull #include <u.h>
2 b3994ec5 2003-12-11 devnull #include <libc.h>
3 b3994ec5 2003-12-11 devnull #include <draw.h>
4 b3994ec5 2003-12-11 devnull #include <thread.h>
5 b3994ec5 2003-12-11 devnull #include <cursor.h>
6 b3994ec5 2003-12-11 devnull #include <mouse.h>
7 b3994ec5 2003-12-11 devnull #include <keyboard.h>
8 b3994ec5 2003-12-11 devnull #include <frame.h>
9 b3994ec5 2003-12-11 devnull #include <fcall.h>
10 b3994ec5 2003-12-11 devnull #include <plumb.h>
11 b3994ec5 2003-12-11 devnull #include "dat.h"
12 b3994ec5 2003-12-11 devnull #include "fns.h"
13 b3994ec5 2003-12-11 devnull
14 b3994ec5 2003-12-11 devnull static Channel* ctimer; /* chan(Timer*)[100] */
15 b3994ec5 2003-12-11 devnull static Timer *timer;
16 b3994ec5 2003-12-11 devnull
17 b3994ec5 2003-12-11 devnull static
18 b3994ec5 2003-12-11 devnull uint
19 b3994ec5 2003-12-11 devnull msec(void)
20 b3994ec5 2003-12-11 devnull {
21 b3994ec5 2003-12-11 devnull return nsec()/1000000;
22 b3994ec5 2003-12-11 devnull }
23 b3994ec5 2003-12-11 devnull
24 b3994ec5 2003-12-11 devnull void
25 b3994ec5 2003-12-11 devnull timerstop(Timer *t)
26 b3994ec5 2003-12-11 devnull {
27 b3994ec5 2003-12-11 devnull t->next = timer;
28 b3994ec5 2003-12-11 devnull timer = t;
29 b3994ec5 2003-12-11 devnull }
30 b3994ec5 2003-12-11 devnull
31 b3994ec5 2003-12-11 devnull void
32 b3994ec5 2003-12-11 devnull timercancel(Timer *t)
33 b3994ec5 2003-12-11 devnull {
34 b3994ec5 2003-12-11 devnull t->cancel = TRUE;
35 b3994ec5 2003-12-11 devnull }
36 b3994ec5 2003-12-11 devnull
37 b3994ec5 2003-12-11 devnull static
38 b3994ec5 2003-12-11 devnull void
39 b3994ec5 2003-12-11 devnull timerproc(void *v)
40 b3994ec5 2003-12-11 devnull {
41 b3994ec5 2003-12-11 devnull int i, nt, na, dt, del;
42 b3994ec5 2003-12-11 devnull Timer **t, *x;
43 b3994ec5 2003-12-11 devnull uint old, new;
44 b3994ec5 2003-12-11 devnull
45 b3994ec5 2003-12-11 devnull USED(v);
46 b3994ec5 2003-12-11 devnull threadsetname("timerproc");
47 b3994ec5 2003-12-11 devnull rfork(RFFDG);
48 b3994ec5 2003-12-11 devnull t = nil;
49 b3994ec5 2003-12-11 devnull na = 0;
50 b3994ec5 2003-12-11 devnull nt = 0;
51 b3994ec5 2003-12-11 devnull old = msec();
52 b3994ec5 2003-12-11 devnull for(;;){
53 334cb1e9 2004-12-27 devnull sleep(1); /* will sleep minimum incr */
54 b3994ec5 2003-12-11 devnull new = msec();
55 b3994ec5 2003-12-11 devnull dt = new-old;
56 b3994ec5 2003-12-11 devnull old = new;
57 b3994ec5 2003-12-11 devnull if(dt < 0) /* timer wrapped; go around, losing a tick */
58 b3994ec5 2003-12-11 devnull continue;
59 b3994ec5 2003-12-11 devnull for(i=0; i<nt; i++){
60 b3994ec5 2003-12-11 devnull x = t[i];
61 b3994ec5 2003-12-11 devnull x->dt -= dt;
62 b3994ec5 2003-12-11 devnull del = FALSE;
63 b3994ec5 2003-12-11 devnull if(x->cancel){
64 b3994ec5 2003-12-11 devnull timerstop(x);
65 b3994ec5 2003-12-11 devnull del = TRUE;
66 b3994ec5 2003-12-11 devnull }else if(x->dt <= 0){
67 b3994ec5 2003-12-11 devnull /*
68 b3994ec5 2003-12-11 devnull * avoid possible deadlock if client is
69 b3994ec5 2003-12-11 devnull * now sending on ctimer
70 b3994ec5 2003-12-11 devnull */
71 b3994ec5 2003-12-11 devnull if(nbsendul(x->c, 0) > 0)
72 b3994ec5 2003-12-11 devnull del = TRUE;
73 b3994ec5 2003-12-11 devnull }
74 b3994ec5 2003-12-11 devnull if(del){
75 b3994ec5 2003-12-11 devnull memmove(&t[i], &t[i+1], (nt-i-1)*sizeof t[0]);
76 b3994ec5 2003-12-11 devnull --nt;
77 b3994ec5 2003-12-11 devnull --i;
78 b3994ec5 2003-12-11 devnull }
79 b3994ec5 2003-12-11 devnull }
80 b3994ec5 2003-12-11 devnull if(nt == 0){
81 b3994ec5 2003-12-11 devnull x = recvp(ctimer);
82 b3994ec5 2003-12-11 devnull gotit:
83 b3994ec5 2003-12-11 devnull if(nt == na){
84 b3994ec5 2003-12-11 devnull na += 10;
85 b3994ec5 2003-12-11 devnull t = realloc(t, na*sizeof(Timer*));
86 b3994ec5 2003-12-11 devnull if(t == nil)
87 b3994ec5 2003-12-11 devnull error("timer realloc failed");
88 b3994ec5 2003-12-11 devnull }
89 b3994ec5 2003-12-11 devnull t[nt++] = x;
90 b3994ec5 2003-12-11 devnull old = msec();
91 b3994ec5 2003-12-11 devnull }
92 b3994ec5 2003-12-11 devnull if(nbrecv(ctimer, &x) > 0)
93 b3994ec5 2003-12-11 devnull goto gotit;
94 b3994ec5 2003-12-11 devnull }
95 b3994ec5 2003-12-11 devnull }
96 b3994ec5 2003-12-11 devnull
97 b3994ec5 2003-12-11 devnull void
98 b3994ec5 2003-12-11 devnull timerinit(void)
99 b3994ec5 2003-12-11 devnull {
100 b3994ec5 2003-12-11 devnull ctimer = chancreate(sizeof(Timer*), 100);
101 334cb1e9 2004-12-27 devnull chansetname(ctimer, "ctimer");
102 334cb1e9 2004-12-27 devnull proccreate(timerproc, nil, STACK);
103 b3994ec5 2003-12-11 devnull }
104 b3994ec5 2003-12-11 devnull
105 b3994ec5 2003-12-11 devnull Timer*
106 b3994ec5 2003-12-11 devnull timerstart(int dt)
107 b3994ec5 2003-12-11 devnull {
108 b3994ec5 2003-12-11 devnull Timer *t;
109 b3994ec5 2003-12-11 devnull
110 b3994ec5 2003-12-11 devnull t = timer;
111 b3994ec5 2003-12-11 devnull if(t)
112 b3994ec5 2003-12-11 devnull timer = timer->next;
113 b3994ec5 2003-12-11 devnull else{
114 b3994ec5 2003-12-11 devnull t = emalloc(sizeof(Timer));
115 b3994ec5 2003-12-11 devnull t->c = chancreate(sizeof(int), 0);
116 334cb1e9 2004-12-27 devnull chansetname(t->c, "tc%p", t->c);
117 b3994ec5 2003-12-11 devnull }
118 b3994ec5 2003-12-11 devnull t->next = nil;
119 b3994ec5 2003-12-11 devnull t->dt = dt;
120 b3994ec5 2003-12-11 devnull t->cancel = FALSE;
121 b3994ec5 2003-12-11 devnull sendp(ctimer, t);
122 b3994ec5 2003-12-11 devnull return t;
123 b3994ec5 2003-12-11 devnull }