You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by tr...@apache.org on 2005/08/23 03:01:45 UTC

svn commit: r239282 - in /directory/network: branches/0.7/src/java/org/apache/mina/util/BaseThreadPool.java trunk/src/java/org/apache/mina/filter/ThreadPoolFilter.java trunk/src/test/org/apache/mina/filter/ThreadPoolFilterRegressionTest.java

Author: trustin
Date: Mon Aug 22 18:01:39 2005
New Revision: 239282

URL: http://svn.apache.org/viewcvs?rev=239282&view=rev
Log:
Possible fix for DIRMINA-79 - The number of ThreadPoolFilter threads sometimes becomes 0.
* Fixed a bug that the thread can die when interrupted in Worker.waitForPromotion() and Worker.fetchBuffer()


Modified:
    directory/network/branches/0.7/src/java/org/apache/mina/util/BaseThreadPool.java
    directory/network/trunk/src/java/org/apache/mina/filter/ThreadPoolFilter.java
    directory/network/trunk/src/test/org/apache/mina/filter/ThreadPoolFilterRegressionTest.java

Modified: directory/network/branches/0.7/src/java/org/apache/mina/util/BaseThreadPool.java
URL: http://svn.apache.org/viewcvs/directory/network/branches/0.7/src/java/org/apache/mina/util/BaseThreadPool.java?rev=239282&r1=239281&r2=239282&view=diff
==============================================================================
--- directory/network/branches/0.7/src/java/org/apache/mina/util/BaseThreadPool.java (original)
+++ directory/network/branches/0.7/src/java/org/apache/mina/util/BaseThreadPool.java Mon Aug 22 18:01:39 2005
@@ -319,7 +319,14 @@
 
                 if( buf == null )
                 {
-                    break;
+                    if( shuttingDown )
+                    {
+                        break;
+                    }
+                    else
+                    {
+                        continue;
+                    }
                 }
 
                 processEvents( buf );
@@ -429,25 +436,41 @@
         {
             final Object promotionLock = this.promotionLock;
 
+            final long startTime = System.currentTimeMillis();
+            long currentTime = startTime;
+            
             synchronized( promotionLock )
             {
-                if( this != leader )
+                while( this != leader )
                 {
+                    // Calculate remaining keep-alive time
+                    int keepAliveTime = getKeepAliveTime();
+                    if( keepAliveTime > 0 )
+                    {
+                        keepAliveTime -= ( currentTime - startTime );
+                    }
+                    else
+                    {
+                        keepAliveTime = Integer.MAX_VALUE;
+                    }
+                    
+                    // Break the loop if there's no remaining keep-alive time.
+                    if( keepAliveTime <= 0 )
+                    {
+                        break;
+                    }
+
+                    // Wait for promotion
                     try
                     {
-                        int keepAliveTime = getKeepAliveTime();
-                        if( keepAliveTime > 0 )
-                        {
-                            promotionLock.wait( keepAliveTime );
-                        }
-                        else
-                        {
-                            promotionLock.wait();
-                        }
+                        promotionLock.wait( keepAliveTime );
                     }
                     catch( InterruptedException e )
                     {
                     }
+
+                    // Update currentTime for the next iteration
+                    currentTime = System.currentTimeMillis();
                 }
 
                 boolean timeToLead = this == leader;

Modified: directory/network/trunk/src/java/org/apache/mina/filter/ThreadPoolFilter.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/java/org/apache/mina/filter/ThreadPoolFilter.java?rev=239282&r1=239281&r2=239282&view=diff
==============================================================================
--- directory/network/trunk/src/java/org/apache/mina/filter/ThreadPoolFilter.java (original)
+++ directory/network/trunk/src/java/org/apache/mina/filter/ThreadPoolFilter.java Mon Aug 22 18:01:39 2005
@@ -285,7 +285,14 @@
 
                 if( buf == null )
                 {
-                    break;
+                    if( shuttingDown )
+                    {
+                        break;
+                    }
+                    else
+                    {
+                        continue;
+                    }
                 }
 
                 processEvents( buf );
@@ -395,25 +402,41 @@
         {
             final Object promotionLock = this.promotionLock;
 
+            long startTime = System.currentTimeMillis();
+            long currentTime = System.currentTimeMillis();
+            
             synchronized( promotionLock )
             {
-                if( this != leader )
+                while( this != leader )
                 {
+                    // Calculate remaining keep-alive time
+                    int keepAliveTime = getKeepAliveTime();
+                    if( keepAliveTime > 0 )
+                    {
+                        keepAliveTime -= ( currentTime - startTime );
+                    }
+                    else
+                    {
+                        keepAliveTime = Integer.MAX_VALUE;
+                    }
+                    
+                    // Break the loop if there's no remaining keep-alive time.
+                    if( keepAliveTime <= 0 )
+                    {
+                        break;
+                    }
+
+                    // Wait for promotion
                     try
                     {
-                        int keepAliveTime = getKeepAliveTime();
-                        if( keepAliveTime > 0 )
-                        {
-                            promotionLock.wait( keepAliveTime );
-                        }
-                        else
-                        {
-                            promotionLock.wait();
-                        }
+                        promotionLock.wait( keepAliveTime );
                     }
                     catch( InterruptedException e )
                     {
                     }
+
+                    // Update currentTime for the next iteration
+                    currentTime = System.currentTimeMillis();
                 }
 
                 boolean timeToLead = this == leader;

Modified: directory/network/trunk/src/test/org/apache/mina/filter/ThreadPoolFilterRegressionTest.java
URL: http://svn.apache.org/viewcvs/directory/network/trunk/src/test/org/apache/mina/filter/ThreadPoolFilterRegressionTest.java?rev=239282&r1=239281&r2=239282&view=diff
==============================================================================
--- directory/network/trunk/src/test/org/apache/mina/filter/ThreadPoolFilterRegressionTest.java (original)
+++ directory/network/trunk/src/test/org/apache/mina/filter/ThreadPoolFilterRegressionTest.java Mon Aug 22 18:01:39 2005
@@ -36,6 +36,7 @@
     public void tearDown()
     {
         filter.filterRemoved( FILTER_PARENT );
+        Assert.assertEquals( 0, filter.getPoolSize() );
         filter = null;
     }
     
@@ -57,6 +58,7 @@
         };
         final int end = sessions.length - 1;
         final ThreadPoolFilter filter = this.filter;
+        filter.setKeepAliveTime( 3000 );
         
         for( int i = 0; i < 1000000 ; i++ )
         {
@@ -72,6 +74,10 @@
                 throw nextFilter.throwable;
             }
         }
+        
+        Thread.sleep( 3500 );
+        
+        Assert.assertEquals( 1, filter.getPoolSize() );
     }
     
     private static class EventOrderCounter extends BaseIoSession