Author: fhanik
Date: Thu May 31 01:48:01 2007
New Revision: 543086

URL: http://svn.apache.org/viewvc?view=rev&rev=543086
Log:
simplify register and poller interest for comet, all can be done in one call

Modified:
    tomcat/trunk/java/org/apache/catalina/connector/CometEventImpl.java
    tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java
    tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java

Modified: tomcat/trunk/java/org/apache/catalina/connector/CometEventImpl.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/CometEventImpl.java?view=diff&rev=543086&r1=543085&r2=543086
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/CometEventImpl.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/connector/CometEventImpl.java Thu May 
31 01:48:01 2007
@@ -28,6 +28,7 @@
 import org.apache.catalina.util.StringManager;
 import org.apache.coyote.ActionCode;
 import org.apache.tomcat.util.net.PollerInterest;
+import java.util.Arrays;
 
 public class CometEventImpl implements CometEvent {
 
@@ -160,23 +161,15 @@
     public void register(CometEvent.CometOperation... operations)
         throws IOException, IllegalStateException {
         //add it to the registered set
-        for (CometEvent.CometOperation co : operations) {
-            if (!cometOperations.contains(co)) {
-                cometOperations.add(co);
-                request.action(ActionCode.ACTION_COMET_REGISTER, 
translate(co));
-            }
-        }
+        cometOperations.addAll(Arrays.asList(operations));
+        request.action(ActionCode.ACTION_COMET_REGISTER, 
translate(cometOperations.toArray(new CometOperation[0])));
     }
 
     public void unregister(CometOperation... operations)
         throws IOException, IllegalStateException {
         //remove from the registered set
-        for (CometEvent.CometOperation co : operations) {
-            if (cometOperations.contains(co)) {
-                cometOperations.remove(co);
-                request.action(ActionCode.ACTION_COMET_UNREGISTER, 
translate(co));
-            }
-        }
+        cometOperations.removeAll(Arrays.asList(operations));
+        request.action(ActionCode.ACTION_COMET_UNREGISTER, 
translate(cometOperations.toArray(new CometOperation[0])));
     }
     
     public CometConfiguration[] getConfiguration() {
@@ -211,15 +204,19 @@
             throw new IllegalStateException("The operation can only be 
performed when invoked by a Tomcat worker thread.");
     }
     
-    protected PollerInterest translate(CometOperation op) {
-        if ( op == CometEvent.CometOperation.OP_READ )
-            return PollerInterest.READ;
-        else if ( op == CometEvent.CometOperation.OP_WRITE )
-            return PollerInterest.WRITE;
-        else if ( op == CometEvent.CometOperation.OP_CALLBACK )
-            return PollerInterest.CALLBACK;
-        else 
-            throw new IllegalArgumentException(op!=null?op.toString():"null");
+    protected PollerInterest[] translate(CometOperation... op) {
+        PollerInterest[] result = new PollerInterest[op.length];
+        for (int i=0; i<result.length; i++) {
+            if (op[i] == CometEvent.CometOperation.OP_READ)
+                result[i] = PollerInterest.READ;
+            else if (op[i] == CometEvent.CometOperation.OP_WRITE)
+                result[i] = PollerInterest.WRITE;
+            else if (op[i] == CometEvent.CometOperation.OP_CALLBACK)
+                result[i] = PollerInterest.CALLBACK;
+            else
+                throw new IllegalArgumentException(op != null ? op.toString() 
: "null");
+        }
+        return result;
     }
     
     //inner class used to keep track if the current thread is a worker thread.

Modified: tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java?view=diff&rev=543086&r1=543085&r2=543086
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java 
(original)
+++ tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java Thu May 
31 01:48:01 2007
@@ -1242,18 +1242,20 @@
     }
 
     private int getPollerInterest(Object param) throws 
IllegalArgumentException {
-        if ( param == null || (!(param instanceof PollerInterest)) )
-            throw new IllegalArgumentException("Action parameter must be a 
PollerInterest object.");
+        if ( param == null || (!(param instanceof PollerInterest[])) )
+            throw new IllegalArgumentException("Action parameter must be a 
PollerInterest[] object.");
         int interest = 0;
-        PollerInterest pi = (PollerInterest)param;
-        if ( pi == PollerInterest.CALLBACK )
-            interest = NioEndpoint.OP_CALLBACK;
-        else if ( pi == PollerInterest.READ ) 
-            interest  = SelectionKey.OP_READ;
-        else if ( pi == PollerInterest.WRITE ) 
-            interest = SelectionKey.OP_WRITE;
-        else
-            throw new IllegalArgumentException(pi!=null?pi.toString():"null");
+        PollerInterest[] piarr = (PollerInterest[])param;
+        for ( PollerInterest pi : piarr ) {
+            if (pi == PollerInterest.CALLBACK)
+                interest = interest | NioEndpoint.OP_CALLBACK;
+            else if (pi == PollerInterest.READ)
+                interest = interest | SelectionKey.OP_READ;
+            else if (pi == PollerInterest.WRITE)
+                interest = interest | SelectionKey.OP_WRITE;
+            else
+                throw new IllegalArgumentException(pi != null ? pi.toString() 
: "null");
+        }
         return interest;
     }
 

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java?view=diff&rev=543086&r1=543085&r2=543086
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Thu May 31 
01:48:01 2007
@@ -1324,6 +1324,10 @@
         public void cometInterest(NioChannel socket) {
             KeyAttachment att = (KeyAttachment)socket.getAttachment(false);
             add(socket,att.getCometOps());
+            if ( (att.getCometOps()&OP_CALLBACK) == OP_CALLBACK ) {
+                nextExpiration = 0; //force the check for faster callback
+                selector.wakeup();
+            }
         }
         
         public void wakeup() {
@@ -1510,9 +1514,14 @@
                         } else if ( attachment.getComet() ) {
                             //check if thread is available
                             if ( isWorkerAvailable() ) {
-                                unreg(sk, attachment, sk.readyOps());
-                                if (!processSocket(channel, 
SocketStatus.OPEN_READ))
-                                    processSocket(channel, 
SocketStatus.DISCONNECT);
+                                //set interest ops to 0 so we don't get 
multiple
+                                //invokations
+                                reg(sk, attachment, 0);
+                                //read goes before write
+                                if (sk.isReadable())
+                                    if (!processSocket(channel, 
SocketStatus.OPEN_READ)) processSocket(channel, SocketStatus.DISCONNECT);
+                                else
+                                    if (!processSocket(channel, 
SocketStatus.OPEN_WRITE)) processSocket(channel, SocketStatus.DISCONNECT);
                             } else {
                                 result = false;
                             }



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

Reply via email to