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

llvm-svn: 99873
This commit is contained in:
Chris Lattner 2010-03-30 04:58:26 +00:00
parent 2a254fd348
commit 3e11ba35b0
3 changed files with 15 additions and 11 deletions

View File

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

View File

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

View File

@ -237,14 +237,22 @@ NamedRegionTimer::NamedRegionTimer(const std::string &Name,
// 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) {
sys::SmartScopedLock<true> L(*TimerLock);
// If the timer was started, move its data to TimersToPrint.
if (T.Started) {
T.Started = false;
if (T.Started)
TimersToPrint.push_back(std::make_pair(T.Time, T.Name));
}
T.TG = 0;
// Unlink the timer from our list.
*T.Prev = T.Next;
@ -257,9 +265,9 @@ void TimerGroup::removeTimer(Timer &T) {
return;
raw_ostream *OutStream = GetLibSupportInfoOutputFile();
PrintQueuedTimers(*OutStream);
if (OutStream != &errs() && OutStream != &outs())
delete OutStream; // Close the file.
}