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/management | |
| 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/management')
| -rw-r--r-- | cpp/src/qpid/management/ManagementBroker.cpp | 109 | ||||
| -rw-r--r-- | cpp/src/qpid/management/ManagementBroker.h | 7 |
2 files changed, 66 insertions, 50 deletions
diff --git a/cpp/src/qpid/management/ManagementBroker.cpp b/cpp/src/qpid/management/ManagementBroker.cpp index 84e0c650f2..f66b34c43c 100644 --- a/cpp/src/qpid/management/ManagementBroker.cpp +++ b/cpp/src/qpid/management/ManagementBroker.cpp @@ -38,25 +38,83 @@ using namespace qpid::broker; using namespace qpid::sys; using namespace std; -ManagementAgent* ManagementBroker::agent; -bool ManagementBroker::enabled = 0; +Mutex ManagementAgent::Singleton::lock; +bool ManagementAgent::Singleton::disabled = false; +ManagementAgent* ManagementAgent::Singleton::agent = 0; +int ManagementAgent::Singleton::refCount = 0; + +ManagementAgent::Singleton::Singleton(bool disableManagement) +{ + 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 ManagementBroker(); + refCount++; +} + +ManagementAgent::Singleton::~Singleton() +{ + Mutex::ScopedLock _lock(lock); + refCount--; + if (refCount == 0 && !disabled) { + delete agent; + agent = 0; + } +} + +ManagementAgent* ManagementAgent::Singleton::getInstance() +{ + return agent; +} ManagementBroker::RemoteAgent::~RemoteAgent () { if (mgmtObject != 0) - mgmtObject->resourceDestroy (); + mgmtObject->resourceDestroy(); } -ManagementBroker::ManagementBroker (string _dataDir, uint16_t _interval, Manageable* _broker, int _threads) : - threadPoolSize(_threads), dataDir(_dataDir), interval(_interval), broker(_broker) +ManagementBroker::ManagementBroker () : + threadPoolSize(1), interval(10), broker(0) { - timer.add (intrusive_ptr<TimerTask> (new Periodic(*this, interval))); localBank = 5; nextObjectId = 1; bootSequence = 1; nextRemoteBank = 10; nextRequestSequence = 1; clientWasAdded = false; +} + +ManagementBroker::~ManagementBroker () +{ + Mutex::ScopedLock lock (userLock); + + // Reset the shared pointers to exchanges. If this is not done now, the exchanges + // will stick around until dExchange and mExchange are implicitely destroyed (long + // after this destructor completes). Those exchanges hold references to management + // objects that will be invalid. + dExchange.reset(); + mExchange.reset(); + + moveNewObjectsLH(); + for (ManagementObjectMap::iterator iter = managementObjects.begin (); + iter != managementObjects.end (); + iter++) { + ManagementObject* object = iter->second; + delete object; + } + managementObjects.clear(); +} + +void ManagementBroker::configure(string _dataDir, uint16_t _interval, Manageable* _broker, int _threads) +{ + dataDir = _dataDir; + interval = _interval; + broker = _broker; + threadPoolSize = _threads; + timer.add (intrusive_ptr<TimerTask> (new Periodic(*this, interval))); // Get from file or generate and save to file. if (dataDir.empty ()) @@ -92,20 +150,6 @@ ManagementBroker::ManagementBroker (string _dataDir, uint16_t _interval, Managea } } -ManagementBroker::~ManagementBroker () -{ - Mutex::ScopedLock lock (userLock); - - moveNewObjectsLH(); - for (ManagementObjectMap::iterator iter = managementObjects.begin (); - iter != managementObjects.end (); - iter++) { - ManagementObject* object = iter->second; - delete object; - } - managementObjects.clear(); -} - void ManagementBroker::writeData () { string filename (dataDir + "/.mbrokerdata"); @@ -118,31 +162,6 @@ void ManagementBroker::writeData () } } -void ManagementBroker::enableManagement (string dataDir, uint16_t interval, Manageable* broker, int threadPoolSize) -{ - enabled = 1; - if (agent == 0) - agent = new ManagementBroker (dataDir, interval, broker, threadPoolSize); -} - -ManagementAgent* ManagementAgent::getAgent (void) -{ - return ManagementBroker::agent; -} - -void ManagementBroker::shutdown (void) -{ - if (agent != 0) - { - ManagementBroker* broker = (ManagementBroker*) agent; - - broker->mExchange.reset (); - broker->dExchange.reset (); - delete agent; - agent = 0; - } -} - void ManagementBroker::setExchange (broker::Exchange::shared_ptr _mexchange, broker::Exchange::shared_ptr _dexchange) { diff --git a/cpp/src/qpid/management/ManagementBroker.h b/cpp/src/qpid/management/ManagementBroker.h index 685b7db977..447720fb5e 100644 --- a/cpp/src/qpid/management/ManagementBroker.h +++ b/cpp/src/qpid/management/ManagementBroker.h @@ -39,17 +39,14 @@ class ManagementBroker : public ManagementAgent { private: - ManagementBroker (std::string dataDir, uint16_t interval, Manageable* broker, int threadPoolSize); int threadPoolSize; public: + ManagementBroker (); virtual ~ManagementBroker (); - static void enableManagement (std::string dataDir, uint16_t interval, Manageable* broker, int threadPoolSize); - static ManagementAgent* getAgent (void); - static void shutdown (void); - + void configure (std::string dataDir, uint16_t interval, Manageable* broker, int threadPoolSize); void setInterval (uint16_t _interval) { interval = _interval; } void setExchange (broker::Exchange::shared_ptr mgmtExchange, broker::Exchange::shared_ptr directExchange); |
