summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/agent
diff options
context:
space:
mode:
authorTed Ross <tross@apache.org>2008-07-16 20:25:12 +0000
committerTed Ross <tross@apache.org>2008-07-16 20:25:12 +0000
commit0742abc5e6831675aba58949d763fb4f819cde69 (patch)
tree806d768e89b6fec8d301396ec889a12f6c9e33e1 /cpp/src/qpid/agent
parent1848880ade63a0d2e2e9472a3fc231c52962dd78 (diff)
downloadqpid-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.h15
-rw-r--r--cpp/src/qpid/agent/ManagementAgentImpl.cpp34
-rw-r--r--cpp/src/qpid/agent/ManagementAgentImpl.h4
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",