diff options
| author | Ted Ross <tross@apache.org> | 2008-07-16 20:25:12 +0000 |
|---|---|---|
| committer | Ted Ross <tross@apache.org> | 2008-07-16 20:25:12 +0000 |
| commit | 0742abc5e6831675aba58949d763fb4f819cde69 (patch) | |
| tree | 806d768e89b6fec8d301396ec889a12f6c9e33e1 /cpp/src/qpid/agent | |
| parent | 1848880ade63a0d2e2e9472a3fc231c52962dd78 (diff) | |
| download | qpid-python-0742abc5e6831675aba58949d763fb4f819cde69.tar.gz | |
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
Diffstat (limited to 'cpp/src/qpid/agent')
| -rw-r--r-- | cpp/src/qpid/agent/ManagementAgent.h | 15 | ||||
| -rw-r--r-- | cpp/src/qpid/agent/ManagementAgentImpl.cpp | 34 | ||||
| -rw-r--r-- | cpp/src/qpid/agent/ManagementAgentImpl.h | 4 |
3 files changed, 43 insertions, 10 deletions
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", |
