Fix the crash on startup if instances are created before the instance

tracking is initialized.
This commit is contained in:
JoelKatz
2012-12-20 08:46:57 -08:00
parent 8e201277a6
commit ca25c6c3fb
3 changed files with 24 additions and 6 deletions

View File

@@ -1,6 +1,7 @@
#include "InstanceCounter.h" #include "InstanceCounter.h"
InstanceType* InstanceType::sHeadInstance = NULL; InstanceType* InstanceType::sHeadInstance = NULL;
bool InstanceType::sMultiThreaded = false;
std::vector<InstanceType::InstanceCount> InstanceType::getInstanceCounts(int min) std::vector<InstanceType::InstanceCount> InstanceType::getInstanceCounts(int min)
{ {

View File

@@ -32,6 +32,7 @@ protected:
InstanceType* mNextInstance; InstanceType* mNextInstance;
static InstanceType* sHeadInstance; static InstanceType* sHeadInstance;
static bool sMultiThreaded;
public: public:
typedef std::pair<std::string, int> InstanceCount; typedef std::pair<std::string, int> InstanceCount;
@@ -42,17 +43,32 @@ public:
sHeadInstance = this; sHeadInstance = this;
} }
static void multiThread()
{
// We can support global objects and multi-threaded code, but not both
// at the same time. Switch to multi-threaded.
sMultiThreaded = true;
}
void addInstance() void addInstance()
{ {
mLock.lock(); if (sMultiThreaded)
++mInstances; {
mLock.unlock(); mLock.lock();
++mInstances;
mLock.unlock();
}
else ++mInstances;
} }
void decInstance() void decInstance()
{ {
mLock.lock(); if (sMultiThreaded)
--mInstances; {
mLock.unlock(); mLock.lock();
--mInstances;
mLock.unlock();
}
else --mInstances;
} }
int getCount() int getCount()
{ {

View File

@@ -145,6 +145,7 @@ int main(int argc, char* argv[])
Log::setMinSeverity(lsTRACE, true); Log::setMinSeverity(lsTRACE, true);
else else
Log::setMinSeverity(lsWARNING, true); Log::setMinSeverity(lsWARNING, true);
InstanceType::multiThread();
if (vm.count("test")) if (vm.count("test"))
{ {