From ca25c6c3fbdc3c04323546d2d14311537a5caad1 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 20 Dec 2012 08:46:57 -0800 Subject: [PATCH] Fix the crash on startup if instances are created before the instance tracking is initialized. --- src/cpp/ripple/InstanceCounter.cpp | 1 + src/cpp/ripple/InstanceCounter.h | 28 ++++++++++++++++++++++------ src/cpp/ripple/main.cpp | 1 + 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/cpp/ripple/InstanceCounter.cpp b/src/cpp/ripple/InstanceCounter.cpp index 5640102820..8f551dff37 100644 --- a/src/cpp/ripple/InstanceCounter.cpp +++ b/src/cpp/ripple/InstanceCounter.cpp @@ -1,6 +1,7 @@ #include "InstanceCounter.h" InstanceType* InstanceType::sHeadInstance = NULL; +bool InstanceType::sMultiThreaded = false; std::vector InstanceType::getInstanceCounts(int min) { diff --git a/src/cpp/ripple/InstanceCounter.h b/src/cpp/ripple/InstanceCounter.h index ffb3665f55..aaec9efcd7 100644 --- a/src/cpp/ripple/InstanceCounter.h +++ b/src/cpp/ripple/InstanceCounter.h @@ -32,6 +32,7 @@ protected: InstanceType* mNextInstance; static InstanceType* sHeadInstance; + static bool sMultiThreaded; public: typedef std::pair InstanceCount; @@ -42,17 +43,32 @@ public: 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() { - mLock.lock(); - ++mInstances; - mLock.unlock(); + if (sMultiThreaded) + { + mLock.lock(); + ++mInstances; + mLock.unlock(); + } + else ++mInstances; } void decInstance() { - mLock.lock(); - --mInstances; - mLock.unlock(); + if (sMultiThreaded) + { + mLock.lock(); + --mInstances; + mLock.unlock(); + } + else --mInstances; } int getCount() { diff --git a/src/cpp/ripple/main.cpp b/src/cpp/ripple/main.cpp index fa36067776..22355ad937 100644 --- a/src/cpp/ripple/main.cpp +++ b/src/cpp/ripple/main.cpp @@ -145,6 +145,7 @@ int main(int argc, char* argv[]) Log::setMinSeverity(lsTRACE, true); else Log::setMinSeverity(lsWARNING, true); + InstanceType::multiThread(); if (vm.count("test")) {