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 2022/02/18 00:14:35 UTC

[tomcat] 01/02: Align with 9.0.x - More PollerEvent refactoring

This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch 8.5.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit ceb38fed60e49a4b2d2ee62a6ea8de4b3a9e67bc
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Fri Feb 18 00:08:57 2022 +0000

    Align with 9.0.x - More PollerEvent refactoring
---
 java/org/apache/tomcat/util/net/NioEndpoint.java | 110 ++++++++++-------------
 1 file changed, 48 insertions(+), 62 deletions(-)

diff --git a/java/org/apache/tomcat/util/net/NioEndpoint.java b/java/org/apache/tomcat/util/net/NioEndpoint.java
index 5aae3f0..e17de3e 100644
--- a/java/org/apache/tomcat/util/net/NioEndpoint.java
+++ b/java/org/apache/tomcat/util/net/NioEndpoint.java
@@ -640,39 +640,33 @@ public class NioEndpoint extends AbstractJsseEndpoint<NioChannel,SocketChannel>
      */
     public static class PollerEvent {
 
-        private NioChannel socket;
         private NioSocketWrapper socketWrapper;
         private int interestOps;
 
-        public PollerEvent(NioChannel ch, NioSocketWrapper w, int intOps) {
-            reset(ch, w, intOps);
+        public PollerEvent(NioSocketWrapper socketWrapper, int intOps) {
+            reset(socketWrapper, intOps);
         }
 
-        public void reset(NioChannel ch, NioSocketWrapper w, int intOps) {
-            socket = ch;
+        public void reset(NioSocketWrapper socketWrapper, int intOps) {
+            this.socketWrapper = socketWrapper;
             interestOps = intOps;
-            socketWrapper = w;
         }
 
         public NioSocketWrapper getSocketWrapper() {
             return socketWrapper;
         }
 
-        public NioChannel getSocket() {
-            return socket;
-        }
-
         public int getInterestOps() {
             return interestOps;
         }
 
         public void reset() {
-            reset(null, null, 0);
+            reset(null, 0);
         }
 
         @Override
         public String toString() {
-            return "Poller event: socket [" + socket + "], socketWrapper [" + socketWrapper +
+            return "Poller event: socket [" + socketWrapper.getSocket() + "], socketWrapper [" + socketWrapper +
                     "], interestOps [" + interestOps + "]";
         }
     }
@@ -726,24 +720,23 @@ public class NioEndpoint extends AbstractJsseEndpoint<NioChannel,SocketChannel>
          * of time equal to pollTime (in most cases, latency will be much lower,
          * however).
          *
-         * @param socket to add to the poller
+         * @param socketWrapper to add to the poller
          * @param interestOps Operations for which to register this socket with
          *                    the Poller
          */
-        public void add(final NioChannel socket, final int interestOps) {
+        public void add(NioSocketWrapper socketWrapper, int interestOps) {
             PollerEvent r = null;
             if (eventCache != null) {
                 r = eventCache.pop();
             }
             if (r == null) {
-                r = new PollerEvent(socket,null,interestOps);
+                r = new PollerEvent(socketWrapper, interestOps);
             } else {
-                r.reset(socket,null,interestOps);
+                r.reset(socketWrapper, interestOps);
             }
             addEvent(r);
             if (close) {
-                NioEndpoint.NioSocketWrapper ka = (NioEndpoint.NioSocketWrapper)socket.getAttachment();
-                processSocket(ka, SocketEvent.STOP, false);
+                processSocket(socketWrapper, SocketEvent.STOP, false);
             }
         }
 
@@ -760,50 +753,43 @@ public class NioEndpoint extends AbstractJsseEndpoint<NioChannel,SocketChannel>
             for (int i = 0, size = events.size(); i < size && (pe = events.poll()) != null; i++ ) {
                 result = true;
                 NioSocketWrapper socketWrapper = pe.getSocketWrapper();
-                NioChannel socket = pe.getSocket();
+                SocketChannel sc = socketWrapper.getSocket().getIOChannel();
                 int interestOps = pe.getInterestOps();
-                try {
-                    if (interestOps == OP_REGISTER) {
-                        try {
-                            socket.getIOChannel().register(
-                                    socket.getPoller().getSelector(), SelectionKey.OP_READ, socketWrapper);
-                        } catch (Exception x) {
-                            log.error(sm.getString("endpoint.nio.registerFail"), x);
-                        }
+                if (interestOps == OP_REGISTER) {
+                    try {
+                        sc.register(getSelector(), SelectionKey.OP_READ, socketWrapper);
+                    } catch (Exception x) {
+                        log.error(sm.getString("endpoint.nio.registerFail"), x);
+                    }
+                } else {
+                    final SelectionKey key = sc.keyFor(getSelector());
+                    if (key == null) {
+                        // The key was cancelled (e.g. due to socket closure)
+                        // and removed from the selector while it was being
+                        // processed. Count down the connections at this point
+                        // since it won't have been counted down when the socket
+                        // closed.
+                        socketWrapper.getEndpoint().countDownConnection();
+                        ((NioSocketWrapper) socketWrapper).closed = true;
                     } else {
-                        final SelectionKey key = socket.getIOChannel().keyFor(socket.getPoller().getSelector());
-                        try {
-                            if (key == null) {
-                                // The key was cancelled (e.g. due to socket closure)
-                                // and removed from the selector while it was being
-                                // processed. Count down the connections at this point
-                                // since it won't have been counted down when the socket
-                                // closed.
-                                socket.socketWrapper.getEndpoint().countDownConnection();
-                                ((NioSocketWrapper) socket.socketWrapper).closed = true;
-                            } else {
-                                final NioSocketWrapper attachment = (NioSocketWrapper) key.attachment();
-                                if (attachment != null) {
-                                    //we are registering the key to start with, reset the fairness counter.
-                                    int ops = key.interestOps() | interestOps;
-                                    attachment.interestOps(ops);
-                                    key.interestOps(ops);
-                                } else {
-                                    socket.getPoller().cancelledKey(key);
-                                }
-                            }
-                        } catch (CancelledKeyException ckx) {
+                        final NioSocketWrapper attachment = (NioSocketWrapper) key.attachment();
+                        if (attachment != null) {
+                            // We are registering the key to start with, reset the fairness counter.
                             try {
-                                socket.getPoller().cancelledKey(key);
-                            } catch (Exception ignore) {}
+                                int ops = key.interestOps() | interestOps;
+                                attachment.interestOps(ops);
+                                key.interestOps(ops);
+                            } catch (CancelledKeyException ckx) {
+                                cancelledKey(key);
+                            }
+                        } else {
+                            cancelledKey(key);
                         }
                     }
-                    if (running && eventCache != null) {
-                        pe.reset();
-                        eventCache.push(pe);
-                    }
-                } catch ( Throwable x ) {
-                    log.error("",x);
+                }
+                if (running && eventCache != null) {
+                    pe.reset();
+                    eventCache.push(pe);
                 }
             }
 
@@ -831,9 +817,9 @@ public class NioEndpoint extends AbstractJsseEndpoint<NioChannel,SocketChannel>
                 event = eventCache.pop();
             }
             if (event == null) {
-                event = new PollerEvent(socket, ka, OP_REGISTER);
+                event = new PollerEvent(ka, OP_REGISTER);
             } else {
-                event.reset(socket, ka, OP_REGISTER);
+                event.reset(ka, OP_REGISTER);
             }
             addEvent(event);
         }
@@ -1094,7 +1080,7 @@ public class NioEndpoint extends AbstractJsseEndpoint<NioChannel,SocketChannel>
                         log.debug("OP_WRITE for sendfile: " + sd.fileName);
                     }
                     if (calledByProcessor) {
-                        add(socketWrapper.getSocket(), SelectionKey.OP_WRITE);
+                        add(socketWrapper, SelectionKey.OP_WRITE);
                     } else {
                         reg(sk, socketWrapper, SelectionKey.OP_WRITE);
                     }
@@ -1440,7 +1426,7 @@ public class NioEndpoint extends AbstractJsseEndpoint<NioChannel,SocketChannel>
             if (log.isDebugEnabled()) {
                 log.debug(sm.getString("endpoint.debug.registerRead", this));
             }
-            getPoller().add(getSocket(), SelectionKey.OP_READ);
+            getPoller().add(this, SelectionKey.OP_READ);
         }
 
 
@@ -1449,7 +1435,7 @@ public class NioEndpoint extends AbstractJsseEndpoint<NioChannel,SocketChannel>
             if (log.isDebugEnabled()) {
                 log.debug(sm.getString("endpoint.debug.registerWrite", this));
             }
-            getPoller().add(getSocket(), SelectionKey.OP_WRITE);
+            getPoller().add(this, SelectionKey.OP_WRITE);
         }
 
 

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