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/01 16:37:23 UTC

svn commit: r481264 - in /incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq: connector/stomp/StompConnector.cpp connector/stomp/StompConnector.h exceptions/ActiveMQException.cpp transport/IOTransport.cpp transport/IOTransport.h

Author: nmittler
Date: Fri Dec  1 07:37:22 2006
New Revision: 481264

URL: http://svn.apache.org/viewvc?view=rev&rev=481264
Log:
[AMQCPP-20] - Fixing deadlock in asynchronous close

Modified:
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompConnector.cpp
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompConnector.h
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/exceptions/ActiveMQException.cpp
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/transport/IOTransport.cpp
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/transport/IOTransport.h

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompConnector.cpp
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompConnector.cpp?view=diff&rev=481264&r1=481263&r2=481264
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompConnector.cpp (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompConnector.cpp Fri Dec  1 07:37:22 2006
@@ -81,7 +81,7 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-StompConnector::~StompConnector(void)
+StompConnector::~StompConnector()
 {
     try
     {
@@ -94,7 +94,7 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-unsigned int StompConnector::getNextProducerId(void)
+unsigned int StompConnector::getNextProducerId()
 {
     synchronized( &mutex )
     {
@@ -105,7 +105,7 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-unsigned int StompConnector::getNextTransactionId(void)
+unsigned int StompConnector::getNextTransactionId()
 {
     synchronized( &mutex )
     {
@@ -116,7 +116,7 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-void StompConnector::enforceConnected( void ) throw ( ConnectorException )
+void StompConnector::enforceConnected() throw ( ConnectorException )
 {
     if( state != CONNECTED )
     {
@@ -142,7 +142,7 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-void StompConnector::start(void) throw( cms::CMSException )
+void StompConnector::start() throw( cms::CMSException )
 {
     try
     {
@@ -167,20 +167,22 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-void StompConnector::close(void) throw( cms::CMSException ){
+void StompConnector::close() throw( cms::CMSException ){
     
     try
     {
+        if( state == DISCONNECTED ){
+            return;
+        }
+        
         synchronized( &mutex )
-        {  
-            if( state == this->CONNECTED )
-            {
-                // Send the disconnect message to the broker.
-                disconnect();
+        {
+            // Send the disconnect message to the broker.
+            disconnect();
 
-                // Close the transport.
-                transport->close();
-            }
+            // Close the transport.
+            printf("StompConnector::close - about to close the transport\n");
+            transport->close();
         }
     }
     AMQ_CATCH_RETHROW( ActiveMQException )
@@ -188,12 +190,12 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-void StompConnector::connect(void)
+void StompConnector::connect()
 {
     try
     {
         // Mark this connector as started.
-        state = this->CONNECTING;
+        state = CONNECTING;
 
         // Send the connect command to the broker 
         ConnectCommand cmd;
@@ -268,12 +270,12 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-void StompConnector::disconnect(void)
+void StompConnector::disconnect()
 {
     try
     {
         // Mark state as no longer connected.
-        state = this->DISCONNECTED;
+        state = DISCONNECTED;
 
         // Send the disconnect command to the broker.
         DisconnectCommand cmd;
@@ -771,8 +773,11 @@
         // Inform the user.
         fire( ex );
         
+        // NOT closing here ... let the user close it through the connection
+        // class! 
+        
         // Close down.
-        close();
+        //close();
     }
     AMQ_CATCH_RETHROW( ConnectorException )
     AMQ_CATCHALL_THROW( ConnectorException );

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompConnector.h
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompConnector.h?view=diff&rev=481264&r1=481263&r2=481264
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompConnector.h (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompConnector.h Fri Dec  1 07:37:22 2006
@@ -129,12 +129,12 @@
          * Sends the connect message to the broker and
          * waits for the response.
          */
-        void connect(void);
+        void connect();
         
         /**
          * Sends a oneway disconnect message to the broker.
          */
-        void disconnect(void);
+        void disconnect();
         
         /**
          * Fires a consumer message to the observer.
@@ -175,26 +175,26 @@
                         const util::Properties& properties )
             throw ( exceptions::IllegalArgumentException );
 
-        virtual ~StompConnector(void);
+        virtual ~StompConnector();
         
         /**
          * Starts the service.
          * @throws CMSException
          */
-        virtual void start(void) throw( cms::CMSException );
+        virtual void start() throw( cms::CMSException );
         
         /**
          * Closes this object and deallocates the appropriate resources.
          * @throws CMSException
          */
-        virtual void close(void) throw( cms::CMSException );
+        virtual void close() throw( cms::CMSException );
 
         /**
          * Gets the Client Id for this connection, if this
          * connection has been closed, then this method returns ""
          * @return Client Id String
          */
-        virtual std::string getClientId(void) const {
+        virtual std::string getClientId() const {
             return properties.getProperty( 
                 core::ActiveMQConstants::toString( 
                     core::ActiveMQConstants::PARAM_CLIENTID ), "" );
@@ -205,7 +205,7 @@
          * connection has been closed, then this method returns ""
          * @return Username String
          */
-        virtual std::string getUsername(void) const {
+        virtual std::string getUsername() const {
             return properties.getProperty( 
                 core::ActiveMQConstants::toString( 
                     core::ActiveMQConstants::PARAM_USERNAME ), "" );
@@ -216,7 +216,7 @@
          * connection has been closed, then this method returns ""
          * @return Password String
          */
-        virtual std::string getPassword(void) const {
+        virtual std::string getPassword() const {
             return properties.getProperty( 
                 core::ActiveMQConstants::toString( 
                     core::ActiveMQConstants::PARAM_PASSWORD ), "" );
@@ -228,7 +228,7 @@
          * @return reference to a transport
          * @throws InvalidStateException if the Transport is not set
          */
-        virtual transport::Transport& getTransport(void) const 
+        virtual transport::Transport& getTransport() const 
             throw ( exceptions::InvalidStateException ) {
 
             if( transport == NULL ) {
@@ -535,11 +535,11 @@
         
     private:
     
-        unsigned int getNextProducerId(void);
-        unsigned int getNextTransactionId(void);
+        unsigned int getNextProducerId();
+        unsigned int getNextTransactionId();
 
         // Check for Connected State and Throw an exception if not.
-        void enforceConnected( void ) throw ( ConnectorException );
+        void enforceConnected() throw ( ConnectorException );
         
     };
 

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/exceptions/ActiveMQException.cpp
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/exceptions/ActiveMQException.cpp?view=diff&rev=481264&r1=481263&r2=481264
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/exceptions/ActiveMQException.cpp (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/exceptions/ActiveMQException.cpp Fri Dec  1 07:37:22 2006
@@ -53,8 +53,8 @@
         size *= 2;
     }
     
-    activemq::logger::SimpleLogger logger("com.yadda1");
-    logger.log( message );   
+    //activemq::logger::SimpleLogger logger("com.yadda1");
+    //logger.log( message );   
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -67,8 +67,8 @@
     stream << "\tFILE: " << stackTrace[stackTrace.size()-1].first;
     stream << ", LINE: " << stackTrace[stackTrace.size()-1].second;
                  
-    activemq::logger::SimpleLogger logger("com.yadda2");
-    logger.log( stream.str() );    
+    //activemq::logger::SimpleLogger logger("com.yadda2");
+    //logger.log( stream.str() );    
 }
 
 

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/transport/IOTransport.cpp
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/transport/IOTransport.cpp?view=diff&rev=481264&r1=481263&r2=481264
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/transport/IOTransport.cpp (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/transport/IOTransport.cpp Fri Dec  1 07:37:22 2006
@@ -26,6 +26,8 @@
 using namespace activemq::transport;
 using namespace activemq::concurrent;
 
+LOGCMS_INITIALIZE(logger, IOTransport, "activemq.transport.IOTransport" )
+
 ////////////////////////////////////////////////////////////////////////////////
 IOTransport::IOTransport(){
     
@@ -146,34 +148,45 @@
 ////////////////////////////////////////////////////////////////////////////////
 void IOTransport::run(){
     
-   try{
+    try{
         
-      while( !closed ){
+        while( !closed ){
                  
-         // Read the next command from the input stream.
-         Command* command = reader->readCommand();
+            // Read the next command from the input stream.
+            Command* command = reader->readCommand();
                             
-         // Notify the listener.
-         fire( command );      
-      }
-        
-   }catch( exceptions::ActiveMQException& ex ){
-        
-      ex.setMark( __FILE__, __LINE__ );
-
-      if( !closed ) {
-         fire( ex );
-      }
-   }
-   catch( ... ){
+            // Notify the listener.
+            fire( command );
+        }
         
-      if( !closed ) {
-         exceptions::ActiveMQException ex( 
-            __FILE__, __LINE__, 
-            "IOTransport::run - caught unknown exception" );
+    }
+    catch( activemq::io::IOException& ex ){
+
+        // This is expected for your typical broken socket - this
+        // is an error to be handled by the user, so let's not bother
+        // logging it - just inform the user through a callback.
+        ex.setMark( __FILE__, __LINE__ );        
+        fire( ex );
+    }
+    catch( exceptions::ActiveMQException& ex ){
 
-         fire( ex );
-      }
-   }
+        ex.setMark( __FILE__, __LINE__ );
+        
+        LOGCMS_WARN(logger, ex.getStackTraceString().c_str() )
+            
+        fire( ex );
+    }
+    catch( ... ){
+        
+        if( !closed ) {
+            exceptions::ActiveMQException ex( 
+                __FILE__, __LINE__, 
+                "IOTransport::run - caught unknown exception" );
+                
+            LOGCMS_WARN(logger, ex.getStackTraceString().c_str() )
+
+            fire( ex );
+        }
+    }
 }
 

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=481264&r1=481263&r2=481264
==============================================================================
--- 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 Fri Dec  1 07:37:22 2006
@@ -25,6 +25,7 @@
 #include <activemq/concurrent/Thread.h>
 #include <activemq/exceptions/ActiveMQException.h>
 #include <activemq/transport/Command.h>
+#include <activemq/logger/LoggerDefines.h>
 
 namespace activemq{
 namespace transport{
@@ -46,6 +47,9 @@
         public Transport,
         public concurrent::Runnable
     {
+        
+        LOGCMS_DECLARE( logger )
+        
     private:
         
         /**