From 455e3ee43cb87db88f14e4093f2bf4f80c30134d Mon Sep 17 00:00:00 2001 From: Richard Brooksby Date: Fri, 31 Aug 2012 15:14:09 +0100 Subject: Adding an mps-style eventdescribe. Removing deliberate assert and event debugging dump. Oops. Copied from Perforce Change: 179133 ServerID: perforce.ravenbrook.com --- mps/code/event.c | 148 ++++++++++++++++++++++++++++++++++++++++++------------- mps/code/event.h | 2 + mps/code/trace.c | 2 - 3 files changed, 117 insertions(+), 35 deletions(-) (limited to 'mps/code') 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) Res res; size_t size; -EventDump(mps_lib_get_stdout()); - AVER(eventInited); AVER(EventBuffer <= EventLast); @@ -235,6 +233,101 @@ void EventLabelAddr(Addr addr, EventStringId id) } +/* Convert event parameter sort to WriteF arguments */ + +#define EVENT_WRITE_PARAM_MOST(name, index, sort, ident) \ + " $"#sort, (WriteF##sort)event->name.f##index, +#define EVENT_WRITE_PARAM_A EVENT_WRITE_PARAM_MOST +#define EVENT_WRITE_PARAM_P EVENT_WRITE_PARAM_MOST +#define EVENT_WRITE_PARAM_U EVENT_WRITE_PARAM_MOST +#define EVENT_WRITE_PARAM_W EVENT_WRITE_PARAM_MOST +#define EVENT_WRITE_PARAM_D EVENT_WRITE_PARAM_MOST +#define EVENT_WRITE_PARAM_B(name, index, sort, ident) \ + " $U", (WriteFU)event->name.f##index, +#define EVENT_WRITE_PARAM_S(name, index, sort, ident) \ + " $S", (WriteFS)event->name.f##index.str, /* FIXME: relies on NUL? */ + +Res EventDescribe(Event event, mps_lib_FILE *stream) +{ + Res res; + + /* FIXME: Some sort of EventCheck would be good */ + if (event == NULL) + return ResFAIL; + if (stream == NULL) + return ResFAIL; + + res = WriteF(stream, + "Event $P {\n", (WriteFP)event, + NULL); + if (res != ResOK) return res; + + switch (event->any.code) { + +#define EVENT_DESC_PARAM(name, index, sort, ident) \ + "\n $S", (WriteFS)#ident, \ + EVENT_WRITE_PARAM_##sort(name, index, sort, ident) + +#define EVENT_DESC(X, name, _code, always, kind) \ + case _code: \ + res = WriteF(stream, \ + " code $U ($S)\n", (WriteFU)event->any.code, (WriteFS)#name, \ + " clock ", NULL); \ + if (res != ResOK) return res; \ + EVENT_CLOCK_WRITE(stream, event->any.clock); /* FIXME: return code */ \ + res = WriteF(stream, "\n size $U", (WriteFU)event->any.size, \ + EVENT_##name##_PARAMS(EVENT_DESC_PARAM, name) \ + NULL); \ + if (res != ResOK) return res; \ + break; + + EVENT_LIST(EVENT_DESC, X) + + default: + NOTREACHED; /* FIXME: should print .any info */ + } + + res = WriteF(stream, + "\n} Event $P\n", (WriteFP)event, + NULL); + return res; +} + + +Res EventWrite(Event event, mps_lib_FILE *stream) +{ + Res res; + + if (event == NULL) return ResFAIL; + if (stream == NULL) return ResFAIL; + + EVENT_CLOCK_WRITE(stream, event->any.clock); /* FIXME: return code */ + + switch (event->any.code) { + +#define EVENT_WRITE_PARAM(name, index, sort, ident) \ + EVENT_WRITE_PARAM_##sort(name, index, sort, ident) + +#define EVENT_WRITE(X, name, code, always, kind) \ + case code: \ + res = WriteF(stream, " "#name, \ + EVENT_##name##_PARAMS(EVENT_WRITE_PARAM, name) \ + NULL); \ + if (res != ResOK) return res; \ + break; + EVENT_LIST(EVENT_WRITE, X) + + default: + res = WriteF(stream, " ", event->any.code, NULL); + if (res != ResOK) return res; + /* FIXME: Should dump contents in hex. */ + break; + } + + return ResOK; +} + + void EventDump(mps_lib_FILE *stream) { Event event; @@ -244,37 +337,10 @@ void EventDump(mps_lib_FILE *stream) for (event = (Event)EventLast; event < (Event)(EventBuffer + EventBufferSIZE); event = (Event)((char *)event + event->any.size)) { - EVENT_CLOCK_WRITE(stream, event->any.clock); - - switch (event->any.code) { - -#define EVENT_DUMP_PARAM_MOST(name, index, sort, ident) \ - " $"#sort, (WriteF##sort)event->name.f##index, -#define EVENT_DUMP_PARAM_A EVENT_DUMP_PARAM_MOST -#define EVENT_DUMP_PARAM_P EVENT_DUMP_PARAM_MOST -#define EVENT_DUMP_PARAM_U EVENT_DUMP_PARAM_MOST -#define EVENT_DUMP_PARAM_W EVENT_DUMP_PARAM_MOST -#define EVENT_DUMP_PARAM_D EVENT_DUMP_PARAM_MOST -#define EVENT_DUMP_PARAM_B(name, index, sort, ident) \ - " $U", (WriteFU)event->name.f##index, -#define EVENT_DUMP_PARAM_S(name, index, sort, ident) \ - " $S", (WriteFS)event->name.f##index.str, /* FIXME: relies on NUL? */ -#define EVENT_DUMP_PARAM(name, index, sort, ident) \ - EVENT_DUMP_PARAM_##sort(name, index, sort, ident) -#define EVENT_DUMP(X, name, code, always, kind) \ - case code: \ - WriteF(stream, " "#name, \ - EVENT_##name##_PARAMS(EVENT_DUMP_PARAM, name) \ - NULL); \ - break; - EVENT_LIST(EVENT_DUMP, X) - - default: - WriteF(stream, " ", event->any.code, NULL); - /* FIXME: Should dump contents in hex. */ - break; - } - WriteF(stream, "\n", NULL); + /* Try to keep going even if there's an error, because this is used as a + backtrace and we'll take what we can get. */ + (void)EventWrite(event, stream); + (void)WriteF(stream, "\n", NULL); } } @@ -333,6 +399,22 @@ void (EventLabelAddr)(Addr addr, Word id) } +Res EventDescribe(Event event, mps_lib_FILE *stream) +{ + UNUSED(event); + UNUSED(stream); + return ResUNIMPL; +} + + +Res EventWrite(Event event, mps_lib_FILE *stream) +{ + UNUSED(event); + UNUSED(stream); + return ResUNIMPL; +} + + extern void EventDump(mps_lib_FILE *stream) { 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); extern EventStringId EventInternGenString(size_t, const char *label); extern void EventLabelAddr(Addr addr, Word id); extern Res EventFlush(void); +extern Res EventDescribe(Event event, mps_lib_FILE *stream); +extern Res EventWrite(Event event, mps_lib_FILE *stream); extern void EventDump(mps_lib_FILE *stream); 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) PoolTraceEnd(pool, trace); } -NOTREACHED; - ArenaCompact(arena, trace); /* let arenavm drop chunks */ TracePostMessage(trace); /* trace end */ -- cgit v1.2.1