summaryrefslogtreecommitdiff
path: root/qpid/cpp/src
diff options
context:
space:
mode:
authorTed Ross <tross@apache.org>2009-11-03 21:08:58 +0000
committerTed Ross <tross@apache.org>2009-11-03 21:08:58 +0000
commitb6c399944995c33ac199bec28f81a43c0bb52eaa (patch)
treea92b0c45ba410ce8f8007d90887c92ae0804cf1d /qpid/cpp/src
parentc93344c7da74411457a5eddd8cd2b4bf9e28a2d9 (diff)
downloadqpid-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.h2
-rw-r--r--qpid/cpp/src/qpid/management/ManagementAgent.cpp34
-rw-r--r--qpid/cpp/src/qpid/management/ManagementAgent.h3
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,