Author: fhanik
Date: Wed Oct 25 16:20:35 2006
New Revision: 467808

URL: http://svn.apache.org/viewvc?view=rev&rev=467808
Log:
Zero GC objects. everything gets cached.

Modified:
    tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java

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=467808&r1=467807&r2=467808
==============================================================================
--- 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 Wed 
Oct 25 16:20:35 2006
@@ -97,7 +97,7 @@
      */
     public static final String SESSION_ID_KEY = 
"javax.servlet.request.ssl_session";
 
-
+    public static final int OP_REGISTER = -1; //register interest op
     // ----------------------------------------------------------------- Fields
 
 
@@ -149,7 +149,19 @@
      */
     protected ServerSocketChannel serverSock = null;
 
+    /**
+     * Cache for key attachment objects
+     */
+    protected ConcurrentLinkedQueue<KeyAttachment> keyCache = new 
ConcurrentLinkedQueue<KeyAttachment>();
+    
+    /**
+     * Cache for poller events
+     */
+    protected ConcurrentLinkedQueue<PollerEvent> eventCache = new 
ConcurrentLinkedQueue<PollerEvent>();
 
+    /**
+     * Bytebuffer cache, each channel holds a set of buffers (two, except for 
SSL holds four)
+     */
     protected ConcurrentLinkedQueue<NioChannel> nioChannels = new 
ConcurrentLinkedQueue<NioChannel>() {
         protected AtomicInteger size = new AtomicInteger(0);
         protected AtomicInteger bytes = new AtomicInteger(0);
@@ -158,7 +170,7 @@
             Selector sel = pol!=null?pol.getSelector():null;
             SelectionKey key = 
sel!=null?socket.getIOChannel().keyFor(sel):null;
             KeyAttachment att = key!=null?(KeyAttachment)key.attachment():null;
-            if ( att!=null ) att.reset();
+            if ( att!=null ) { att.reset(); keyCache.offer(att); }
             if ( key!=null ) key.attach(null);
             boolean offer = 
socketProperties.getBufferPool()==-1?true:size.get()<socketProperties.getBufferPool();
             offer = offer && 
(socketProperties.getBufferPoolSize()==-1?true:(bytes.get()+socket.getBufferSize())<socketProperties.getBufferPoolSize());
@@ -643,6 +655,8 @@
             }
             pollers = null;
         }
+        eventCache.clear();
+        keyCache.clear();
         nioChannels.clear();
     }
 
@@ -969,46 +983,57 @@
      * PollerEvent, cacheable object for poller events to avoid GC
      */
     public class PollerEvent implements Runnable {
+        
         protected NioChannel socket;
         protected int interestOps;
-        public PollerEvent(NioChannel ch, int intOps) {
-            reset(ch, intOps);
+        protected KeyAttachment key;
+        public PollerEvent(NioChannel ch, KeyAttachment k, int intOps) {
+            reset(ch, k, intOps);
         }
     
-        public void reset(NioChannel ch, int intOps) {
+        public void reset(NioChannel ch, KeyAttachment k, int intOps) {
             socket = ch;
             interestOps = intOps;
+            key = k;
         }
     
         public void reset() {
-            reset(null, 0);
+            reset(null, null, 0);
         }
     
         public void run() {
-            final SelectionKey key = 
socket.getIOChannel().keyFor(socket.getPoller().getSelector());
-            final KeyAttachment att = (KeyAttachment) key.attachment();
-            try {
-                if (key != null) {
-                    key.interestOps(interestOps);
-                    att.interestOps(interestOps);
+            if ( interestOps == OP_REGISTER ) {
+                try {
+                    
socket.getIOChannel().register(socket.getPoller().getSelector(), 
SelectionKey.OP_READ, key);
+                } catch (Exception x) {
+                    log.error("", x);
                 }
-            }
-            catch (CancelledKeyException ckx) {
+            } else {
+                final SelectionKey key = 
socket.getIOChannel().keyFor(socket.getPoller().getSelector());
+                final KeyAttachment att = (KeyAttachment) key.attachment();
                 try {
-                    if (key != null && key.attachment() != null) {
-                        KeyAttachment ka = (KeyAttachment) key.attachment();
-                        ka.setError(true); //set to collect this socket 
immediately
+                    if (key != null) {
+                        key.interestOps(interestOps);
+                        att.interestOps(interestOps);
                     }
+                }
+                catch (CancelledKeyException ckx) {
                     try {
-                        socket.close();
+                        if (key != null && key.attachment() != null) {
+                            KeyAttachment ka = (KeyAttachment) 
key.attachment();
+                            ka.setError(true); //set to collect this socket 
immediately
+                        }
+                        try {
+                            socket.close();
+                        }
+                        catch (Exception ignore) {}
+                        if (socket.isOpen())
+                            socket.close(true);
                     }
                     catch (Exception ignore) {}
-                    if (socket.isOpen())
-                        socket.close(true);
                 }
-                catch (Exception ignore) {}
-            }
-        }
+            }//end if
+        }//run
     }
     /**
      * Poller class.
@@ -1017,7 +1042,6 @@
 
         protected Selector selector;
         protected ConcurrentLinkedQueue<Runnable> events = new 
ConcurrentLinkedQueue<Runnable>();
-        protected ConcurrentLinkedQueue<PollerEvent> eventCache = new 
ConcurrentLinkedQueue<PollerEvent>();
         
         protected boolean close = false;
         protected long nextExpiration = 0;//optimize expiration handling
@@ -1051,6 +1075,7 @@
             // exit, otherwise parallel descturction of sockets which are still
             // in the poller can cause problems
             close = true;
+            events.clear();
             selector.wakeup();
         }
         
@@ -1072,8 +1097,9 @@
         }
         
         public void add(final NioChannel socket, final int interestOps) {
-            PollerEvent r = this.eventCache.poll();
-            if ( r==null) r = new PollerEvent(socket,interestOps);
+            PollerEvent r = eventCache.poll();
+            if ( r==null) r = new PollerEvent(socket,null,interestOps);
+            else r.reset(socket,null,interestOps);
             addEvent(r);
         }
         
@@ -1101,18 +1127,12 @@
         public void register(final NioChannel socket)
         {
             socket.setPoller(this);
-            final KeyAttachment ka = new KeyAttachment(this);
-            ka.setChannel(socket);
-            Runnable r = new Runnable() {
-                public void run() {
-                    try {
-                        socket.getIOChannel().register(selector, 
SelectionKey.OP_READ, ka);
-                    } catch (Exception x) {
-                        log.error("", x);
-                    }
-                }
-    
-            };
+            KeyAttachment key = keyCache.poll();
+            final KeyAttachment ka = key!=null?key:new KeyAttachment();
+            ka.reset(this,socket);
+            PollerEvent r = eventCache.poll();
+            if ( r==null) r = new PollerEvent(socket,ka,OP_REGISTER);
+            else r.reset(socket,ka,OP_REGISTER);
             addEvent(r);
         }
         
@@ -1157,6 +1177,7 @@
                 try {
                     wakeupCounter.set(0);
                     keyCount = selector.select(selectorTimeout);
+                    if ( close ) { selector.close(); return; }
                 } catch ( NullPointerException x ) {
                     //sun bug 5076772 on windows JDK 1.5
                     if ( wakeupCounter == null || selector == null ) throw x;
@@ -1169,12 +1190,9 @@
                     log.error("",x);
                     continue;
                 }
-
                 //either we timed out or we woke up, process events first
                 if ( keyCount == 0 ) hasEvents = (hasEvents | events());
 
-                //if (keyCount == 0) continue;
-
                 Iterator iterator = keyCount > 0 ? 
selector.selectedKeys().iterator() : null;
                 // Walk through the collection of ready keys and dispatch
                 // any active event.
@@ -1256,18 +1274,23 @@
     
     public static class KeyAttachment {
         
-        public KeyAttachment(Poller poller) {
-            this.poller = poller;
+        public KeyAttachment() {
+            
         }
-        public void reset() {
-            //mutex = new Object();
+        public void reset(Poller poller, NioChannel channel) {
+            this.channel = channel;
+            this.poller = poller;
             lastAccess = System.currentTimeMillis();
             currentAccess = false;
             comet = false;
             timeout = -1;
             error = false;
-            channel = null;
         }
+        
+        public void reset() {
+            reset(null,null);
+        }
+        
         public Poller getPoller() { return poller;}
         public void setPoller(Poller poller){this.poller = poller;}
         public long getLastAccess() { return lastAccess; }
@@ -1289,7 +1312,7 @@
         public int interestOps() { return interestOps;}
         public int interestOps(int ops) { this.interestOps  = ops; return ops; 
}
         protected Object mutex = new Object();
-        protected long lastAccess = System.currentTimeMillis();
+        protected long lastAccess = -1;
         protected boolean currentAccess = false;
         protected boolean comet = false;
         protected long timeout = -1;



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

Reply via email to