diff --git a/src/cpp/ripple/InstanceCounter.cpp b/src/cpp/ripple/InstanceCounter.cpp index 564010282..8f551dff3 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 ffb3665f5..aaec9efcd 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 fa3606777..22355ad93 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")) {