[Box Backup-commit] COMMIT r1154 - box/chris/merge/lib/common

boxbackup-dev@fluffy.co.uk boxbackup-dev@fluffy.co.uk
Mon, 13 Nov 2006 15:56:09 +0000


Author: chris
Date: 2006-11-13 15:56:09 +0000 (Mon, 13 Nov 2006)
New Revision: 1154

Modified:
   box/chris/merge/lib/common/Timer.cpp
   box/chris/merge/lib/common/Timer.h
Log:
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)


Modified: box/chris/merge/lib/common/Timer.cpp
===================================================================
--- box/chris/merge/lib/common/Timer.cpp	2006-11-13 15:54:49 UTC (rev 1153)
+++ box/chris/merge/lib/common/Timer.cpp	2006-11-13 15:56:09 UTC (rev 1154)
@@ -16,8 +16,7 @@
 
 #include "MemLeakFindOn.h"
 
-std::vector<Timer*> Timers::sTimers;
-bool Timers::sInitialised = false;
+std::vector<Timer*>* Timers::spTimers = NULL;
 
 // --------------------------------------------------------------------------
 //
@@ -42,7 +41,7 @@
 // --------------------------------------------------------------------------
 void Timers::Init()
 {
-	ASSERT(!sInitialised);
+	ASSERT(!spTimers);
 	
 	#ifdef PLATFORM_CYGWIN
 		ASSERT(::signal(SIGALRM, TimerSigHandler) == 0);
@@ -54,7 +53,7 @@
 		ASSERT(::signal(SIGALRM, TimerSigHandler) == 0);
 	#endif // PLATFORM_CYGWIN
 	
-	sInitialised = true;
+	spTimers = new std::vector<Timer*>;
 }
 
 // --------------------------------------------------------------------------
@@ -67,7 +66,7 @@
 // --------------------------------------------------------------------------
 void Timers::Cleanup()
 {
-	ASSERT(sInitialised);
+	ASSERT(spTimers);
 	
 	#ifdef PLATFORM_CYGWIN
 		ASSERT(::signal(SIGALRM, NULL) == TimerSigHandler);
@@ -79,9 +78,9 @@
 		ASSERT(::signal(SIGALRM, NULL) == TimerSigHandler);
 	#endif // PLATFORM_CYGWIN
 
-	sTimers.clear();
-	
-	sInitialised = false;
+	spTimers->clear();
+	delete spTimers;
+	spTimers = NULL;
 }
 
 // --------------------------------------------------------------------------
@@ -94,8 +93,8 @@
 // --------------------------------------------------------------------------
 void Timers::Add(Timer& rTimer)
 {
-	ASSERT(sInitialised);
-	sTimers.push_back(&rTimer);
+	ASSERT(spTimers);
+	spTimers->push_back(&rTimer);
 	Reschedule();
 }
 
@@ -110,18 +109,18 @@
 // --------------------------------------------------------------------------
 void Timers::Remove(Timer& rTimer)
 {
-	ASSERT(sInitialised);
+	ASSERT(spTimers);
 
 	bool restart = true;
 	while (restart)
 	{
 		restart = false;
-		for (std::vector<Timer*>::iterator i = sTimers.begin();
-			i != sTimers.end(); i++)
+		for (std::vector<Timer*>::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::Reschedule()
 {
-	ASSERT(sInitialised);
+	ASSERT(spTimers);
 
 	box_time_t timeNow = GetCurrentBoxTime();
 	box_time_t timeToNextEvent = 0;
 	
-	for (std::vector<Timer*>::iterator i = sTimers.begin();
-		i != sTimers.end(); i++)
+	for (std::vector<Timer*>::iterator i = spTimers->begin();
+		i != spTimers->end(); i++)
 	{
 		Timer& rTimer = **i;
 		ASSERT(!rTimer.HasExpired());
@@ -192,11 +191,11 @@
 // --------------------------------------------------------------------------
 void Timers::Signal()
 {
-	ASSERT(sInitialised);
+	ASSERT(spTimers);
 
 	box_time_t timeNow = GetCurrentBoxTime();
 
-	std::vector<Timer*> timersCopy = sTimers;
+	std::vector<Timer*> timersCopy = *spTimers;
 	
 	for (std::vector<Timer*>::iterator i = timersCopy.begin();
 		i != timersCopy.end(); i++)
@@ -211,7 +210,7 @@
 			rTimer.OnExpire();
 		}
 	}		
-		
+	
 	Reschedule();
 }
 

Modified: box/chris/merge/lib/common/Timer.h
===================================================================
--- box/chris/merge/lib/common/Timer.h	2006-11-13 15:54:49 UTC (rev 1153)
+++ box/chris/merge/lib/common/Timer.h	2006-11-13 15:56:09 UTC (rev 1154)
@@ -48,8 +48,7 @@
 class Timers
 {
 	private:
-	static std::vector<Timer*> sTimers;
-	static bool sInitialised;
+	static std::vector<Timer*>* spTimers;
 	static void Reschedule();
 	
 	public: