Author: fhanik
Date: Wed Aug  9 05:26:11 2006
New Revision: 430043

URL: http://svn.apache.org/viewvc?rev=430043&view=rev
Log:
Tune the connector, next step is to add the ability to have more than one 
poller, this is achievable by simply having each poller have its own selector, 
exactly like it is done today
Modified:
    
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalNioInputBuffer.java
    tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalNioInputBuffer.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalNioInputBuffer.java?rev=430043&r1=430042&r2=430043&view=diff
==============================================================================
--- 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalNioInputBuffer.java 
(original)
+++ 
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/InternalNioInputBuffer.java 
Wed Aug  9 05:26:11 2006
@@ -569,7 +569,7 @@
                         //to do, add in a check, we might have just timed out 
on the wait,
                         //so there is no need to register us again.
                         boolean addToQueue = false;
-                        try { addToQueue = 
((key.interestOps()&SelectionKey.OP_READ) != SelectionKey.OP_READ); } catch ( 
CancelledKeyException ckx ){ throw new IOException("Socket key cancelled.");}
+                        try { addToQueue = 
((att.interestOps()&SelectionKey.OP_READ) != SelectionKey.OP_READ); } catch ( 
CancelledKeyException ckx ){ throw new IOException("Socket key cancelled.");}
                         if ( addToQueue ) {
                             synchronized (att.getMutex()) {
                                 addToReadQueue(key, att);
@@ -591,7 +591,10 @@
             new Runnable() {
             public void run() {
                 try {
-                    if (key != null) key.interestOps(SelectionKey.OP_READ);
+                    if (key != null) {
+                        key.interestOps(SelectionKey.OP_READ);
+                        att.interestOps(SelectionKey.OP_READ);
+                    }
                 } catch (CancelledKeyException ckx) {
                     try {
                         if ( att != null ) {

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?rev=430043&r1=430042&r2=430043&view=diff
==============================================================================
--- 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 
Aug  9 05:26:11 2006
@@ -40,6 +40,8 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.tomcat.util.net.SecureNioChannel.ApplicationBufferHandler;
 import org.apache.tomcat.util.res.StringManager;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.atomic.AtomicLong;
 
 /**
  * NIO tailored thread pool, providing the following services:
@@ -868,12 +870,15 @@
     public class Poller implements Runnable {
 
         protected Selector selector;
-        protected LinkedList<Runnable> events = new LinkedList<Runnable>();
+        protected ConcurrentLinkedQueue events = new ConcurrentLinkedQueue();
+        
         protected boolean close = false;
         protected long nextExpiration = 0;//optimize expiration handling
 
         protected int keepAliveCount = 0;
         public int getKeepAliveCount() { return keepAliveCount; }
+        
+        protected AtomicLong wakeupCounter = new AtomicLong(0l);
 
 
 
@@ -909,10 +914,11 @@
         }
         
         public void addEvent(Runnable event) {
-            synchronized (events) {
-                events.add(event);
-            }
-            selector.wakeup();
+            //synchronized (events) {
+            //    events.add(event);
+            //}
+            events.offer(event);
+            if ( wakeupCounter.incrementAndGet() < 3 ) selector.wakeup();
         }
 
         /**
@@ -925,12 +931,15 @@
          */
         public void add(final NioChannel socket) {
             final SelectionKey key = socket.getIOChannel().keyFor(selector);
-            KeyAttachment att = (KeyAttachment)key.attachment();
+            final KeyAttachment att = (KeyAttachment)key.attachment();
             if ( att != null ) att.setWakeUp(false);
             Runnable r = new Runnable() {
                 public void run() {
                     try {
-                        if (key != null) key.interestOps(SelectionKey.OP_READ);
+                        if (key != null) {
+                            key.interestOps(SelectionKey.OP_READ);
+                            att.interestOps(SelectionKey.OP_READ);
+                        }
                     }catch ( CancelledKeyException ckx ) {
                         try {
                             if ( key != null && key.attachment() != null ) {
@@ -948,24 +957,23 @@
 
         public boolean events() {
             boolean result = false;
-            synchronized (events) {
+            //synchronized (events) {
                 Runnable r = null;
                 result = (events.size() > 0);
-                while ( (events.size() > 0) && (r = events.removeFirst()) != 
null ) {
+                while ( (r = (Runnable)events.poll()) != null ) {
                     try {
                         r.run();
                     } catch ( Exception x ) {
                         log.error("",x);
                     }
                 }
-                events.clear();
-            }
+                //events.clear();
+            //}
             return result;
         }
         
         public void register(final NioChannel socket)
         {
-            SelectionKey key = socket.getIOChannel().keyFor(selector);
             Runnable r = new Runnable() {
                 public void run() {
                     try {
@@ -1017,6 +1025,7 @@
 
                 int keyCount = 0;
                 try {
+                    wakeupCounter.set(0);
                     keyCount = selector.select(selectorTimeout);
                 } catch (Throwable x) {
                     log.error("",x);
@@ -1041,7 +1050,8 @@
                             attachment.access();
                             sk.attach(attachment);
                             int readyOps = sk.readyOps();
-                            sk.interestOps(sk.interestOps() & ~readyOps);
+                            sk.interestOps(0);
+                            attachment.interestOps(0);
                             NioChannel channel = attachment.getChannel();
                             if (sk.isReadable() || sk.isWritable() ) {
                                 if ( attachment.getWakeUp() ) {
@@ -1091,7 +1101,7 @@
                         cancelledKey(key); //we don't support any keys without 
attachments
                     } else if ( ka.getError() ) {
                         cancelledKey(key);
-                    }else if ((key.interestOps()&SelectionKey.OP_READ) == 
SelectionKey.OP_READ) {
+                    }else if ((ka.interestOps()&SelectionKey.OP_READ) == 
SelectionKey.OP_READ) {
                         //only timeout sockets that we are waiting for a read 
from
                         long delta = now - ka.getLastAccess();
                         long timeout = (ka.getTimeout()==-1)?((long) 
soTimeout):(ka.getTimeout());
@@ -1128,6 +1138,9 @@
         public void setError(boolean error) { this.error = error; }
         public NioChannel getChannel() { return channel;}
         public void setChannel(NioChannel channel) { this.channel = channel;}
+        protected int interestOps = 0;
+        public int interestOps() { return interestOps;}
+        public int interestOps(int ops) { this.interestOps  = ops; return ops; 
}
         protected Object mutex = new Object();
         protected boolean wakeUp = false;
         protected long lastAccess = System.currentTimeMillis();
@@ -1276,15 +1289,17 @@
                 } else {
                     final SelectionKey fk = key;
                     final int intops = handshake;
+                    final KeyAttachment ka = (KeyAttachment)fk.attachment();
                     //register for handshake ops
                     Runnable r = new Runnable() {
                         public void run() {
                             try {
                                 fk.interestOps(intops);
+                                ka.interestOps(intops);
                             } catch (CancelledKeyException ckx) {
                                 try {
                                     if ( fk != null && fk.attachment() != null 
) {
-                                        KeyAttachment ka = 
(KeyAttachment)fk.attachment();
+                                        
                                         ka.setError(true); //set to collect 
this socket immediately
                                         try 
{ka.getChannel().getIOChannel().socket().close();}catch(Exception ignore){}
                                         try 
{ka.getChannel().close();}catch(Exception ignore){}
@@ -1326,6 +1341,8 @@
         public NioBufferHandler(int readsize, int writesize) {
             readbuf = ByteBuffer.allocateDirect(readsize);
             writebuf = ByteBuffer.allocateDirect(writesize);
+//            readbuf = ByteBuffer.allocate(readsize);
+//            writebuf = ByteBuffer.allocate(writesize);
         }
         
         public ByteBuffer expand(ByteBuffer buffer, int remaining) {return 
buffer;}



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

Reply via email to