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 2006/08/09 10:08:32 UTC

svn commit: r429987 - in /directory/trunks/mina/core/src/main/java/org/apache/mina/common: PooledThreadModel.java support/BaseIoServiceConfig.java

Author: trustin
Date: Wed Aug  9 01:08:32 2006
New Revision: 429987

URL: http://svn.apache.org/viewvc?rev=429987&view=rev
Log:
Fixed issue: DIRMINA-231 (SocketConnector thread leak)
* PooledThreadModel now manages the instances of PooledThreadModels, and therefore the number of PooledThreadModel per service never exceeds 1.

Modified:
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/PooledThreadModel.java
    directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/BaseIoServiceConfig.java

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/common/PooledThreadModel.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/common/PooledThreadModel.java?rev=429987&r1=429986&r2=429987&view=diff
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/PooledThreadModel.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/PooledThreadModel.java Wed Aug  9 01:08:32 2006
@@ -18,6 +18,9 @@
  */
 package org.apache.mina.common;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.mina.filter.thread.ThreadPool;
 import org.apache.mina.filter.thread.ThreadPoolFilter;
 
@@ -46,26 +49,46 @@
      */
     public static final int DEFAULT_KEEP_ALIVE_TIME = ThreadPool.DEFAULT_KEEP_ALIVE_TIME;
     
-    private static int id = 1;
+    /**
+     * Maps a service name to a PooledThreadModel instance.
+     * Without this map, we might create extremely many thread pools that leads the system to
+     * coma. */
+    private static final Map service2model = new HashMap();
     
-    private final ThreadPoolFilter filter = new ThreadPoolFilter();
-
-    public PooledThreadModel()
+    /**
+     * Returns a {@link PooledThreadModel} instance for the specified <tt>serviceName</tt>.
+     * @param serviceName the name of the service that needs thread pooling
+     */
+    public static PooledThreadModel getInstance( String serviceName )
     {
-        this( "AnonymousIoService-" + id++, DEFAULT_MAXIMUM_POOL_SIZE );
+    	if( serviceName == null )
+    	{
+    		throw new NullPointerException( "serviceName" );
+    	}
+
+    	PooledThreadModel model;
+    	synchronized( service2model )
+    	{
+    		model = ( PooledThreadModel ) service2model.get( serviceName );
+    		if( model == null )
+    		{
+    			model = new PooledThreadModel( serviceName );
+    			service2model.put( serviceName, model );
+    		}
+    	}
+    	
+    	return model;
     }
     
-    public PooledThreadModel( int maxThreads )
-    {
-        this( "AnonymousIoService-" + id++, maxThreads );
-    }
+    private final ThreadPoolFilter filter = new ThreadPoolFilter();
+    private final IoFilter proxy = new ReferenceCountingIoFilter( filter );
 
-    public PooledThreadModel( String threadNamePrefix )
+    private PooledThreadModel( String threadNamePrefix )
     {
         this( threadNamePrefix, DEFAULT_MAXIMUM_POOL_SIZE );
     }
 
-    public PooledThreadModel( String threadNamePrefix, int maxThreads )
+    private PooledThreadModel( String threadNamePrefix, int maxThreads )
     {
         setMaximumPoolSize( maxThreads );
         setThreadNamePrefix( threadNamePrefix );
@@ -103,6 +126,6 @@
 
     public void buildFilterChain( IoFilterChain chain ) throws Exception
     {
-        chain.addFirst( PooledThreadModel.class.getName(), filter );
+        chain.addFirst( PooledThreadModel.class.getName(), proxy );
     }
 }

Modified: directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/BaseIoServiceConfig.java
URL: http://svn.apache.org/viewvc/directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/BaseIoServiceConfig.java?rev=429987&r1=429986&r2=429987&view=diff
==============================================================================
--- directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/BaseIoServiceConfig.java (original)
+++ directory/trunks/mina/core/src/main/java/org/apache/mina/common/support/BaseIoServiceConfig.java Wed Aug  9 01:08:32 2006
@@ -39,7 +39,7 @@
      */
     private IoFilterChainBuilder filterChainBuilder = new DefaultIoFilterChainBuilder();
     
-    private final ThreadModel defaultThreadModel = new PooledThreadModel();
+    private final ThreadModel defaultThreadModel = PooledThreadModel.getInstance("AnonymousIoService");
     /**
      * Current thread model.
      */