From 6599fdbc63a1759c3b17612eb458508f023166ed Mon Sep 17 00:00:00 2001 From: Stuart Longland Date: Fri, 10 Apr 2015 06:43:30 +1000 Subject: [PATCH] QAmqpClient: Add garbage collection slot. On 'destroyed', do a clean up of our exchanges and queues. --- src/qamqpclient.cpp | 22 ++++++++++++++++++++++ src/qamqpclient.h | 1 + src/qamqpclient_p.h | 5 +++++ 3 files changed, 28 insertions(+) diff --git a/src/qamqpclient.cpp b/src/qamqpclient.cpp index 67d379c..1b02516 100644 --- a/src/qamqpclient.cpp +++ b/src/qamqpclient.cpp @@ -551,6 +551,26 @@ void QAmqpClientPrivate::close(int code, const QString &text, int classId, int m sendFrame(frame); } +/*! + * Iterate through our list of objects and clean up the NULL pointers. + */ +void QAmqpClientPrivate::_q_objectDestroyed() +{ + /* Clean up Exchanges */ + QHash > exchanges(this->exchanges); + QHash >::iterator ex_it; + for (ex_it = exchanges.begin() ; ex_it != exchanges.end(); ex_it++) + if (ex_it.value.isNull()) + this->exchanges.remove(ex_it.key()); + + /* Clean up Queues */ + QHash > queues(this->queues); + QHash >::iterator q_it; + for (q_it = queues.begin() ; q_it != queues.end(); q_it++) + if (q_it.value.isNull()) + this->queues.remove(q_it.key()); +} + ////////////////////////////////////////////////////////////////////////// QAmqpClient::QAmqpClient(QObject *parent) @@ -668,6 +688,7 @@ QAmqpExchange *QAmqpClient::createExchange(const QString &name, int channelNumbe d->methodHandlersByChannel[exchange->channelNumber()].append(exchange->d_func()); connect(this, SIGNAL(connected()), exchange, SLOT(_q_open())); connect(this, SIGNAL(disconnected()), exchange, SLOT(_q_disconnected())); + connect(exchange, SIGNAL(destroyed()), this, SLOT(_q_objectDestroyed())); exchange->d_func()->open(); if (!name.isEmpty()) @@ -703,6 +724,7 @@ QAmqpQueue *QAmqpClient::createQueue(const QString &name, int channelNumber) d->bodyHandlersByChannel[queue->channelNumber()].append(queue->d_func()); connect(this, SIGNAL(connected()), queue, SLOT(_q_open())); connect(this, SIGNAL(disconnected()), queue, SLOT(_q_disconnected())); + connect(queue, SIGNAL(destroyed()), this, SLOT(_q_objectDestroyed())); queue->d_func()->open(); if (!name.isEmpty()) { diff --git a/src/qamqpclient.h b/src/qamqpclient.h index c6e90e4..9c180c9 100644 --- a/src/qamqpclient.h +++ b/src/qamqpclient.h @@ -133,6 +133,7 @@ private: Q_PRIVATE_SLOT(d_func(), void _q_heartbeat()) Q_PRIVATE_SLOT(d_func(), void _q_connect()) Q_PRIVATE_SLOT(d_func(), void _q_disconnect()) + Q_PRIVATE_SLOT(d_func(), void _q_objectDestroyed()) friend class QAmqpChannelPrivate; friend class QAmqpQueuePrivate; diff --git a/src/qamqpclient_p.h b/src/qamqpclient_p.h index b0e4ad4..f729135 100644 --- a/src/qamqpclient_p.h +++ b/src/qamqpclient_p.h @@ -51,6 +51,11 @@ public: virtual void _q_connect(); void _q_disconnect(); + /*! + * Iterate through our list of objects and clean up the NULL pointers. + */ + void _q_objectDestroyed(); + virtual bool _q_method(const QAmqpMethodFrame &frame); // method handlers, FROM server