15 // State for global log file.
16 typedef struct Log Log;
22 vlong start; // msg[0] corresponds to 'start' in the global sequence of events
24 // queued events (nev=entries in ev, mev=capacity of p)
29 // open acme/put files that need to read events
34 // active (blocked) reads waiting for events
46 if(eventlog.nf >= eventlog.mf) {
47 eventlog.mf = eventlog.mf*2;
50 eventlog.f = erealloc(eventlog.f, eventlog.mf*sizeof eventlog.f[0]);
52 eventlog.f[eventlog.nf++] = x->f;
53 x->f->logoff = eventlog.start + eventlog.nev;
55 qunlock(&eventlog.lk);
64 for(i=0; i<eventlog.nf; i++) {
65 if(eventlog.f[i] == x->f) {
66 eventlog.f[i] = eventlog.f[--eventlog.nf];
70 qunlock(&eventlog.lk);
81 if(eventlog.nread >= eventlog.mread) {
82 eventlog.mread = eventlog.mread*2;
83 if(eventlog.mread == 0)
85 eventlog.read = erealloc(eventlog.read, eventlog.mread*sizeof eventlog.read[0]);
87 eventlog.read[eventlog.nread++] = x;
89 if(eventlog.r.l == nil)
90 eventlog.r.l = &eventlog.lk;
92 while(x->f->logoff >= eventlog.start+eventlog.nev && !x->flushed)
95 for(i=0; i<eventlog.nread; i++) {
96 if(eventlog.read[i] == x) {
97 eventlog.read[i] = eventlog.read[--eventlog.nread];
103 qunlock(&eventlog.lk);
107 i = x->f->logoff - eventlog.start;
108 p = estrdup(eventlog.ev[i]);
110 qunlock(&eventlog.lk);
113 fc.count = strlen(p);
114 respond(x, &fc, nil);
119 xfidlogflush(Xfid *x)
125 for(i=0; i<eventlog.nread; i++) {
126 rx = eventlog.read[i];
127 if(rx->fcall.tag == x->fcall.oldtag) {
129 rwakeupall(&eventlog.r);
132 qunlock(&eventlog.lk);
136 * add a log entry for op on w.
139 * op == "new" for each new window
140 * - caller of coladd or makenewwindow responsible for calling
141 * xfidlog after setting window name
144 * op == "zerox" for new window created via zerox
145 * - called from zeroxx
147 * op == "get" for Get executed on window
150 * op == "put" for Put executed on window
153 * op == "del" for deleted window
154 * - called from winclose
157 xfidlog(Window *w, char *op)
165 if(eventlog.nev >= eventlog.mev) {
166 // Remove and free any entries that all readers have read.
167 min = eventlog.start + eventlog.nev;
168 for(i=0; i<eventlog.nf; i++) {
169 if(min > eventlog.f[i]->logoff)
170 min = eventlog.f[i]->logoff;
172 if(min > eventlog.start) {
173 n = min - eventlog.start;
175 free(eventlog.ev[i]);
178 memmove(eventlog.ev, eventlog.ev+n, eventlog.nev*sizeof eventlog.ev[0]);
182 if(eventlog.nev >= eventlog.mev) {
183 eventlog.mev = eventlog.mev*2;
184 if(eventlog.mev == 0)
186 eventlog.ev = erealloc(eventlog.ev, eventlog.mev*sizeof eventlog.ev[0]);
190 name = runetobyte(f->name, f->nname);
193 eventlog.ev[eventlog.nev++] = smprint("%d %s %s\n", w->id, op, name);
195 if(eventlog.r.l == nil)
196 eventlog.r.l = &eventlog.lk;
197 rwakeupall(&eventlog.r);
198 qunlock(&eventlog.lk);