From 0742abc5e6831675aba58949d763fb4f819cde69 Mon Sep 17 00:00:00 2001 From: Ted Ross Date: Wed, 16 Jul 2008 20:25:12 +0000 Subject: QPID-1170 - Provide a better factory for creation and deletion of the management agent git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@677408 13f79535-47bb-0310-9956-ffa450edef68 --- cpp/src/qpid/agent/ManagementAgent.h | 15 +++++++++++-- cpp/src/qpid/agent/ManagementAgentImpl.cpp | 34 ++++++++++++++++++++++++------ cpp/src/qpid/agent/ManagementAgentImpl.h | 4 ++-- 3 files changed, 43 insertions(+), 10 deletions(-) (limited to 'cpp/src/qpid/agent') diff --git a/cpp/src/qpid/agent/ManagementAgent.h b/cpp/src/qpid/agent/ManagementAgent.h index 97fc827f2a..e7379e6c94 100644 --- a/cpp/src/qpid/agent/ManagementAgent.h +++ b/cpp/src/qpid/agent/ManagementAgent.h @@ -22,6 +22,7 @@ #include "qpid/management/ManagementObject.h" #include "qpid/management/Manageable.h" +#include "qpid/sys/Mutex.h" namespace qpid { namespace management { @@ -30,11 +31,21 @@ class ManagementAgent { public: + class Singleton { + public: + Singleton(bool disableManagement = false); + ~Singleton(); + static ManagementAgent* getInstance(); + private: + static sys::Mutex lock; + static bool disabled; + static int refCount; + static ManagementAgent* agent; + }; + ManagementAgent () {} virtual ~ManagementAgent () {} - static ManagementAgent* getAgent(); - virtual int getMaxThreads() = 0; // Connect to a management broker diff --git a/cpp/src/qpid/agent/ManagementAgentImpl.cpp b/cpp/src/qpid/agent/ManagementAgentImpl.cpp index 3c079a5a0a..5894aad404 100644 --- a/cpp/src/qpid/agent/ManagementAgentImpl.cpp +++ b/cpp/src/qpid/agent/ManagementAgentImpl.cpp @@ -33,14 +33,36 @@ using std::string; using std::cout; using std::endl; -ManagementAgent* ManagementAgent::getAgent() +Mutex ManagementAgent::Singleton::lock; +bool ManagementAgent::Singleton::disabled = false; +ManagementAgent* ManagementAgent::Singleton::agent = 0; +int ManagementAgent::Singleton::refCount = 0; + +ManagementAgent::Singleton::Singleton(bool disableManagement) { - //static ManagementAgent* agent = 0; + Mutex::ScopedLock _lock(lock); + if (disableManagement && !disabled) { + disabled = true; + assert(refCount == 0); // can't disable after agent has been allocated + } + if (refCount == 0 && !disabled) + agent = new ManagementAgentImpl(); + refCount++; +} - //if (agent == 0) - // agent = new ManagementAgentImpl(); - //return agent; - return 0; +ManagementAgent::Singleton::~Singleton() +{ + Mutex::ScopedLock _lock(lock); + refCount--; + if (refCount == 0 && !disabled) { + delete agent; + agent = 0; + } +} + +ManagementAgent* ManagementAgent::Singleton::getInstance() +{ + return agent; } ManagementAgentImpl::ManagementAgentImpl() : diff --git a/cpp/src/qpid/agent/ManagementAgentImpl.h b/cpp/src/qpid/agent/ManagementAgentImpl.h index b7572fe833..2ecf63cd5d 100644 --- a/cpp/src/qpid/agent/ManagementAgentImpl.h +++ b/cpp/src/qpid/agent/ManagementAgentImpl.h @@ -41,8 +41,8 @@ class ManagementAgentImpl : public ManagementAgent, public client::MessageListen { public: - ManagementAgentImpl (); - virtual ~ManagementAgentImpl (); + ManagementAgentImpl(); + virtual ~ManagementAgentImpl(); int getMaxThreads() { return 1; } void init(std::string brokerHost = "localhost", -- cgit v1.2.1