From 7c48cf40a736b311f567276eebde75245394e36e Mon Sep 17 00:00:00 2001 From: fhanik Date: Thu, 31 May 2007 09:09:04 +0000 Subject: [PATCH] implement CALLBACK and WRITE events git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@543091 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/catalina/connector/CoyoteAdapter.java | 20 ++++++++++++++++++++ java/org/apache/tomcat/util/net/NioEndpoint.java | 6 +++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/java/org/apache/catalina/connector/CoyoteAdapter.java b/java/org/apache/catalina/connector/CoyoteAdapter.java index 2c58582ee..61c41b8c6 100644 --- a/java/org/apache/catalina/connector/CoyoteAdapter.java +++ b/java/org/apache/catalina/connector/CoyoteAdapter.java @@ -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); diff --git a/java/org/apache/tomcat/util/net/NioEndpoint.java b/java/org/apache/tomcat/util/net/NioEndpoint.java index 3f37b4aa2..9e0e3deca 100644 --- a/java/org/apache/tomcat/util/net/NioEndpoint.java +++ b/java/org/apache/tomcat/util/net/NioEndpoint.java @@ -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(); -- 2.11.0