From 018770d06d4bbc1e2730d3f59b1afe39f3f32dc7 Mon Sep 17 00:00:00 2001 From: Miles Cranmer Date: Sat, 25 May 2024 00:40:12 +0100 Subject: [PATCH] Create `jl_clear_coverage_data` to dynamically reset coverage (#54358) There are some use-cases that would benefit from being able to reset the code coverage information during runtime. This creates the function `jl_clear_coverage_data` to reset the `coverageData` global. --- src/coverage.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/coverage.cpp b/src/coverage.cpp index 100a4c66322bd..c061276e66fd9 100644 --- a/src/coverage.cpp +++ b/src/coverage.cpp @@ -77,11 +77,10 @@ JL_DLLEXPORT uint64_t *jl_malloc_data_pointer(StringRef filename, int line) return allocLine(mallocData[filename], line); } -// Resets the malloc counts. -extern "C" JL_DLLEXPORT void jl_clear_malloc_data(void) +static void clear_log_data(logdata_t &logData, int resetValue) { - logdata_t::iterator it = mallocData.begin(); - for (; it != mallocData.end(); it++) { + logdata_t::iterator it = logData.begin(); + for (; it != logData.end(); it++) { SmallVector &bytes = (*it).second; SmallVector::iterator itb; for (itb = bytes.begin(); itb != bytes.end(); itb++) { @@ -89,7 +88,7 @@ extern "C" JL_DLLEXPORT void jl_clear_malloc_data(void) logdata_block &data = **itb; for (int i = 0; i < logdata_blocksize; i++) { if (data[i] > 0) - data[i] = 1; + data[i] = resetValue; } } } @@ -97,6 +96,18 @@ extern "C" JL_DLLEXPORT void jl_clear_malloc_data(void) jl_gc_sync_total_bytes(0); } +// Resets the malloc counts. +extern "C" JL_DLLEXPORT void jl_clear_malloc_data(void) +{ + clear_log_data(mallocData, 1); +} + +// Resets the code coverage +extern "C" JL_DLLEXPORT void jl_clear_coverage_data(void) +{ + clear_log_data(coverageData, 0); +} + static void write_log_data(logdata_t &logData, const char *extension) { std::string base = std::string(jl_options.julia_bindir);