diff options
| author | Richard Brooksby | 2012-08-31 15:14:09 +0100 |
|---|---|---|
| committer | Richard Brooksby | 2012-08-31 15:14:09 +0100 |
| commit | 455e3ee43cb87db88f14e4093f2bf4f80c30134d (patch) | |
| tree | 4a1358a973268012409dbbbf4353ddc71b996c96 /mps/code | |
| parent | 09dc2bca88079b32d042061b3f1ec51b0083cc6e (diff) | |
| download | emacs-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.c | 148 | ||||
| -rw-r--r-- | mps/code/event.h | 2 | ||||
| -rw-r--r-- | mps/code/trace.c | 2 |
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 | ||
| 51 | EventDump(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 | |||
| 250 | Res 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 | |||
| 297 | Res 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 | |||
| 238 | void EventDump(mps_lib_FILE *stream) | 331 | void 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 | ||
| 402 | Res EventDescribe(Event event, mps_lib_FILE *stream) | ||
| 403 | { | ||
| 404 | UNUSED(event); | ||
| 405 | UNUSED(stream); | ||
| 406 | return ResUNIMPL; | ||
| 407 | } | ||
| 408 | |||
| 409 | |||
| 410 | Res EventWrite(Event event, mps_lib_FILE *stream) | ||
| 411 | { | ||
| 412 | UNUSED(event); | ||
| 413 | UNUSED(stream); | ||
| 414 | return ResUNIMPL; | ||
| 415 | } | ||
| 416 | |||
| 417 | |||
| 336 | extern void EventDump(mps_lib_FILE *stream) | 418 | extern 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); | |||
| 33 | extern EventStringId EventInternGenString(size_t, const char *label); | 33 | extern EventStringId EventInternGenString(size_t, const char *label); |
| 34 | extern void EventLabelAddr(Addr addr, Word id); | 34 | extern void EventLabelAddr(Addr addr, Word id); |
| 35 | extern Res EventFlush(void); | 35 | extern Res EventFlush(void); |
| 36 | extern Res EventDescribe(Event event, mps_lib_FILE *stream); | ||
| 37 | extern Res EventWrite(Event event, mps_lib_FILE *stream); | ||
| 36 | extern void EventDump(mps_lib_FILE *stream); | 38 | extern 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 | ||
| 817 | NOTREACHED; | ||
| 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 */ |