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"
15 4a3fb872 2014-04-30 rsc // State for global log file.
16 4a3fb872 2014-04-30 rsc typedef struct Log Log;
22 4a3fb872 2014-04-30 rsc vlong start; // msg[0] corresponds to 'start' in the global sequence of events
24 4a3fb872 2014-04-30 rsc // queued events (nev=entries in ev, mev=capacity of p)
29 4a3fb872 2014-04-30 rsc // open acme/put files that need to read events
34 4a3fb872 2014-04-30 rsc // active (blocked) reads waiting for events
40 4a3fb872 2014-04-30 rsc static Log eventlog;
43 4a3fb872 2014-04-30 rsc xfidlogopen(Xfid *x)
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]);
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;
55 4a3fb872 2014-04-30 rsc qunlock(&eventlog.lk);
59 4a3fb872 2014-04-30 rsc xfidlogclose(Xfid *x)
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];
70 4a3fb872 2014-04-30 rsc qunlock(&eventlog.lk);
74 4a3fb872 2014-04-30 rsc xfidlogread(Xfid *x)
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]);
87 4a3fb872 2014-04-30 rsc eventlog.read[eventlog.nread++] = x;
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);
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];
102 4a3fb872 2014-04-30 rsc if(x->flushed) {
103 4a3fb872 2014-04-30 rsc qunlock(&eventlog.lk);
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);
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);
119 4a3fb872 2014-04-30 rsc xfidlogflush(Xfid *x)
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);
132 4a3fb872 2014-04-30 rsc qunlock(&eventlog.lk);
136 4a3fb872 2014-04-30 rsc * add a log entry for op on w.
137 4a3fb872 2014-04-30 rsc * expected calls:
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
144 4a3fb872 2014-04-30 rsc * op == "zerox" for new window created via zerox
145 4a3fb872 2014-04-30 rsc * - called from zeroxx
147 4a3fb872 2014-04-30 rsc * op == "get" for Get executed on window
148 4a3fb872 2014-04-30 rsc * - called from get
150 4a3fb872 2014-04-30 rsc * op == "put" for Put executed on window
151 4a3fb872 2014-04-30 rsc * - called from put
153 4a3fb872 2014-04-30 rsc * op == "del" for deleted window
154 4a3fb872 2014-04-30 rsc * - called from winclose
157 4a3fb872 2014-04-30 rsc xfidlog(Window *w, char *op)
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;
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]);
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]);
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);
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);