implement CALLBACK and WRITE events
authorfhanik <fhanik@13f79535-47bb-0310-9956-ffa450edef68>
Thu, 31 May 2007 09:09:04 +0000 (09:09 +0000)
committerfhanik <fhanik@13f79535-47bb-0310-9956-ffa450edef68>
Thu, 31 May 2007 09:09:04 +0000 (09:09 +0000)
git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@543091 13f79535-47bb-0310-9956-ffa450edef68

java/org/apache/catalina/connector/CoyoteAdapter.java
java/org/apache/tomcat/util/net/NioEndpoint.java

index 2c58582..61c41b8 100644 (file)
@@ -169,6 +169,26 @@ public class CoyoteAdapter
                             request.getEvent().setEventSubType(null);
                         }
                     }
+                } else if (status == SocketStatus.OPEN_WRITE) {
+                    if (response.isClosed()) {
+                        // The event has been closed asynchronously, so call end instead of
+                        // read to cleanup the pipeline
+                        request.getEvent().setEventType(CometEvent.EventType.END);
+                        request.getEvent().setEventSubType(null);
+                    } else {
+                        request.getEvent().setEventType(CometEvent.EventType.WRITE);
+                        request.getEvent().setEventSubType(null);
+                    }
+                } else if (status == SocketStatus.OPEN_CALLBACK) {
+                    if (response.isClosed()) {
+                        // The event has been closed asynchronously, so call end instead of
+                        // read to cleanup the pipeline
+                        request.getEvent().setEventType(CometEvent.EventType.END);
+                        request.getEvent().setEventSubType(null);
+                    } else {
+                        request.getEvent().setEventType(CometEvent.EventType.CALLBACK);
+                        request.getEvent().setEventSubType(null);
+                    }
                 } else if (status == SocketStatus.DISCONNECT) {
                     request.getEvent().setEventType(CometEvent.EventType.ERROR);
                     request.getEvent().setEventSubType(CometEvent.EventSubType.CLIENT_DISCONNECT);
index 3f37b4a..9e0e3de 100644 (file)
@@ -1515,7 +1515,7 @@ public class NioEndpoint {
                             //check if thread is available
                             if ( isWorkerAvailable() ) {
                                 //set interest ops to 0 so we don't get multiple
-                                //invokations
+                                //invokations for both read and write on separate threads
                                 reg(sk, attachment, 0);
                                 //read goes before write
                                 if (sk.isReadable())
@@ -1617,6 +1617,10 @@ public class NioEndpoint {
                         cancelledKey(key, SocketStatus.ERROR,false); //we don't support any keys without attachments
                     } else if ( ka.getError() ) {
                         cancelledKey(key, SocketStatus.ERROR,true);
+                    } else if (ka.getComet() && ka.getCometNotify() ) {
+                        ka.setCometNotify(false);//this will get reset after invokation if callback is still in there
+                        reg(key,ka,0);//avoid multiple calls, this gets reregistered after invokation
+                        if (!processSocket(ka.getChannel(), SocketStatus.OPEN_CALLBACK)) processSocket(ka.getChannel(), SocketStatus.DISCONNECT);
                     }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();