Blame


1 4a3fb872 2014-04-30 rsc #include <u.h>
2 4a3fb872 2014-04-30 rsc #include <libc.h>
3 4a3fb872 2014-04-30 rsc #include <draw.h>
4 4a3fb872 2014-04-30 rsc #include <thread.h>
5 4a3fb872 2014-04-30 rsc #include <cursor.h>
6 4a3fb872 2014-04-30 rsc #include <mouse.h>
7 4a3fb872 2014-04-30 rsc #include <keyboard.h>
8 4a3fb872 2014-04-30 rsc #include <frame.h>
9 4a3fb872 2014-04-30 rsc #include <fcall.h>
10 4a3fb872 2014-04-30 rsc #include <plumb.h>
11 67dbeee5 2017-10-10 rsc #include <libsec.h>
12 4a3fb872 2014-04-30 rsc #include "dat.h"
13 4a3fb872 2014-04-30 rsc #include "fns.h"
14 4a3fb872 2014-04-30 rsc
15 4a3fb872 2014-04-30 rsc // State for global log file.
16 4a3fb872 2014-04-30 rsc typedef struct Log Log;
17 4a3fb872 2014-04-30 rsc struct Log
18 4a3fb872 2014-04-30 rsc {
19 4a3fb872 2014-04-30 rsc QLock lk;
20 4a3fb872 2014-04-30 rsc Rendez r;
21 4a3fb872 2014-04-30 rsc
22 4a3fb872 2014-04-30 rsc vlong start; // msg[0] corresponds to 'start' in the global sequence of events
23 fa325e9b 2020-01-10 cross
24 4a3fb872 2014-04-30 rsc // queued events (nev=entries in ev, mev=capacity of p)
25 4a3fb872 2014-04-30 rsc char **ev;
26 4a3fb872 2014-04-30 rsc int nev;
27 4a3fb872 2014-04-30 rsc int mev;
28 4a3fb872 2014-04-30 rsc
29 4a3fb872 2014-04-30 rsc // open acme/put files that need to read events
30 4a3fb872 2014-04-30 rsc Fid **f;
31 4a3fb872 2014-04-30 rsc int nf;
32 4a3fb872 2014-04-30 rsc int mf;
33 fa325e9b 2020-01-10 cross
34 4a3fb872 2014-04-30 rsc // active (blocked) reads waiting for events
35 4a3fb872 2014-04-30 rsc Xfid **read;
36 4a3fb872 2014-04-30 rsc int nread;
37 4a3fb872 2014-04-30 rsc int mread;
38 4a3fb872 2014-04-30 rsc };
39 4a3fb872 2014-04-30 rsc
40 4a3fb872 2014-04-30 rsc static Log eventlog;
41 4a3fb872 2014-04-30 rsc
42 4a3fb872 2014-04-30 rsc void
43 4a3fb872 2014-04-30 rsc xfidlogopen(Xfid *x)
44 4a3fb872 2014-04-30 rsc {
45 4a3fb872 2014-04-30 rsc qlock(&eventlog.lk);
46 fa325e9b 2020-01-10 cross if(eventlog.nf >= eventlog.mf) {
47 4a3fb872 2014-04-30 rsc eventlog.mf = eventlog.mf*2;
48 4a3fb872 2014-04-30 rsc if(eventlog.mf == 0)
49 4a3fb872 2014-04-30 rsc eventlog.mf = 8;
50 4a3fb872 2014-04-30 rsc eventlog.f = erealloc(eventlog.f, eventlog.mf*sizeof eventlog.f[0]);
51 4a3fb872 2014-04-30 rsc }
52 4a3fb872 2014-04-30 rsc eventlog.f[eventlog.nf++] = x->f;
53 4a3fb872 2014-04-30 rsc x->f->logoff = eventlog.start + eventlog.nev;
54 4a3fb872 2014-04-30 rsc
55 4a3fb872 2014-04-30 rsc qunlock(&eventlog.lk);
56 4a3fb872 2014-04-30 rsc }
57 4a3fb872 2014-04-30 rsc
58 4a3fb872 2014-04-30 rsc void
59 4a3fb872 2014-04-30 rsc xfidlogclose(Xfid *x)
60 4a3fb872 2014-04-30 rsc {
61 4a3fb872 2014-04-30 rsc int i;
62 4a3fb872 2014-04-30 rsc
63 4a3fb872 2014-04-30 rsc qlock(&eventlog.lk);
64 4a3fb872 2014-04-30 rsc for(i=0; i<eventlog.nf; i++) {
65 4a3fb872 2014-04-30 rsc if(eventlog.f[i] == x->f) {
66 4a3fb872 2014-04-30 rsc eventlog.f[i] = eventlog.f[--eventlog.nf];
67 4a3fb872 2014-04-30 rsc break;
68 4a3fb872 2014-04-30 rsc }
69 4a3fb872 2014-04-30 rsc }
70 4a3fb872 2014-04-30 rsc qunlock(&eventlog.lk);
71 4a3fb872 2014-04-30 rsc }
72 4a3fb872 2014-04-30 rsc
73 4a3fb872 2014-04-30 rsc void
74 4a3fb872 2014-04-30 rsc xfidlogread(Xfid *x)
75 4a3fb872 2014-04-30 rsc {
76 4a3fb872 2014-04-30 rsc char *p;
77 4a3fb872 2014-04-30 rsc int i;
78 4a3fb872 2014-04-30 rsc Fcall fc;
79 4a3fb872 2014-04-30 rsc
80 4a3fb872 2014-04-30 rsc qlock(&eventlog.lk);
81 fa325e9b 2020-01-10 cross if(eventlog.nread >= eventlog.mread) {
82 4a3fb872 2014-04-30 rsc eventlog.mread = eventlog.mread*2;
83 4a3fb872 2014-04-30 rsc if(eventlog.mread == 0)
84 4a3fb872 2014-04-30 rsc eventlog.mread = 8;
85 4a3fb872 2014-04-30 rsc eventlog.read = erealloc(eventlog.read, eventlog.mread*sizeof eventlog.read[0]);
86 4a3fb872 2014-04-30 rsc }
87 4a3fb872 2014-04-30 rsc eventlog.read[eventlog.nread++] = x;
88 fa325e9b 2020-01-10 cross
89 4a3fb872 2014-04-30 rsc if(eventlog.r.l == nil)
90 4a3fb872 2014-04-30 rsc eventlog.r.l = &eventlog.lk;
91 4a3fb872 2014-04-30 rsc x->flushed = FALSE;
92 4a3fb872 2014-04-30 rsc while(x->f->logoff >= eventlog.start+eventlog.nev && !x->flushed)
93 4a3fb872 2014-04-30 rsc rsleep(&eventlog.r);
94 fa325e9b 2020-01-10 cross
95 4a3fb872 2014-04-30 rsc for(i=0; i<eventlog.nread; i++) {
96 4a3fb872 2014-04-30 rsc if(eventlog.read[i] == x) {
97 4a3fb872 2014-04-30 rsc eventlog.read[i] = eventlog.read[--eventlog.nread];
98 4a3fb872 2014-04-30 rsc break;
99 4a3fb872 2014-04-30 rsc }
100 4a3fb872 2014-04-30 rsc }
101 4a3fb872 2014-04-30 rsc
102 4a3fb872 2014-04-30 rsc if(x->flushed) {
103 4a3fb872 2014-04-30 rsc qunlock(&eventlog.lk);
104 4a3fb872 2014-04-30 rsc return;
105 4a3fb872 2014-04-30 rsc }
106 4a3fb872 2014-04-30 rsc
107 4a3fb872 2014-04-30 rsc i = x->f->logoff - eventlog.start;
108 4a3fb872 2014-04-30 rsc p = estrdup(eventlog.ev[i]);
109 4a3fb872 2014-04-30 rsc x->f->logoff++;
110 4a3fb872 2014-04-30 rsc qunlock(&eventlog.lk);
111 4a3fb872 2014-04-30 rsc
112 4a3fb872 2014-04-30 rsc fc.data = p;
113 4a3fb872 2014-04-30 rsc fc.count = strlen(p);
114 4a3fb872 2014-04-30 rsc respond(x, &fc, nil);
115 fa325e9b 2020-01-10 cross free(p);
116 4a3fb872 2014-04-30 rsc }
117 4a3fb872 2014-04-30 rsc
118 4a3fb872 2014-04-30 rsc void
119 4a3fb872 2014-04-30 rsc xfidlogflush(Xfid *x)
120 4a3fb872 2014-04-30 rsc {
121 4a3fb872 2014-04-30 rsc int i;
122 4a3fb872 2014-04-30 rsc Xfid *rx;
123 4a3fb872 2014-04-30 rsc
124 4a3fb872 2014-04-30 rsc qlock(&eventlog.lk);
125 4a3fb872 2014-04-30 rsc for(i=0; i<eventlog.nread; i++) {
126 4a3fb872 2014-04-30 rsc rx = eventlog.read[i];
127 45f8ba54 2014-05-06 rsc if(rx->fcall.tag == x->fcall.oldtag) {
128 4a3fb872 2014-04-30 rsc rx->flushed = TRUE;
129 45f8ba54 2014-05-06 rsc rwakeupall(&eventlog.r);
130 45f8ba54 2014-05-06 rsc }
131 4a3fb872 2014-04-30 rsc }
132 4a3fb872 2014-04-30 rsc qunlock(&eventlog.lk);
133 4a3fb872 2014-04-30 rsc }
134 4a3fb872 2014-04-30 rsc
135 4a3fb872 2014-04-30 rsc /*
136 4a3fb872 2014-04-30 rsc * add a log entry for op on w.
137 4a3fb872 2014-04-30 rsc * expected calls:
138 4a3fb872 2014-04-30 rsc *
139 4a3fb872 2014-04-30 rsc * op == "new" for each new window
140 4a3fb872 2014-04-30 rsc * - caller of coladd or makenewwindow responsible for calling
141 4a3fb872 2014-04-30 rsc * xfidlog after setting window name
142 4a3fb872 2014-04-30 rsc * - exception: zerox
143 4a3fb872 2014-04-30 rsc *
144 4a3fb872 2014-04-30 rsc * op == "zerox" for new window created via zerox
145 4a3fb872 2014-04-30 rsc * - called from zeroxx
146 4a3fb872 2014-04-30 rsc *
147 4a3fb872 2014-04-30 rsc * op == "get" for Get executed on window
148 4a3fb872 2014-04-30 rsc * - called from get
149 4a3fb872 2014-04-30 rsc *
150 4a3fb872 2014-04-30 rsc * op == "put" for Put executed on window
151 4a3fb872 2014-04-30 rsc * - called from put
152 4a3fb872 2014-04-30 rsc *
153 4a3fb872 2014-04-30 rsc * op == "del" for deleted window
154 4a3fb872 2014-04-30 rsc * - called from winclose
155 4a3fb872 2014-04-30 rsc */
156 4a3fb872 2014-04-30 rsc void
157 4a3fb872 2014-04-30 rsc xfidlog(Window *w, char *op)
158 4a3fb872 2014-04-30 rsc {
159 4a3fb872 2014-04-30 rsc int i, n;
160 4a3fb872 2014-04-30 rsc vlong min;
161 4a3fb872 2014-04-30 rsc File *f;
162 4a3fb872 2014-04-30 rsc char *name;
163 4a3fb872 2014-04-30 rsc
164 4a3fb872 2014-04-30 rsc qlock(&eventlog.lk);
165 4a3fb872 2014-04-30 rsc if(eventlog.nev >= eventlog.mev) {
166 4a3fb872 2014-04-30 rsc // Remove and free any entries that all readers have read.
167 4a3fb872 2014-04-30 rsc min = eventlog.start + eventlog.nev;
168 4a3fb872 2014-04-30 rsc for(i=0; i<eventlog.nf; i++) {
169 4a3fb872 2014-04-30 rsc if(min > eventlog.f[i]->logoff)
170 4a3fb872 2014-04-30 rsc min = eventlog.f[i]->logoff;
171 4a3fb872 2014-04-30 rsc }
172 4a3fb872 2014-04-30 rsc if(min > eventlog.start) {
173 4a3fb872 2014-04-30 rsc n = min - eventlog.start;
174 4a3fb872 2014-04-30 rsc for(i=0; i<n; i++)
175 4a3fb872 2014-04-30 rsc free(eventlog.ev[i]);
176 4a3fb872 2014-04-30 rsc eventlog.nev -= n;
177 4a3fb872 2014-04-30 rsc eventlog.start += n;
178 4a3fb872 2014-04-30 rsc memmove(eventlog.ev, eventlog.ev+n, eventlog.nev*sizeof eventlog.ev[0]);
179 4a3fb872 2014-04-30 rsc }
180 fa325e9b 2020-01-10 cross
181 4a3fb872 2014-04-30 rsc // Otherwise grow.
182 4a3fb872 2014-04-30 rsc if(eventlog.nev >= eventlog.mev) {
183 4a3fb872 2014-04-30 rsc eventlog.mev = eventlog.mev*2;
184 4a3fb872 2014-04-30 rsc if(eventlog.mev == 0)
185 4a3fb872 2014-04-30 rsc eventlog.mev = 8;
186 4a3fb872 2014-04-30 rsc eventlog.ev = erealloc(eventlog.ev, eventlog.mev*sizeof eventlog.ev[0]);
187 4a3fb872 2014-04-30 rsc }
188 4a3fb872 2014-04-30 rsc }
189 4a3fb872 2014-04-30 rsc f = w->body.file;
190 4a3fb872 2014-04-30 rsc name = runetobyte(f->name, f->nname);
191 4a3fb872 2014-04-30 rsc if(name == nil)
192 4a3fb872 2014-04-30 rsc name = estrdup("");
193 4a3fb872 2014-04-30 rsc eventlog.ev[eventlog.nev++] = smprint("%d %s %s\n", w->id, op, name);
194 4a3fb872 2014-04-30 rsc free(name);
195 4a3fb872 2014-04-30 rsc if(eventlog.r.l == nil)
196 4a3fb872 2014-04-30 rsc eventlog.r.l = &eventlog.lk;
197 4a3fb872 2014-04-30 rsc rwakeupall(&eventlog.r);
198 4a3fb872 2014-04-30 rsc qunlock(&eventlog.lk);
199 4a3fb872 2014-04-30 rsc }