Author: fhanik
Date: Tue Mar 13 19:48:39 2007
New Revision: 517977

URL: http://svn.apache.org/viewvc?view=rev&rev=517977
Log:
Implemented the cache properly with its own attribute, removed one processor 
that is not needed

Modified:
    tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
    tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/SocketProperties.java
    tomcat/tc6.0.x/trunk/webapps/docs/config/http.xml

Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java?view=diff&rev=517977&r1=517976&r2=517977
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Tue 
Mar 13 19:48:39 2007
@@ -155,6 +155,40 @@
     protected ServerSocketChannel serverSock = null;
 
     /**
+     * Cache for SocketProcessor objects
+     */
+    protected ConcurrentLinkedQueue<SocketProcessor> processorCache = new 
ConcurrentLinkedQueue<SocketProcessor>() {
+        protected AtomicInteger size = new AtomicInteger(0);
+        public boolean offer(SocketProcessor sc) {
+            sc.reset(null,null);
+            boolean offer = 
socketProperties.getProcessorCache()==-1?true:size.get()<socketProperties.getProcessorCache();
+            //avoid over growing our cache or add after we have stopped
+            if ( running && (!paused) && (offer) ) {
+                boolean result = super.offer(sc);
+                if ( result ) {
+                    size.incrementAndGet();
+                }
+                return result;
+            }
+            else return false;
+        }
+        
+        public SocketProcessor poll() {
+            SocketProcessor result = super.poll();
+            if ( result != null ) {
+                size.decrementAndGet();
+            }
+            return result;
+        }
+        
+        public void clear() {
+            super.clear();
+            size.set(0);
+        }
+    };
+
+
+    /**
      * Cache for key attachment objects
      */
     protected ConcurrentLinkedQueue<KeyAttachment> keyCache = new 
ConcurrentLinkedQueue<KeyAttachment>() {
@@ -727,6 +761,7 @@
         eventCache.clear();
         keyCache.clear();
         nioChannels.clear();
+        processorCache.clear();
         if ( executor!=null ) {
             ThreadPoolExecutor tpe = (ThreadPoolExecutor)executor;
             tpe.shutdown();
@@ -977,19 +1012,7 @@
      * Process given socket.
      */
     protected boolean processSocket(NioChannel socket) {
-        try {
-            if (executor == null) {
-                getWorkerThread().assign(socket);
-            }  else {
-                executor.execute(new SocketProcessor(socket,null));
-            }
-        } catch (Throwable t) {
-            // This means we got an OOM or similar creating a thread, or that
-            // the pool and its queue are full
-            log.error(sm.getString("endpoint.process.fail"), t);
-            return false;
-        }
-        return true;
+        return processSocket(socket,null);
     }
 
 
@@ -1001,7 +1024,10 @@
             if (executor == null) {
                 getWorkerThread().assign(socket, status);
             } else {
-                executor.execute(new SocketProcessor(socket, status));
+                SocketProcessor sc = processorCache.poll();
+                if ( sc == null ) sc = new SocketProcessor(socket,status);
+                else sc.reset(socket,status);
+                executor.execute(sc);
             }
         } catch (Throwable t) {
             // This means we got an OOM or similar creating a thread, or that
@@ -1794,32 +1820,6 @@
     }
 
 
-    // ---------------------------------------------- SocketOptionsProcessor 
Inner Class
-
-
-    /**
-     * This class is the equivalent of the Worker, but will simply use in an
-     * external Executor thread pool.
-     */
-    protected class SocketOptionsProcessor implements Runnable {
-
-        protected SocketChannel sc = null;
-
-        public SocketOptionsProcessor(SocketChannel socket) {
-            this.sc = socket;
-        }
-
-        public void run() {
-            if ( !setSocketOptions(sc) ) {
-                try {
-                    sc.socket().close();
-                    sc.close();
-                }catch ( IOException ix ) {
-                    if ( log.isDebugEnabled() ) log.debug("",ix);
-                }
-            }
-        }
-    }
     // ---------------------------------------------- SocketProcessor Inner 
Class
 
 
@@ -1833,6 +1833,10 @@
         protected SocketStatus status = null; 
 
         public SocketProcessor(NioChannel socket, SocketStatus status) {
+            reset(socket,status);
+        }
+        
+        public void reset(NioChannel socket, SocketStatus status) {
             this.socket = socket;
             this.status = status;
         }
@@ -1850,10 +1854,11 @@
                 } catch ( Exception x ) {
                     log.error("",x);
                 }
-                socket = null;
-                status = null;
             }
-
+            socket = null;
+            status = null;
+            //return to cache
+            processorCache.offer(this);
         }
 
     }

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/SocketProperties.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/SocketProperties.java?view=diff&rev=517977&r1=517976&r2=517977
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/SocketProperties.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/SocketProperties.java 
Tue Mar 13 19:48:39 2007
@@ -26,18 +26,29 @@
  */
 public class SocketProperties {
     /**
-     * Enable/disable key cache, this bounced cache stores
+     * Enable/disable key cache, this bounded cache stores
      * KeyAttachment objects to reduce GC
-     * Default is 100
+     * Default is 500
      * -1 is unlimited
      * 0 is disabled
      */
     protected int keyCache = 500;
+    
+    /**
+     * Enable/disable socket processor cache, this bounded cache stores
+     * SocketProcessor objects to reduce GC
+     * Default is 500
+     * -1 is unlimited
+     * 0 is disabled
+     */
+    protected int processorCache = 500;
+
+
 
     /**
      * Enable/disable poller event cache, this bounded cache stores
      * PollerEvent objects to reduce GC for the poller
-     * Default is -1 (unlimited)
+     * Default is 500 
      * -1 is unlimited
      * 0 is disabled
      * >0 the max number of objects to keep in cache.
@@ -243,6 +254,10 @@
         return appWriteBufSize;
     }
 
+    public int getProcessorCache() {
+        return processorCache;
+    }
+
     public int getDirectBufferPool() {
         return bufferPool;
     }
@@ -325,6 +340,10 @@
 
     public void setAppWriteBufSize(int appWriteBufSize) {
         this.appWriteBufSize = appWriteBufSize;
+    }
+
+    public void setProcessorCache(int processorCache) {
+        this.processorCache = processorCache;
     }
 
     public void setDirectBufferPool(int directBufferPool) {

Modified: tomcat/tc6.0.x/trunk/webapps/docs/config/http.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/config/http.xml?view=diff&rev=517977&r1=517976&r2=517977
==============================================================================
--- tomcat/tc6.0.x/trunk/webapps/docs/config/http.xml (original)
+++ tomcat/tc6.0.x/trunk/webapps/docs/config/http.xml Tue Mar 13 19:48:39 2007
@@ -457,6 +457,12 @@
         The value is in bytes, the default value is 1024*1024*100 (100MB)
         </p>
       </attribute>
+      <attribute name="socket.processorCache" required="false">
+        <p>Tomcat will cache SocketProcessor objects to reduce garbage 
collection.
+           The integer value specifies how many objects to keep in the cache 
at most.
+           The default is 500.
+           Other values are -1. unlimited cache, and 0, no cache.</p>
+      </attribute>
       <attribute name="socket.keyCache" required="false">
         <p>Tomcat will cache KeyAttachment objects to reduce garbage 
collection.
            The integer value specifies how many objects to keep in the cache 
at most.



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

Reply via email to