From 61fce5d877e6388c4422950dcabf6b4bd6d39624 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Mon, 13 Nov 2006 15:56:09 +0000 Subject: Use a static pointer rather than a static object, to allow it to be freed in Timers::Cleanup, removing a reported memory leak (refs #9) --- lib/common/Timer.cpp | 39 +++++++++++++++++++-------------------- lib/common/Timer.h | 3 +-- 2 files changed, 20 insertions(+), 22 deletions(-) (limited to 'lib/common') diff --git a/lib/common/Timer.cpp b/lib/common/Timer.cpp index e05affb2..cfeca3c5 100644 --- a/lib/common/Timer.cpp +++ b/lib/common/Timer.cpp @@ -16,8 +16,7 @@ #include "MemLeakFindOn.h" -std::vector Timers::sTimers; -bool Timers::sInitialised = false; +std::vector* Timers::spTimers = NULL; // -------------------------------------------------------------------------- // @@ -42,7 +41,7 @@ static void TimerSigHandler(int iUnused) // -------------------------------------------------------------------------- void Timers::Init() { - ASSERT(!sInitialised); + ASSERT(!spTimers); #ifdef PLATFORM_CYGWIN ASSERT(::signal(SIGALRM, TimerSigHandler) == 0); @@ -54,7 +53,7 @@ void Timers::Init() ASSERT(::signal(SIGALRM, TimerSigHandler) == 0); #endif // PLATFORM_CYGWIN - sInitialised = true; + spTimers = new std::vector; } // -------------------------------------------------------------------------- @@ -67,7 +66,7 @@ void Timers::Init() // -------------------------------------------------------------------------- void Timers::Cleanup() { - ASSERT(sInitialised); + ASSERT(spTimers); #ifdef PLATFORM_CYGWIN ASSERT(::signal(SIGALRM, NULL) == TimerSigHandler); @@ -79,9 +78,9 @@ void Timers::Cleanup() ASSERT(::signal(SIGALRM, NULL) == TimerSigHandler); #endif // PLATFORM_CYGWIN - sTimers.clear(); - - sInitialised = false; + spTimers->clear(); + delete spTimers; + spTimers = NULL; } // -------------------------------------------------------------------------- @@ -94,8 +93,8 @@ void Timers::Cleanup() // -------------------------------------------------------------------------- void Timers::Add(Timer& rTimer) { - ASSERT(sInitialised); - sTimers.push_back(&rTimer); + ASSERT(spTimers); + spTimers->push_back(&rTimer); Reschedule(); } @@ -110,18 +109,18 @@ void Timers::Add(Timer& rTimer) // -------------------------------------------------------------------------- void Timers::Remove(Timer& rTimer) { - ASSERT(sInitialised); + ASSERT(spTimers); bool restart = true; while (restart) { restart = false; - for (std::vector::iterator i = sTimers.begin(); - i != sTimers.end(); i++) + for (std::vector::iterator i = spTimers->begin(); + i != spTimers->end(); i++) { if (&rTimer == *i) { - sTimers.erase(i); + spTimers->erase(i); restart = true; break; } @@ -141,13 +140,13 @@ void Timers::Remove(Timer& rTimer) // -------------------------------------------------------------------------- void Timers::Reschedule() { - ASSERT(sInitialised); + ASSERT(spTimers); box_time_t timeNow = GetCurrentBoxTime(); box_time_t timeToNextEvent = 0; - for (std::vector::iterator i = sTimers.begin(); - i != sTimers.end(); i++) + for (std::vector::iterator i = spTimers->begin(); + i != spTimers->end(); i++) { Timer& rTimer = **i; ASSERT(!rTimer.HasExpired()); @@ -192,11 +191,11 @@ void Timers::Reschedule() // -------------------------------------------------------------------------- void Timers::Signal() { - ASSERT(sInitialised); + ASSERT(spTimers); box_time_t timeNow = GetCurrentBoxTime(); - std::vector timersCopy = sTimers; + std::vector timersCopy = *spTimers; for (std::vector::iterator i = timersCopy.begin(); i != timersCopy.end(); i++) @@ -211,7 +210,7 @@ void Timers::Signal() rTimer.OnExpire(); } } - + Reschedule(); } diff --git a/lib/common/Timer.h b/lib/common/Timer.h index 6e4a5952..e0eb34db 100644 --- a/lib/common/Timer.h +++ b/lib/common/Timer.h @@ -48,8 +48,7 @@ private: class Timers { private: - static std::vector sTimers; - static bool sInitialised; + static std::vector* spTimers; static void Reschedule(); public: -- cgit v1.2.3