diff options
author | Oleg Grenrus <oleg.grenrus@iki.fi> | 2021-08-31 16:07:16 +0300 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2021-10-15 18:16:14 -0400 |
commit | 88e913d443203376454b5242efa5fff0928992a8 (patch) | |
tree | 0da963e6cbfdb078147cacc3461dd5810c5a27c9 | |
parent | 1cda768c86e533c917a495c8de0468960cbe7a52 (diff) | |
download | haskell-88e913d443203376454b5242efa5fff0928992a8.tar.gz |
Null eventlog writer
-rw-r--r-- | docs/users_guide/profiling.rst | 8 | ||||
-rw-r--r-- | rts/RtsFlags.c | 6 | ||||
-rw-r--r-- | rts/Trace.c | 4 | ||||
-rw-r--r-- | rts/eventlog/EventLogWriter.c | 21 | ||||
-rw-r--r-- | rts/include/rts/EventLogWriter.h | 5 | ||||
-rw-r--r-- | rts/include/rts/Flags.h | 1 | ||||
-rw-r--r-- | testsuite/tests/rts/Makefile | 6 | ||||
-rw-r--r-- | testsuite/tests/rts/all.T | 5 |
8 files changed, 56 insertions, 0 deletions
diff --git a/docs/users_guide/profiling.rst b/docs/users_guide/profiling.rst index dbe0da06cf..f5a99c82a4 100644 --- a/docs/users_guide/profiling.rst +++ b/docs/users_guide/profiling.rst @@ -900,6 +900,14 @@ There are three more options which relate to heap profiling: option is enabled, it's expected that the user will manually start heap profiling or request specific samples using functions from ``GHC.Profiling``. + +.. rts-flag:: --null-eventlog-writer + + :since: 9.2.2 + + Don't output eventlog to file, only configure tracing events. + Meant to be used with customized event log writer. + .. rts-flag:: -L ⟨num⟩ Sets the maximum length of a cost-centre stack name in a heap diff --git a/rts/RtsFlags.c b/rts/RtsFlags.c index a775e2986a..0d41108822 100644 --- a/rts/RtsFlags.c +++ b/rts/RtsFlags.c @@ -239,6 +239,7 @@ void initRtsFlagsDefaults(void) RtsFlags.TraceFlags.ticky = false; RtsFlags.TraceFlags.trace_output = NULL; RtsFlags.TraceFlags.eventlogFlushTime = 0; + RtsFlags.TraceFlags.nullWriter = false; #endif #if defined(PROFILING) @@ -959,6 +960,11 @@ error = true; OPTION_UNSAFE; RtsFlags.MiscFlags.generate_dump_file = true; } + else if (strequal("null-eventlog-writer", + &rts_argv[arg][2])) { + OPTION_UNSAFE; + RtsFlags.TraceFlags.nullWriter = true; + } else if (strequal("machine-readable", &rts_argv[arg][2])) { OPTION_UNSAFE; diff --git a/rts/Trace.c b/rts/Trace.c index dace0970e6..9edac3565e 100644 --- a/rts/Trace.c +++ b/rts/Trace.c @@ -107,6 +107,10 @@ void initTracing (void) initEventLogging(); if (RtsFlags.TraceFlags.tracing == TRACE_EVENTLOG + && RtsFlags.TraceFlags.nullWriter) { + startEventLogging(&NullEventLogWriter); + } + else if (RtsFlags.TraceFlags.tracing == TRACE_EVENTLOG && rtsConfig.eventlog_writer != NULL) { startEventLogging(rtsConfig.eventlog_writer); } diff --git a/rts/eventlog/EventLogWriter.c b/rts/eventlog/EventLogWriter.c index 06aad2841e..daa6dc3c9d 100644 --- a/rts/eventlog/EventLogWriter.c +++ b/rts/eventlog/EventLogWriter.c @@ -147,9 +147,30 @@ stopEventLogFileWriter(void) #endif } +static void +initEventLogFileWriterNoop(void) {} + +static bool +writeEventLogFileNoop(void *eventlog STG_UNUSED, size_t eventlog_size STG_UNUSED) { + return true; // writes succeed always +} + +static void +flushEventLogFileNoop(void) {} + +static void +stopEventLogFileWriterNoop(void) {} + const EventLogWriter FileEventLogWriter = { .initEventLogWriter = initEventLogFileWriter, .writeEventLog = writeEventLogFile, .flushEventLog = flushEventLogFile, .stopEventLogWriter = stopEventLogFileWriter }; + +const EventLogWriter NullEventLogWriter = { + .initEventLogWriter = initEventLogFileWriterNoop, + .writeEventLog = writeEventLogFileNoop, + .flushEventLog = flushEventLogFileNoop, + .stopEventLogWriter = stopEventLogFileWriterNoop +}; diff --git a/rts/include/rts/EventLogWriter.h b/rts/include/rts/EventLogWriter.h index 73a2aec64c..1f53d2f58a 100644 --- a/rts/include/rts/EventLogWriter.h +++ b/rts/include/rts/EventLogWriter.h @@ -43,6 +43,11 @@ typedef struct { */ extern const EventLogWriter FileEventLogWriter; +/* + * An EventLogWriter which does nothing. + */ +extern const EventLogWriter NullEventLogWriter; + enum EventLogStatus { /* The runtime system wasn't compiled with eventlog support. */ EVENTLOG_NOT_SUPPORTED, diff --git a/rts/include/rts/Flags.h b/rts/include/rts/Flags.h index e8298023de..9291f492cf 100644 --- a/rts/include/rts/Flags.h +++ b/rts/include/rts/Flags.h @@ -181,6 +181,7 @@ typedef struct _TRACE_FLAGS { Time eventlogFlushTime; /* Time between force eventlog flushes (or 0 if disabled) */ int eventlogFlushTicks; char *trace_output; /* output filename for eventlog */ + bool nullWriter; /* use null writer instead of file writer */ } TRACE_FLAGS; /* See Note [Synchronization of flags and base APIs] */ diff --git a/testsuite/tests/rts/Makefile b/testsuite/tests/rts/Makefile index 2ada2adc75..fe35bd4d2c 100644 --- a/testsuite/tests/rts/Makefile +++ b/testsuite/tests/rts/Makefile @@ -131,6 +131,12 @@ EventlogOutput2: ./EventlogOutput +RTS -l ls EventlogOutput.eventlog >/dev/null +.PHONY: EventlogOutputNull +EventlogOutputNull: + "$(TEST_HC)" -eventlog -rtsopts -v0 EventlogOutput.hs + ./EventlogOutput +RTS -l --null-eventlog-writer + test ! -e EventlogOutput.eventlog + .PHONY: T20199 T20199: "$(TEST_HC)" -no-hs-main -optcxx-std=c++11 -v0 T20199.cpp -o T20199 diff --git a/testsuite/tests/rts/all.T b/testsuite/tests/rts/all.T index ab18a94218..a62585c6f4 100644 --- a/testsuite/tests/rts/all.T +++ b/testsuite/tests/rts/all.T @@ -170,6 +170,11 @@ test('EventlogOutput2', omit_ways(['dyn', 'ghci'] + prof_ways) ], makefile_test, ['EventlogOutput2']) +test('EventlogOutputNull', + [ extra_files(["EventlogOutput.hs"]), + omit_ways(['dyn', 'ghci'] + prof_ways) ], + makefile_test, ['EventlogOutputNull']) + # Test that Info Table Provenance (IPE) events are emitted. test('EventlogOutput_IPE', [ extra_files(["EventlogOutput.hs"]), |