aboutsummaryrefslogtreecommitdiffstats
path: root/mps/code
diff options
context:
space:
mode:
authorRichard Brooksby2012-08-31 15:14:09 +0100
committerRichard Brooksby2012-08-31 15:14:09 +0100
commit455e3ee43cb87db88f14e4093f2bf4f80c30134d (patch)
tree4a1358a973268012409dbbbf4353ddc71b996c96 /mps/code
parent09dc2bca88079b32d042061b3f1ec51b0083cc6e (diff)
downloademacs-455e3ee43cb87db88f14e4093f2bf4f80c30134d.tar.gz
emacs-455e3ee43cb87db88f14e4093f2bf4f80c30134d.zip
Adding an mps-style eventdescribe.
Removing deliberate assert and event debugging dump. Oops. Copied from Perforce Change: 179133 ServerID: perforce.ravenbrook.com
Diffstat (limited to 'mps/code')
-rw-r--r--mps/code/event.c148
-rw-r--r--mps/code/event.h2
-rw-r--r--mps/code/trace.c2
3 files changed, 117 insertions, 35 deletions
diff --git a/mps/code/event.c b/mps/code/event.c
index 4a3c7b1a457..29c38febcd0 100644
--- a/mps/code/event.c
+++ b/mps/code/event.c
@@ -48,8 +48,6 @@ Res EventFlush(void)
48 Res res; 48 Res res;
49 size_t size; 49 size_t size;
50 50
51EventDump(mps_lib_get_stdout());
52
53 AVER(eventInited); 51 AVER(eventInited);
54 52
55 AVER(EventBuffer <= EventLast); 53 AVER(EventBuffer <= EventLast);
@@ -235,6 +233,101 @@ void EventLabelAddr(Addr addr, EventStringId id)
235} 233}
236 234
237 235
236/* Convert event parameter sort to WriteF arguments */
237
238#define EVENT_WRITE_PARAM_MOST(name, index, sort, ident) \
239 " $"#sort, (WriteF##sort)event->name.f##index,
240#define EVENT_WRITE_PARAM_A EVENT_WRITE_PARAM_MOST
241#define EVENT_WRITE_PARAM_P EVENT_WRITE_PARAM_MOST
242#define EVENT_WRITE_PARAM_U EVENT_WRITE_PARAM_MOST
243#define EVENT_WRITE_PARAM_W EVENT_WRITE_PARAM_MOST
244#define EVENT_WRITE_PARAM_D EVENT_WRITE_PARAM_MOST
245#define EVENT_WRITE_PARAM_B(name, index, sort, ident) \
246 " $U", (WriteFU)event->name.f##index,
247#define EVENT_WRITE_PARAM_S(name, index, sort, ident) \
248 " $S", (WriteFS)event->name.f##index.str, /* FIXME: relies on NUL? */
249
250Res EventDescribe(Event event, mps_lib_FILE *stream)
251{
252 Res res;
253
254 /* FIXME: Some sort of EventCheck would be good */
255 if (event == NULL)
256 return ResFAIL;
257 if (stream == NULL)
258 return ResFAIL;
259
260 res = WriteF(stream,
261 "Event $P {\n", (WriteFP)event,
262 NULL);
263 if (res != ResOK) return res;
264
265 switch (event->any.code) {
266
267#define EVENT_DESC_PARAM(name, index, sort, ident) \
268 "\n $S", (WriteFS)#ident, \
269 EVENT_WRITE_PARAM_##sort(name, index, sort, ident)
270
271#define EVENT_DESC(X, name, _code, always, kind) \
272 case _code: \
273 res = WriteF(stream, \
274 " code $U ($S)\n", (WriteFU)event->any.code, (WriteFS)#name, \
275 " clock ", NULL); \
276 if (res != ResOK) return res; \
277 EVENT_CLOCK_WRITE(stream, event->any.clock); /* FIXME: return code */ \
278 res = WriteF(stream, "\n size $U", (WriteFU)event->any.size, \
279 EVENT_##name##_PARAMS(EVENT_DESC_PARAM, name) \
280 NULL); \
281 if (res != ResOK) return res; \
282 break;
283
284 EVENT_LIST(EVENT_DESC, X)
285
286 default:
287 NOTREACHED; /* FIXME: should print .any info */
288 }
289
290 res = WriteF(stream,
291 "\n} Event $P\n", (WriteFP)event,
292 NULL);
293 return res;
294}
295
296
297Res EventWrite(Event event, mps_lib_FILE *stream)
298{
299 Res res;
300
301 if (event == NULL) return ResFAIL;
302 if (stream == NULL) return ResFAIL;
303
304 EVENT_CLOCK_WRITE(stream, event->any.clock); /* FIXME: return code */
305
306 switch (event->any.code) {
307
308#define EVENT_WRITE_PARAM(name, index, sort, ident) \
309 EVENT_WRITE_PARAM_##sort(name, index, sort, ident)
310
311#define EVENT_WRITE(X, name, code, always, kind) \
312 case code: \
313 res = WriteF(stream, " "#name, \
314 EVENT_##name##_PARAMS(EVENT_WRITE_PARAM, name) \
315 NULL); \
316 if (res != ResOK) return res; \
317 break;
318 EVENT_LIST(EVENT_WRITE, X)
319
320 default:
321 res = WriteF(stream, " <unknown code $U>", event->any.code, NULL);
322 if (res != ResOK) return res;
323 /* FIXME: Should dump contents in hex. */
324 break;
325 }
326
327 return ResOK;
328}
329
330
238void EventDump(mps_lib_FILE *stream) 331void EventDump(mps_lib_FILE *stream)
239{ 332{
240 Event event; 333 Event event;
@@ -244,37 +337,10 @@ void EventDump(mps_lib_FILE *stream)
244 for (event = (Event)EventLast; 337 for (event = (Event)EventLast;
245 event < (Event)(EventBuffer + EventBufferSIZE); 338 event < (Event)(EventBuffer + EventBufferSIZE);
246 event = (Event)((char *)event + event->any.size)) { 339 event = (Event)((char *)event + event->any.size)) {
247 EVENT_CLOCK_WRITE(stream, event->any.clock); 340 /* Try to keep going even if there's an error, because this is used as a
248 341 backtrace and we'll take what we can get. */
249 switch (event->any.code) { 342 (void)EventWrite(event, stream);
250 343 (void)WriteF(stream, "\n", NULL);
251#define EVENT_DUMP_PARAM_MOST(name, index, sort, ident) \
252 " $"#sort, (WriteF##sort)event->name.f##index,
253#define EVENT_DUMP_PARAM_A EVENT_DUMP_PARAM_MOST
254#define EVENT_DUMP_PARAM_P EVENT_DUMP_PARAM_MOST
255#define EVENT_DUMP_PARAM_U EVENT_DUMP_PARAM_MOST
256#define EVENT_DUMP_PARAM_W EVENT_DUMP_PARAM_MOST
257#define EVENT_DUMP_PARAM_D EVENT_DUMP_PARAM_MOST
258#define EVENT_DUMP_PARAM_B(name, index, sort, ident) \
259 " $U", (WriteFU)event->name.f##index,
260#define EVENT_DUMP_PARAM_S(name, index, sort, ident) \
261 " $S", (WriteFS)event->name.f##index.str, /* FIXME: relies on NUL? */
262#define EVENT_DUMP_PARAM(name, index, sort, ident) \
263 EVENT_DUMP_PARAM_##sort(name, index, sort, ident)
264#define EVENT_DUMP(X, name, code, always, kind) \
265 case code: \
266 WriteF(stream, " "#name, \
267 EVENT_##name##_PARAMS(EVENT_DUMP_PARAM, name) \
268 NULL); \
269 break;
270 EVENT_LIST(EVENT_DUMP, X)
271
272 default:
273 WriteF(stream, " <unknown code $U>", event->any.code, NULL);
274 /* FIXME: Should dump contents in hex. */
275 break;
276 }
277 WriteF(stream, "\n", NULL);
278 } 344 }
279} 345}
280 346
@@ -333,6 +399,22 @@ void (EventLabelAddr)(Addr addr, Word id)
333} 399}
334 400
335 401
402Res EventDescribe(Event event, mps_lib_FILE *stream)
403{
404 UNUSED(event);
405 UNUSED(stream);
406 return ResUNIMPL;
407}
408
409
410Res EventWrite(Event event, mps_lib_FILE *stream)
411{
412 UNUSED(event);
413 UNUSED(stream);
414 return ResUNIMPL;
415}
416
417
336extern void EventDump(mps_lib_FILE *stream) 418extern void EventDump(mps_lib_FILE *stream)
337{ 419{
338 UNUSED(stream); 420 UNUSED(stream);
diff --git a/mps/code/event.h b/mps/code/event.h
index 1265aa22d19..7d02b947d3e 100644
--- a/mps/code/event.h
+++ b/mps/code/event.h
@@ -33,6 +33,8 @@ extern EventStringId EventInternString(const char *label);
33extern EventStringId EventInternGenString(size_t, const char *label); 33extern EventStringId EventInternGenString(size_t, const char *label);
34extern void EventLabelAddr(Addr addr, Word id); 34extern void EventLabelAddr(Addr addr, Word id);
35extern Res EventFlush(void); 35extern Res EventFlush(void);
36extern Res EventDescribe(Event event, mps_lib_FILE *stream);
37extern Res EventWrite(Event event, mps_lib_FILE *stream);
36extern void EventDump(mps_lib_FILE *stream); 38extern void EventDump(mps_lib_FILE *stream);
37 39
38 40
diff --git a/mps/code/trace.c b/mps/code/trace.c
index d5aff875030..c362a4809cf 100644
--- a/mps/code/trace.c
+++ b/mps/code/trace.c
@@ -814,8 +814,6 @@ static void traceReclaim(Trace trace)
814 PoolTraceEnd(pool, trace); 814 PoolTraceEnd(pool, trace);
815 } 815 }
816 816
817NOTREACHED;
818
819 ArenaCompact(arena, trace); /* let arenavm drop chunks */ 817 ArenaCompact(arena, trace); /* let arenavm drop chunks */
820 818
821 TracePostMessage(trace); /* trace end */ 819 TracePostMessage(trace); /* trace end */