Author: tabish
Date: Mon Nov 30 21:31:14 2009
New Revision: 885586
URL: http://svn.apache.org/viewvc?rev=885586&view=rev
Log:
Fix a potential memory leak when IndividualAck is used.
Modified:
activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQConsumer.cpp
Modified:
activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQConsumer.cpp
URL:
http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQConsumer.cpp?rev=885586&r1=885585&r2=885586&view=diff
==============================================================================
---
activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQConsumer.cpp
(original)
+++
activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQConsumer.cpp
Mon Nov 30 21:31:14 2009
@@ -299,6 +299,19 @@
// Stop and Wakeup all sync consumers.
unconsumedMessages.close();
+ if( this->session->isIndividualAcknowledge() ) {
+ // For IndividualAck Mode we need to unlink the ack handler to
remove a
+ // cyclic reference to the MessageDispatch that brought the
message to us.
+ synchronized( &dispatchedMessages ) {
+ std::auto_ptr< Iterator< Pointer<MessageDispatch> > >
iter( this->dispatchedMessages.iterator() );
+ while( iter->hasNext() ) {
+ iter->next()->getMessage()->setAckHandler(
Pointer<ActiveMQAckHandler>() );
+ }
+
+ dispatchedMessages.clear();
+ }
+ }
+
// Remove this Consumer from the Connections set of Dispatchers
this->session->disposeOf( this->consumerInfo->getConsumerId(),
lastDeliveredSequenceId );