You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2019/05/20 12:11:17 UTC

[tomcat] branch master updated: Improve NIO2 flush

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

remm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/master by this push:
     new d2752e5  Improve NIO2 flush
d2752e5 is described below

commit d2752e595136a08f5c64908103fa274559ee78ca
Author: remm <re...@apache.org>
AuthorDate: Mon May 20 14:11:04 2019 +0200

    Improve NIO2 flush
    
    Although it probably will never happen, also use the additional write
    buffers when flushing.
---
 java/org/apache/tomcat/util/net/Nio2Endpoint.java | 43 ++++++++++++++---------
 1 file changed, 26 insertions(+), 17 deletions(-)

diff --git a/java/org/apache/tomcat/util/net/Nio2Endpoint.java b/java/org/apache/tomcat/util/net/Nio2Endpoint.java
index e1ab5d0..767253a 100644
--- a/java/org/apache/tomcat/util/net/Nio2Endpoint.java
+++ b/java/org/apache/tomcat/util/net/Nio2Endpoint.java
@@ -1032,25 +1032,34 @@ public class Nio2Endpoint extends AbstractJsseEndpoint<Nio2Channel,AsynchronousS
                 } else {
                     // If there is still data inside the main write buffer, it needs to be written first
                     if (!socketBufferHandler.isWriteBufferEmpty()) {
-                        socketBufferHandler.configureWriteBufferForRead();
-                        getSocket().write(socketBufferHandler.getWriteBuffer(), null, new CompletionHandler<Integer, Void>() {
-                            @Override
-                            public void completed(Integer nBytes, Void attachment) {
-                                if (nBytes.intValue() < 0) {
-                                    failed(new EOFException(), null);
-                                } else {
-                                    // Continue until everything is written
-                                    run();
-                                }
-                            }
-                            @Override
-                            public void failed(Throwable exc, Void attachment) {
-                                completion.failed(exc, Nio2OperationState.this);
+                        synchronized (writeCompletionHandler) {
+                            socketBufferHandler.configureWriteBufferForRead();
+                            ByteBuffer[] array = nonBlockingWriteBuffer.toArray(socketBufferHandler.getWriteBuffer());
+                            if (arrayHasData(array)) {
+                                getSocket().write(array, 0, array.length, timeout, unit,
+                                        array, new CompletionHandler<Long, ByteBuffer[]>() {
+                                            @Override
+                                            public void completed(Long nBytes, ByteBuffer[] buffers) {
+                                                if (nBytes.longValue() < 0) {
+                                                    failed(new EOFException(), null);
+                                                } else if (arrayHasData(buffers)) {
+                                                    getSocket().write(array, 0, array.length, toTimeout(getWriteTimeout()),
+                                                            TimeUnit.MILLISECONDS, array, this);
+                                                } else {
+                                                    // Continue until everything is written
+                                                    process();
+                                                }
+                                            }
+                                            @Override
+                                            public void failed(Throwable exc, ByteBuffer[] buffers) {
+                                                completion.failed(exc, Nio2OperationState.this);
+                                            }
+                                        });
+                                return;
                             }
-                        });
-                    } else {
-                        getSocket().write(buffers, offset, length, timeout, unit, this, completion);
+                        }
                     }
+                    getSocket().write(buffers, offset, length, timeout, unit, this, completion);
                 }
             }
         }


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