From 0f4b015268a5df4d95933761d3b999e09454fa3b Mon Sep 17 00:00:00 2001 From: Daniel Sanders Date: Tue, 6 Mar 2018 21:16:42 +0000 Subject: [PATCH] PrintStatistics() and PrintStatisticsJSON() should take StatLock These two functions iterate over the list of statistics but don't take the lock that protects the iterators from being invalidated by StatisticInfo::addStatistic(). So far, this hasn't been an issue since (in-tree at least) these functions are called by the StatisticInfo destructor so addStatistic() shouldn't be called anymore. However, we do expose them in the public API. Note that this only protects against iterator invalidation and does not protect against ordering issues caused by statistic updates that race with PrintStatistics()/PrintStatisticsJSON(). Thanks to Roman Tereshin for spotting it llvm-svn: 326834 --- llvm/lib/Support/Statistic.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/llvm/lib/Support/Statistic.cpp b/llvm/lib/Support/Statistic.cpp index 67b0716..1985409 100644 --- a/llvm/lib/Support/Statistic.cpp +++ b/llvm/lib/Support/Statistic.cpp @@ -166,6 +166,7 @@ void llvm::PrintStatistics(raw_ostream &OS) { } void llvm::PrintStatisticsJSON(raw_ostream &OS) { + sys::SmartScopedLock Reader(*StatLock); StatisticInfo &Stats = *StatInfo; Stats.sort(); @@ -192,6 +193,7 @@ void llvm::PrintStatisticsJSON(raw_ostream &OS) { void llvm::PrintStatistics() { #if LLVM_ENABLE_STATS + sys::SmartScopedLock Reader(*StatLock); StatisticInfo &Stats = *StatInfo; // Statistics not enabled? -- 2.7.4