if a timergroup is destroyed before its timers, print times.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99873 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2010-03-30 04:58:26 +00:00
parent b9312690a2
commit 9f9f6d19dd
3 changed files with 15 additions and 11 deletions

View File

@ -171,6 +171,7 @@ public:
explicit TimerGroup(const TimerGroup &TG) : FirstTimer(0) { explicit TimerGroup(const TimerGroup &TG) : FirstTimer(0) {
operator=(TG); operator=(TG);
} }
~TimerGroup();
void operator=(const TimerGroup &TG) { void operator=(const TimerGroup &TG) {
assert(TG.FirstTimer == 0 && FirstTimer == 0 && assert(TG.FirstTimer == 0 && FirstTimer == 0 &&
@ -181,11 +182,6 @@ public:
void setName(const std::string &name) { Name = name; } void setName(const std::string &name) { Name = name; }
~TimerGroup() {
assert(FirstTimer == 0 &&
"TimerGroup destroyed before all contained timers!");
}
void PrintQueuedTimers(raw_ostream &OS); void PrintQueuedTimers(raw_ostream &OS);
private: private:

View File

@ -128,6 +128,6 @@ StatisticInfo::~StatisticInfo() {
OutStream << '\n'; // Flush the output stream... OutStream << '\n'; // Flush the output stream...
OutStream.flush(); OutStream.flush();
if (&OutStream != &outs() && &OutStream != &errs() && &OutStream != &dbgs()) if (&OutStream != &outs() && &OutStream != &errs())
delete &OutStream; // Close the file. delete &OutStream; // Close the file.
} }

View File

@ -237,14 +237,22 @@ NamedRegionTimer::NamedRegionTimer(const std::string &Name,
// TimerGroup Implementation // TimerGroup Implementation
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
TimerGroup::~TimerGroup() {
// If the timer group is destroyed before the timers it owns, accumulate and
// print the timing data.
while (FirstTimer != 0)
removeTimer(*FirstTimer);
}
void TimerGroup::removeTimer(Timer &T) { void TimerGroup::removeTimer(Timer &T) {
sys::SmartScopedLock<true> L(*TimerLock); sys::SmartScopedLock<true> L(*TimerLock);
// If the timer was started, move its data to TimersToPrint. // If the timer was started, move its data to TimersToPrint.
if (T.Started) { if (T.Started)
T.Started = false;
TimersToPrint.push_back(std::make_pair(T.Time, T.Name)); TimersToPrint.push_back(std::make_pair(T.Time, T.Name));
}
T.TG = 0;
// Unlink the timer from our list. // Unlink the timer from our list.
*T.Prev = T.Next; *T.Prev = T.Next;