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