donaldp     2002/07/10 03:42:12

  Modified:    src/java/org/apache/avalon/cornerstone/blocks/connection
                        Connection.java
  Log:
  Potential fix for a threading bug. The problem occured when Thread1 [dispose() 
method] interrupted Thread2 [in run() method] and Thread2 managed to get to 
notifyAll() before Thread1 got to wait(). This could occur if Thread1 was interupted 
or Thread2 was already being "shutdown"  when Thread1 did the interrupt.
  
  Synchronization was added to the "shutdown" portion of thread 2 and the "interrupt" 
portion of Thread 1 to hopefully alleviate this problem.
  
  Reported By: [EMAIL PROTECTED]
  
  Revision  Changes    Path
  1.10      +11 -11    
jakarta-avalon-cornerstone/src/java/org/apache/avalon/cornerstone/blocks/connection/Connection.java
  
  Index: Connection.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-cornerstone/src/java/org/apache/avalon/cornerstone/blocks/connection/Connection.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- Connection.java   16 Mar 2002 00:18:33 -0000      1.9
  +++ Connection.java   10 Jul 2002 10:42:12 -0000      1.10
  @@ -142,16 +142,16 @@
       public void dispose()
           throws Exception
       {
  -        if( null != m_thread )
  +        synchronized( this )
           {
  -            m_thread.interrupt();
  -            m_thread = null;
  -            //Can not join as threads are part of pool
  -            //and will never finish
  -            //m_thread.join();
  -
  -            synchronized( this )
  +            if( null != m_thread )
               {
  +                m_thread.interrupt();
  +                m_thread = null;
  +                //Can not join as threads are part of pool
  +                //and will never finish
  +                //m_thread.join();
  +
                   wait( /*1000*/ );
               }
           }
  @@ -185,11 +185,11 @@
                   getLogger().warn( "Error shutting down connection", ioe );
               }
   
  -            m_thread = null;
  -            m_runners.remove( this );
  -
               synchronized( this )
               {
  +                m_thread = null;
  +                m_runners.remove( this );
  +
                   notifyAll();
               }
           }
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to