diff options
author | Matthew Pickering <matthewtpickering@gmail.com> | 2019-05-29 16:56:08 +0100 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2019-06-07 10:21:57 -0400 |
commit | 0b7372f68c0bc9cafc30e227b574abf1d5b16df5 (patch) | |
tree | f1b33e977ed5fb858ba102815260136a89d1735c | |
parent | e963beb54a243f011396942d2add644e3f3dd8ae (diff) | |
download | haskell-0b7372f68c0bc9cafc30e227b574abf1d5b16df5.tar.gz |
Add HEAP_PROF_SAMPLE_END event to mark end of samples
This allows a user to observe how long a sampling period lasts so that
the time taken can be removed from the profiling output.
Fixes #16697
-rw-r--r-- | docs/users_guide/eventlog-formats.rst | 8 | ||||
-rw-r--r-- | includes/rts/EventLogFormat.h | 1 | ||||
-rw-r--r-- | rts/ProfHeap.c | 1 | ||||
-rw-r--r-- | rts/Trace.c | 7 | ||||
-rw-r--r-- | rts/Trace.h | 2 | ||||
-rw-r--r-- | rts/eventlog/EventLog.c | 14 | ||||
-rw-r--r-- | rts/eventlog/EventLog.h | 1 |
7 files changed, 34 insertions, 0 deletions
diff --git a/docs/users_guide/eventlog-formats.rst b/docs/users_guide/eventlog-formats.rst index 6fd7d89b7e..0590fc65db 100644 --- a/docs/users_guide/eventlog-formats.rst +++ b/docs/users_guide/eventlog-formats.rst @@ -84,6 +84,14 @@ in length a single sample may need to be split among multiple ``EVENT_HEAP_PROF_SAMPLE`` events. The precise format of the census entries is determined by the break-down type. +At the end of the sample period the ``EVENT_HEAP_PROF_SAMPLE_END`` event if +emitted. This is useful to properly delimit the sampling period and to record +the total time spent profiling. + + + * ``EVENT_HEAP_PROF_SAMPLE_END`` + * ``Word64``: sample number + Cost-centre break-down ^^^^^^^^^^^^^^^^^^^^^^ diff --git a/includes/rts/EventLogFormat.h b/includes/rts/EventLogFormat.h index 63303c93b7..462e036d90 100644 --- a/includes/rts/EventLogFormat.h +++ b/includes/rts/EventLogFormat.h @@ -178,6 +178,7 @@ #define EVENT_HEAP_PROF_SAMPLE_BEGIN 162 #define EVENT_HEAP_PROF_SAMPLE_COST_CENTRE 163 #define EVENT_HEAP_PROF_SAMPLE_STRING 164 +#define EVENT_HEAP_PROF_SAMPLE_END 165 #define EVENT_USER_BINARY_MSG 181 diff --git a/rts/ProfHeap.c b/rts/ProfHeap.c index 5e3f8940a0..6fbfb6ea88 100644 --- a/rts/ProfHeap.c +++ b/rts/ProfHeap.c @@ -884,6 +884,7 @@ dumpCensus( Census *census ) fprintf(hp_file, "\t%" FMT_Word "\n", (W_)count * sizeof(W_)); } + traceHeapProfSampleEnd(era); printSample(false, census->time); } diff --git a/rts/Trace.c b/rts/Trace.c index 4475054509..e345377eef 100644 --- a/rts/Trace.c +++ b/rts/Trace.c @@ -623,6 +623,13 @@ void traceHeapProfSampleBegin(StgInt era) } } +void traceHeapProfSampleEnd(StgInt era) +{ + if (eventlog_enabled) { + postHeapProfSampleEnd(era); + } +} + void traceHeapProfSampleString(StgWord8 profile_id, const char *label, StgWord residency) { diff --git a/rts/Trace.h b/rts/Trace.h index 74b960ce31..17e3dc7040 100644 --- a/rts/Trace.h +++ b/rts/Trace.h @@ -288,6 +288,7 @@ void traceTaskDelete_ (Task *task); void traceHeapProfBegin(StgWord8 profile_id); void traceHeapProfSampleBegin(StgInt era); +void traceHeapProfSampleEnd(StgInt era); void traceHeapProfSampleString(StgWord8 profile_id, const char *label, StgWord residency); #if defined(PROFILING) @@ -335,6 +336,7 @@ void flushTrace(void); #define traceHeapProfBegin(profile_id) /* nothing */ #define traceHeapProfCostCentre(ccID, label, module, srcloc, is_caf) /* nothing */ #define traceHeapProfSampleBegin(era) /* nothing */ +#define traceHeapProfSampleEnd(era) /* nothing */ #define traceHeapProfSampleCostCentre(profile_id, stack, residency) /* nothing */ #define traceHeapProfSampleString(profile_id, label, residency) /* nothing */ diff --git a/rts/eventlog/EventLog.c b/rts/eventlog/EventLog.c index ff79425a4c..c853492f09 100644 --- a/rts/eventlog/EventLog.c +++ b/rts/eventlog/EventLog.c @@ -103,6 +103,7 @@ char *EventDesc[] = { [EVENT_HEAP_PROF_BEGIN] = "Start of heap profile", [EVENT_HEAP_PROF_COST_CENTRE] = "Cost center definition", [EVENT_HEAP_PROF_SAMPLE_BEGIN] = "Start of heap profile sample", + [EVENT_HEAP_PROF_SAMPLE_END] = "End of heap profile sample", [EVENT_HEAP_PROF_SAMPLE_STRING] = "Heap profile string sample", [EVENT_HEAP_PROF_SAMPLE_COST_CENTRE] = "Heap profile cost-centre sample", [EVENT_USER_BINARY_MSG] = "User binary message" @@ -430,6 +431,10 @@ postHeaderEvents(void) eventTypes[t].size = 8; break; + case EVENT_HEAP_PROF_SAMPLE_END: + eventTypes[t].size = 8; + break; + case EVENT_HEAP_PROF_SAMPLE_STRING: eventTypes[t].size = EVENT_SIZE_DYNAMIC; break; @@ -1210,6 +1215,15 @@ void postHeapProfSampleBegin(StgInt era) RELEASE_LOCK(&eventBufMutex); } +void postHeapProfSampleEnd(StgInt era) +{ + ACQUIRE_LOCK(&eventBufMutex); + ensureRoomForEvent(&eventBuf, EVENT_HEAP_PROF_SAMPLE_END); + postEventHeader(&eventBuf, EVENT_HEAP_PROF_SAMPLE_END); + postWord64(&eventBuf, era); + RELEASE_LOCK(&eventBufMutex); +} + void postHeapProfSampleString(StgWord8 profile_id, const char *label, StgWord64 residency) diff --git a/rts/eventlog/EventLog.h b/rts/eventlog/EventLog.h index 1fb7c4a071..8935e61985 100644 --- a/rts/eventlog/EventLog.h +++ b/rts/eventlog/EventLog.h @@ -140,6 +140,7 @@ void postTaskDeleteEvent (EventTaskId taskId); void postHeapProfBegin(StgWord8 profile_id); void postHeapProfSampleBegin(StgInt era); +void postHeapProfSampleEnd(StgInt era); void postHeapProfSampleString(StgWord8 profile_id, const char *label, |