diff options
author | Ted Ross <tross@apache.org> | 2009-11-03 21:08:58 +0000 |
---|---|---|
committer | Ted Ross <tross@apache.org> | 2009-11-03 21:08:58 +0000 |
commit | b6c399944995c33ac199bec28f81a43c0bb52eaa (patch) | |
tree | a92b0c45ba410ce8f8007d90887c92ae0804cf1d /qpid/cpp/src | |
parent | c93344c7da74411457a5eddd8cd2b4bf9e28a2d9 (diff) | |
download | qpid-python-b6c399944995c33ac199bec28f81a43c0bb52eaa.tar.gz |
QMF fixes:
- Added immediate notification of agent deletion
- Fixed some issues with memory management between the wrapped client and the ruby wrapper
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@832557 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src')
-rw-r--r-- | qpid/cpp/src/qmf/engine/ObjectImpl.h | 2 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/management/ManagementAgent.cpp | 34 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/management/ManagementAgent.h | 3 |
3 files changed, 35 insertions, 4 deletions
diff --git a/qpid/cpp/src/qmf/engine/ObjectImpl.h b/qpid/cpp/src/qmf/engine/ObjectImpl.h index ddd20bfea2..6f25867004 100644 --- a/qpid/cpp/src/qmf/engine/ObjectImpl.h +++ b/qpid/cpp/src/qmf/engine/ObjectImpl.h @@ -56,7 +56,7 @@ namespace engine { void destroy(); const ObjectId* getObjectId() const { return objectId.get(); } - void setObjectId(ObjectId* oid) { objectId.reset(oid); } + void setObjectId(ObjectId* oid) { objectId.reset(new ObjectId(*oid)); } const SchemaObjectClass* getClass() const { return objectClass; } Value* getValue(const std::string& key) const; void invokeMethod(const std::string& methodName, const Value* inArgs, void* context) const; diff --git a/qpid/cpp/src/qpid/management/ManagementAgent.cpp b/qpid/cpp/src/qpid/management/ManagementAgent.cpp index ae317512b8..2193ba4007 100644 --- a/qpid/cpp/src/qpid/management/ManagementAgent.cpp +++ b/qpid/cpp/src/qpid/management/ManagementAgent.cpp @@ -44,9 +44,11 @@ namespace _qmf = qmf::org::apache::qpid::broker; ManagementAgent::RemoteAgent::~RemoteAgent () { - if (mgmtObject != 0) - mgmtObject->resourceDestroy(); QPID_LOG(trace, "Remote Agent removed bank=[" << brokerBank << "." << agentBank << "]"); + if (mgmtObject != 0) { + mgmtObject->resourceDestroy(); + agent.deleteObjectNowLH(mgmtObject->getObjectId()); + } } ManagementAgent::ManagementAgent () : @@ -443,6 +445,32 @@ void ManagementAgent::periodicProcessing (void) } } +void ManagementAgent::deleteObjectNowLH(const ObjectId& oid) +{ + ManagementObjectMap::iterator iter = managementObjects.find(oid); + if (iter == managementObjects.end()) + return; + ManagementObject* object = iter->second; + if (!object->isDeleted()) + return; + +#define DNOW_BUFSIZE 2048 + char msgChars[DNOW_BUFSIZE]; + uint32_t contentSize; + Buffer msgBuffer(msgChars, DNOW_BUFSIZE); + + encodeHeader(msgBuffer, 'c'); + object->writeProperties(msgBuffer); + contentSize = msgBuffer.getPosition(); + msgBuffer.reset(); + stringstream key; + key << "console.obj.1.0." << object->getPackageName() << "." << object->getClassName(); + sendBuffer(msgBuffer, contentSize, mExchange, key.str()); + QPID_LOG(trace, "SEND Immediate(delete) ContentInd to=" << key.str()); + + managementObjects.erase(oid); +} + void ManagementAgent::sendCommandComplete (string replyToKey, uint32_t sequence, uint32_t code, string text) { @@ -871,7 +899,7 @@ void ManagementAgent::handleAttachRequestLH (Buffer& inBuffer, string replyToKey assignedBank = assignBankLH(requestedAgentBank); - RemoteAgent* agent = new RemoteAgent; + RemoteAgent* agent = new RemoteAgent(*this); agent->brokerBank = brokerBank; agent->agentBank = assignedBank; agent->routingKey = replyToKey; diff --git a/qpid/cpp/src/qpid/management/ManagementAgent.h b/qpid/cpp/src/qpid/management/ManagementAgent.h index d00dbf2b24..c64c073d8c 100644 --- a/qpid/cpp/src/qpid/management/ManagementAgent.h +++ b/qpid/cpp/src/qpid/management/ManagementAgent.h @@ -113,11 +113,13 @@ private: // struct RemoteAgent : public Manageable { + ManagementAgent& agent; uint32_t brokerBank; uint32_t agentBank; std::string routingKey; ObjectId connectionRef; qmf::org::apache::qpid::broker::Agent* mgmtObject; + RemoteAgent(ManagementAgent& _agent) : agent(_agent) {} ManagementObject* GetManagementObject (void) const { return mgmtObject; } virtual ~RemoteAgent (); }; @@ -212,6 +214,7 @@ private: void writeData (); void periodicProcessing (void); + void deleteObjectNowLH(const ObjectId& oid); void encodeHeader (framing::Buffer& buf, uint8_t opcode, uint32_t seq = 0); bool checkHeader (framing::Buffer& buf, uint8_t *opcode, uint32_t *seq); void sendBuffer (framing::Buffer& buf, |