Author: fhanik Date: Fri Aug 31 13:59:00 2007 New Revision: 571578 URL: http://svn.apache.org/viewvc?rev=571578&view=rev Log: Move back to original idea, use primitive int instead of enum, extremely inefficient using enums and arrays to hold them.
Modified: tomcat/trunk/java/org/apache/catalina/CometEvent.java tomcat/trunk/java/org/apache/catalina/connector/CometEventImpl.java tomcat/trunk/java/org/apache/catalina/connector/Request.java tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java tomcat/trunk/java/org/apache/tomcat/util/net/PollerInterest.java Modified: tomcat/trunk/java/org/apache/catalina/CometEvent.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/CometEvent.java?rev=571578&r1=571577&r2=571578&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/CometEvent.java (original) +++ tomcat/trunk/java/org/apache/catalina/CometEvent.java Fri Aug 31 13:59:00 2007 @@ -23,6 +23,7 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.nio.channels.SelectionKey; /** * The CometEvent interface. @@ -139,7 +140,7 @@ * asycnhronously, then issue a * register(OP_CALLBACK) immediately after this method has been invoked. * - * @see #register(CometOperation) + * @see #register(int) */ public void close() throws IOException; @@ -190,9 +191,14 @@ * OP_CALLBACK - receive a CALLBACK event from the container * OP_READ - receive a READ event when the connection has data to be read * OP_WRITE - receive a WRITE event when the connection is able to receive data to be written - * @see #register(CometOperations) + * @see #register(int) */ - public enum CometOperation {OP_CALLBACK, OP_READ, OP_WRITE}; + public static class CometOperation { + //currently map these to the same values as org.apache.tomcat.util.net.PollerInterest + public static final int OP_CALLBACK = 0x200; + public static final int OP_READ = SelectionKey.OP_READ; + public static final int OP_WRITE = SelectionKey.OP_WRITE; + }; /** * Registers the Comet connection with the container for IO and event notifications. @@ -203,22 +209,22 @@ * @see #EventType * @see #CometOperation */ - public void register(CometOperation... operations) throws IllegalStateException; + public void register(int operations) throws IllegalStateException; /** * Unregisters Comet operations for this CometConnection * @param operations CometOperation[] * @throws IllegalStateException */ - public void unregister(CometOperation... operations) throws IllegalStateException; + public void unregister(int operations) throws IllegalStateException; /** * Returns what the current IO notifications that the Comet * connection is registered for. - * @return CometOperations[] - * @see #register(CometOperations...) + * @return integer representing registered operations + * @see #register(int) */ - public CometOperation[] getRegisteredOps(); + public int getRegisteredOps(); /** * Returns true if the Comet connection is blocking or non blocking and you can write 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?rev=571578&r1=571577&r2=571578&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/CometEventImpl.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/CometEventImpl.java Fri Aug 31 13:59:00 2007 @@ -77,7 +77,7 @@ /** * Current set of operations */ - protected HashSet<CometOperation> cometOperations = new HashSet<CometOperation>(3); + protected int cometOperations = 0; /** * Blocking or not blocking @@ -97,7 +97,7 @@ request = null; response = null; blocking = true; - cometOperations.clear(); + cometOperations = 0; } public void setEventType(EventType eventType) { @@ -148,8 +148,8 @@ return response.isWriteable(); } - public boolean hasOp(CometEvent.CometOperation op) { - return cometOperations.contains(op); + public boolean hasOp(int op) { + return (cometOperations & op ) == op; } public void configureBlocking(boolean blocking) throws IllegalStateException { @@ -160,24 +160,24 @@ this.blocking = bool.get(); } - public void register(CometEvent.CometOperation... operations) throws IllegalStateException { + public void register(int operations) throws IllegalStateException { //add it to the registered set - cometOperations.addAll(Arrays.asList(operations)); - request.action(ActionCode.ACTION_COMET_REGISTER, translate(cometOperations.toArray(new CometOperation[0]))); + cometOperations = cometOperations | operations; + request.action(ActionCode.ACTION_COMET_REGISTER, translate(cometOperations)); } - public void unregister(CometOperation... operations) throws IllegalStateException { + public void unregister(int operations) throws IllegalStateException { //remove from the registered set - cometOperations.removeAll(Arrays.asList(operations)); - request.action(ActionCode.ACTION_COMET_REGISTER, translate(cometOperations.toArray(new CometOperation[0]))); + cometOperations = cometOperations & (~operations); + request.action(ActionCode.ACTION_COMET_REGISTER, translate(cometOperations)); } public boolean isBlocking() { return blocking; } - public CometOperation[] getRegisteredOps() { - return (CometOperation[])cometOperations.toArray(new CometOperation[0]); + public int getRegisteredOps() { + return cometOperations; } public String toString() { @@ -204,19 +204,8 @@ throw new IllegalStateException("The operation can only be performed when invoked by a Tomcat worker thread."); } - 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; + protected Integer translate(int op) { + return new Integer(op); } //inner class used to keep track if the current thread is a worker thread. Modified: tomcat/trunk/java/org/apache/catalina/connector/Request.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/Request.java?rev=571578&r1=571577&r2=571578&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/connector/Request.java (original) +++ tomcat/trunk/java/org/apache/catalina/connector/Request.java Fri Aug 31 13:59:00 2007 @@ -2268,7 +2268,7 @@ return bool.get(); } - public boolean hasOp(CometEvent.CometOperation op) { + public boolean hasOp(int op) { if ( !comet || getEvent()==null ) return false; return event.hasOp(op); } 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?rev=571578&r1=571577&r2=571578&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java (original) +++ tomcat/trunk/java/org/apache/coyote/http11/Http11NioProcessor.java Fri Aug 31 13:59:00 2007 @@ -1233,7 +1233,7 @@ } else if (actionCode == ActionCode.ACTION_COMET_END) { comet = false; } else if (actionCode == ActionCode.ACTION_COMET_REGISTER) { - int interest = getPollerInterest(param); + int interest = ((Integer)param).intValue(); NioEndpoint.KeyAttachment attach = (NioEndpoint.KeyAttachment)socket.getAttachment(false); attach.setCometOps(interest); //notify poller if not on a tomcat thread @@ -1248,31 +1248,14 @@ try { bool.set(inputBuffer.isReadable()); }catch ( IOException x ) { - throw new RuntimeException(x); + if (log.isDebugEnabled()) log.debug("Unable to check readability on NIO socket.",x); + bool.set(false); } } else if (actionCode == ActionCode.ACTION_COMET_WRITEABLE) { MutableBoolean bool = (MutableBoolean)param; bool.set(outputBuffer.isWritable()); } - } - - private int getPollerInterest(Object param) throws IllegalArgumentException { - if ( param == null || (!(param instanceof PollerInterest[])) ) - throw new IllegalArgumentException("Action parameter must be a PollerInterest[] object."); - int interest = 0; - 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/PollerInterest.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/PollerInterest.java?rev=571578&r1=571577&r2=571578&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/PollerInterest.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/PollerInterest.java Fri Aug 31 13:59:00 2007 @@ -17,10 +17,14 @@ package org.apache.tomcat.util.net; +import java.nio.channels.SelectionKey; + /** * Different poller inter * @author fhanik */ -public enum PollerInterest { - READ, WRITE, CALLBACK; +public class PollerInterest { + public static final int READ = SelectionKey.OP_READ; + public static final int WRITE = SelectionKey.OP_WRITE; + public static final int CALLBACK = NioEndpoint.OP_CALLBACK; } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]