You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by nm...@apache.org on 2006/12/16 16:56:44 UTC

svn commit: r487819 - in /incubator/activemq/activemq-cpp/trunk/activemq-cpp/src: main/activemq/core/ main/activemq/transport/ test/activemq/core/ test/activemq/transport/

Author: nmittler
Date: Sat Dec 16 07:56:43 2006
New Revision: 487819

URL: http://svn.apache.org/viewvc?view=rev&rev=487819
Log:
[AMQCPP-26] Updates to fix memory leaks detected in unit tests by rational purify

Modified:
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQConnection.cpp
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQConnectionData.h
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/transport/IOTransport.h
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/core/ActiveMQConnectionFactoryTest.h
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/transport/IOTransportTest.h

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQConnection.cpp
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQConnection.cpp?view=diff&rev=487819&r1=487818&r2=487819
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQConnection.cpp (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQConnection.cpp Sat Dec 16 07:56:43 2006
@@ -101,13 +101,12 @@
         started = false;
         closed = true;
 
-        // Shutdown connector and transport
-        connectionData->getConnector()->close();
-        connectionData->getTransport()->close();
-
-        // Destroy the connection data
-        delete connectionData;
-        connectionData = NULL;
+        // Destroy the connection data.  This will close the connector
+        // and transports.
+        if( connectionData != NULL ){
+            delete connectionData;
+            connectionData = NULL;
+        }
     }
     AMQ_CATCH_RETHROW( ActiveMQException )
     AMQ_CATCHALL_THROW( ActiveMQException )

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQConnectionData.h
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQConnectionData.h?view=diff&rev=487819&r1=487818&r2=487819
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQConnectionData.h (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/core/ActiveMQConnectionData.h Sat Dec 16 07:56:43 2006
@@ -72,17 +72,75 @@
             this->properties = properties;
         }
         
-        virtual ~ActiveMQConnectionData(void) 
-        {
+        virtual ~ActiveMQConnectionData(){
+            close();
+        }
+        
+        virtual void close() throw (exceptions::ActiveMQException) {
+            
+            bool hasException = false;
+            exceptions::ActiveMQException e;
+            
             try
             {
-                connector->close();
-                delete connector;
+                if( connector != NULL ){
+                    
+                    try{
+                        connector->close();
+                    }catch( exceptions::ActiveMQException& ex ){                        
+                        if( !hasException ){
+                            hasException = true;
+                            ex.setMark(__FILE__, __LINE__ );
+                            e = ex;
+                        }
+                    }
+                    
+                    try{
+                        delete connector;
+                    }catch( exceptions::ActiveMQException& ex ){                        
+                        if( !hasException ){
+                            hasException = true;
+                            ex.setMark(__FILE__, __LINE__ );
+                            e = ex;
+                        }
+                    }
+                    connector = NULL;
+                }
+                
+                if( transport != NULL ){
+                    
+                    try{
+                        transport->close();
+                    }catch( exceptions::ActiveMQException& ex ){                        
+                        if( !hasException ){
+                            hasException = true;
+                            ex.setMark(__FILE__, __LINE__ );
+                            e = ex;
+                        }
+                    }
+                    
+                    try{
+                        delete transport;                        
+                    }catch( exceptions::ActiveMQException& ex ){                        
+                        if( !hasException ){
+                            hasException = true;
+                            ex.setMark(__FILE__, __LINE__ );
+                            e = ex;
+                        }
+                    }
+                    transport = NULL;
+                }
                 
-                transport->close();
-                delete transport;
+                if( properties != NULL ){
+                    delete properties;
+                    properties = NULL;
+                }
                 
-                delete properties;
+                // If we encountered an exception - throw the first
+                // one we encountered.
+                if( hasException ){
+                    throw e;
+                }
             }
             AMQ_CATCH_NOTHROW( exceptions::ActiveMQException )
             AMQ_CATCHALL_NOTHROW( )
@@ -92,7 +150,7 @@
          * Get the Connector that this Connection Data object holds
          * @return Connector Pointer
          */
-        virtual connector::Connector* getConnector(void){
+        virtual connector::Connector* getConnector(){
             return connector;
         }
 
@@ -100,7 +158,7 @@
          * Get the Connector that this Connection Data object holds
          * @return Connector Pointer
          */
-        virtual transport::Transport* getTransport(void){
+        virtual transport::Transport* getTransport(){
             return transport;
         }
 
@@ -109,7 +167,7 @@
          * this Connection.
          * @return Properties object reference.
          */
-        virtual const util::Properties& getProperties(void) const {
+        virtual const util::Properties& getProperties() const {
             return *properties;
         }
         

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/transport/IOTransport.h
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/transport/IOTransport.h?view=diff&rev=487819&r1=487818&r2=487819
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/transport/IOTransport.h (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/transport/IOTransport.h Sat Dec 16 07:56:43 2006
@@ -115,9 +115,15 @@
         void fire( Command* command ){
             
             try{
-                if( listener != NULL ){
-                    listener->onCommand( command );
+                // Since the listener is responsible for freeing the memory,
+                // if there is no listener - free the command here.
+                if( listener == NULL ){
+                    delete command;
+                    return;
                 }
+                
+                listener->onCommand( command );
+                
             }catch( ... ){}
         }
         

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/core/ActiveMQConnectionFactoryTest.h
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/core/ActiveMQConnectionFactoryTest.h?view=diff&rev=487819&r1=487818&r2=487819
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/core/ActiveMQConnectionFactoryTest.h (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/core/ActiveMQConnectionFactoryTest.h Sat Dec 16 07:56:43 2006
@@ -114,6 +114,9 @@
                 CPPUNIT_ASSERT( password == connector->getPassword() );
                 CPPUNIT_ASSERT( clientId == connector->getClientId() );
 
+                // Free the allocated connection object.
+                delete connection;
+                
                 return;
             }
             AMQ_CATCH_NOTHROW( exceptions::ActiveMQException )

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/transport/IOTransportTest.h
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/transport/IOTransportTest.h?view=diff&rev=487819&r1=487818&r2=487819
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/transport/IOTransportTest.h (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/transport/IOTransportTest.h Sat Dec 16 07:56:43 2006
@@ -105,7 +105,17 @@
                     
                     synchronized( inputStream ){
                         MyCommand* command = new MyCommand();
-                        command->c = inputStream->read();
+                        try{
+                            command->c = inputStream->read();
+                        } catch( exceptions::ActiveMQException& ex ){
+                            
+                            // Free the memory.
+                            delete command;
+                            
+                            ex.setMark( __FILE__, __LINE__ );
+                            throw ex;
+                        }
+                        
                         return command;
                     }