You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2013/01/16 23:51:11 UTC

svn commit: r1434463 - /tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java

Author: markt
Date: Wed Jan 16 22:51:11 2013
New Revision: 1434463

URL: http://svn.apache.org/viewvc?rev=1434463&view=rev
Log:
APR/native refactoring
- Add an endpoint implementation specific SocketWrapper
- Track poller flags in new wrapper

Modified:
    tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=1434463&r1=1434462&r2=1434463&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Wed Jan 16 22:51:11 2013
@@ -99,8 +99,7 @@ public class AprEndpoint extends Abstrac
     protected ConcurrentLinkedQueue<SocketWrapper<Long>> waitingRequests =
             new ConcurrentLinkedQueue<>();
 
-    private Map<Long,SocketWrapper<Long>> connections =
-            new ConcurrentHashMap<>();
+    private Map<Long,AprSocketWrapper> connections = new ConcurrentHashMap<>();
 
     // ------------------------------------------------------------ Constructor
 
@@ -785,8 +784,8 @@ public class AprEndpoint extends Abstrac
         try {
             // During shutdown, executor may be null - avoid NPE
             if (running) {
-                SocketWrapper<Long> wrapper =
-                    new SocketWrapper<>(Long.valueOf(socket));
+                AprSocketWrapper wrapper =
+                        new AprSocketWrapper(Long.valueOf(socket));
                 wrapper.setKeepAliveLeft(getMaxKeepAliveRequests());
                 connections.put(Long.valueOf(socket), wrapper);
                 getExecutor().execute(new SocketWithOptionsProcessor(wrapper));
@@ -1548,8 +1547,7 @@ public class AprEndpoint extends Abstrac
                         // Ignore
                     }
                 }
-                // Check timeouts for suspended connections if the poller is
-                // empty
+                // Check timeouts if the poller is empty
                 while (connectionCount < 1 && addList.size() < 1) {
                     // Reset maintain time.
                     try {
@@ -1579,16 +1577,17 @@ public class AprEndpoint extends Abstrac
                         SocketInfo info = localAddList.get();
                         while (info != null) {
                             if (info.read() || info.write()) {
-                                boolean comet = connections.get(
-                                        Long.valueOf(info.socket)).isComet();
+                                AprSocketWrapper wrapper = connections.get(
+                                        Long.valueOf(info.socket));
+                                boolean comet = wrapper.isComet();
                                 // Store timeout
                                 if (comet) {
                                     removeFromPoller(info.socket);
                                 }
-                                int events =
+                                wrapper.pollerFlags = wrapper.pollerFlags |
                                         (info.read() ? Poll.APR_POLLIN : 0) |
                                         (info.write() ? Poll.APR_POLLOUT : 0);
-                                if (!addToPoller(info.socket, events)) {
+                                if (!addToPoller(info.socket, wrapper.pollerFlags)) {
                                     // Can't do anything: close the socket right
                                     // away
                                     if (!comet || (comet && !processSocket(
@@ -1628,8 +1627,11 @@ public class AprEndpoint extends Abstrac
                             connectionCount -= rv;
                             for (int n = 0; n < rv; n++) {
                                 timeouts.remove(desc[n*2+1]);
+                                AprSocketWrapper wrapper = connections.get(
+                                        Long.valueOf(desc[n*2+1]));
+                                wrapper.pollerFlags = wrapper.pollerFlags & ~((int) desc[n*2]);
                                 // Check for failed sockets and hand this socket off to a worker
-                                if (connections.get(Long.valueOf(desc[n*2+1])).isComet()) {
+                                if (wrapper.isComet()) {
                                     // Event processes either a read or a write depending on what the poller returns
                                     if (((desc[n*2] & Poll.APR_POLLHUP) == Poll.APR_POLLHUP)
                                             || ((desc[n*2] & Poll.APR_POLLERR) == Poll.APR_POLLERR)
@@ -2168,6 +2170,17 @@ public class AprEndpoint extends Abstrac
     }
 
 
+    private static class AprSocketWrapper extends SocketWrapper<Long> {
+
+        // This field should only be used by Poller#run()
+        private int pollerFlags = 0;
+
+        public AprSocketWrapper(Long socket) {
+            super(socket);
+        }
+    }
+
+
     private static class PrivilegedSetTccl implements PrivilegedAction<Void> {
 
         private ClassLoader cl;



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org