Author: remm
Date: Mon Sep 14 14:44:06 2015
New Revision: 1702962

URL: http://svn.apache.org/r1702962
Log:
Similar to NIO2, async NIO sendfile needs to deallocate and recycle the buffer.

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

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java?rev=1702962&r1=1702961&r2=1702962&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Mon Sep 14 
14:44:06 2015
@@ -552,6 +552,26 @@ public class NioEndpoint extends Abstrac
     }
 
 
+    private void close(NioChannel socket, SelectionKey key) {
+        try {
+            if (socket.getPoller().cancelledKey(key) != null) {
+                // SocketWrapper (attachment) was removed from the
+                // key - recycle the key. This can only happen once
+                // per attempted closure so it is used to determine
+                // whether or not to return the key to the cache.
+                // We do NOT want to do this more than once - see BZ
+                // 57340 / 57943.
+                if (running && !paused) {
+                    if (!nioChannels.push(socket)) {
+                        socket.free();
+                    }
+                }
+            }
+        } catch (Exception x) {
+            log.error("",x);
+        }
+    }
+
     private void closeSocket(SocketChannel socket) {
         try {
             socket.socket().close();
@@ -984,7 +1004,7 @@ public class NioEndpoint extends Abstrac
                             if (log.isDebugEnabled()) {
                                 log.debug("Send file connection is being 
closed");
                             }
-                            cancelledKey(sk);
+                            close(sc, sk);
                         }
                     }
                     return SendfileState.DONE;
@@ -1001,11 +1021,19 @@ public class NioEndpoint extends Abstrac
                 }
             } catch (IOException x) {
                 if (log.isDebugEnabled()) log.debug("Unable to complete 
sendfile request:", x);
-                cancelledKey(sk);
+                if (!calledByProcessor && sc != null) {
+                    close(sc, sk);
+                } else {
+                    cancelledKey(sk);
+                }
                 return SendfileState.ERROR;
             } catch (Throwable t) {
                 log.error("", t);
-                cancelledKey(sk);
+                if (!calledByProcessor && sc != null) {
+                    close(sc, sk);
+                } else {
+                    cancelledKey(sk);
+                }
                 return SendfileState.ERROR;
             } finally {
                 if (sc!=null) sc.setSendFile(false);
@@ -1547,25 +1575,6 @@ public class NioEndpoint extends Abstrac
             }
         }
 
-        private void close(NioChannel socket, SelectionKey key) {
-            try {
-                if (socket.getPoller().cancelledKey(key) != null) {
-                    // SocketWrapper (attachment) was removed from the
-                    // key - recycle the key. This can only happen once
-                    // per attempted closure so it is used to determine
-                    // whether or not to return the key to the cache.
-                    // We do NOT want to do this more than once - see BZ
-                    // 57340 / 57943.
-                    if (running && !paused) {
-                        if (!nioChannels.push(socket)) {
-                            socket.free();
-                        }
-                    }
-                }
-            } catch (Exception x) {
-                log.error("",x);
-            }
-        }
     }
 
     // ----------------------------------------------- SendfileData Inner Class



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

Reply via email to