diff options
author | Mikolaj <mikolaj.konarski@gmail.com> | 2012-03-09 14:22:06 +0100 |
---|---|---|
committer | Duncan Coutts <duncan@well-typed.com> | 2012-04-04 19:10:45 +0100 |
commit | 598109eb0cc2271c33e23b4ddb12123991273f61 (patch) | |
tree | 3399a0853bea39cd5ef5e66408ff949937446233 /rts/eventlog/EventLog.c | |
parent | 1f809ce6df1dca54b977c6cac8f2b1c745683cf9 (diff) | |
download | haskell-598109eb0cc2271c33e23b4ddb12123991273f61.tar.gz |
Fix the timestamps in GC_START and GC_END events on the GC-initiating cap
There was a discrepancy between GC times reported in +RTS -s
and the timestamps of GC_START and GC_END events on the cap,
on which +RTS -s stats for the given GC are based.
This is fixed by posting the events with exactly the same timestamp
as generated for the stat calculation. The calls posting the events
are moved too, so that the events are emitted close to the time instant
they claim to be emitted at. The GC_STATS_GHC was moved, too, ensuring
it's emitted before the moved GC_END on all caps, which simplifies tools code.
Diffstat (limited to 'rts/eventlog/EventLog.c')
-rw-r--r-- | rts/eventlog/EventLog.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/rts/eventlog/EventLog.c b/rts/eventlog/EventLog.c index 8e7cf3784d..aab93bbd92 100644 --- a/rts/eventlog/EventLog.c +++ b/rts/eventlog/EventLog.c @@ -839,7 +839,7 @@ void postHeapEvent (Capability *cap, case EVENT_HEAP_LIVE: // (heap_capset, live_bytes) { postCapsetID(eb, heap_capset); - postWord64(eb,info1 /* alloc/size/live_bytes */); + postWord64(eb, info1 /* alloc/size/live_bytes */); break; } @@ -924,6 +924,25 @@ postEvent (Capability *cap, EventTypeNum tag) postEventHeader(eb, tag); } +void +postEventAtTimestamp (Capability *cap, EventTimestamp ts, EventTypeNum tag) +{ + EventsBuf *eb; + + eb = &capEventBuf[cap->no]; + + if (!hasRoomForEvent(eb, tag)) { + // Flush event buffer to make room for new event. + printAndClearEventBuf(eb); + } + + /* Normally we'd call postEventHeader(), but that generates its own + timestamp, so we go one level lower so we can write out + the timestamp we received as an argument. */ + postEventTypeNum(eb, tag); + postWord64(eb, ts); +} + #define BUF 512 void postLogMsg(EventsBuf *eb, EventTypeNum type, char *msg, va_list ap) |