Repository: mina
Updated Branches:
  refs/heads/2.0 ce6d3e933 -> 12d45d143


Applied patch provided by Maria Petridean (we don't stop pushing data
into the socket when we get an empty buffer, which is a message end
marker, in order to balance reads and writes)

Project: http://git-wip-us.apache.org/repos/asf/mina/repo
Commit: http://git-wip-us.apache.org/repos/asf/mina/commit/12d45d14
Tree: http://git-wip-us.apache.org/repos/asf/mina/tree/12d45d14
Diff: http://git-wip-us.apache.org/repos/asf/mina/diff/12d45d14

Branch: refs/heads/2.0
Commit: 12d45d14360003abae527896518483929742c497
Parents: ce6d3e9
Author: Emmanuel Lécharny <[email protected]>
Authored: Fri Aug 19 14:21:12 2016 +0200
Committer: Emmanuel Lécharny <[email protected]>
Committed: Fri Aug 19 14:21:12 2016 +0200

----------------------------------------------------------------------
 .../polling/AbstractPollingIoProcessor.java     | 32 +++++++++++++-------
 1 file changed, 21 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina/blob/12d45d14/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java
----------------------------------------------------------------------
diff --git 
a/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java
 
b/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java
index 2b649a4..5d23b35 100644
--- 
a/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java
+++ 
b/mina-core/src/main/java/org/apache/mina/core/polling/AbstractPollingIoProcessor.java
@@ -814,6 +814,9 @@ public abstract class AbstractPollingIoProcessor<S extends 
AbstractIoSession> im
                 + (session.getConfig().getMaxReadBufferSize() >>> 1);
         int writtenBytes = 0;
         WriteRequest req = null;
+        
+        // boolean to indicate if the current message is an empty buffer, 
representing a message marker
+        boolean isEmptyMessage = false;
 
         try {
             // Clear OP_WRITE
@@ -837,6 +840,7 @@ public abstract class AbstractPollingIoProcessor<S extends 
AbstractIoSession> im
                 Object message = req.getMessage();
 
                 if (message instanceof IoBuffer) {
+                    isEmptyMessage = !((IoBuffer) message).hasRemaining();
                     localWrittenBytes = writeBuffer(session, req, 
hasFragmentation, maxWrittenBytes - writtenBytes,
                             currentTime);
 
@@ -866,17 +870,23 @@ public abstract class AbstractPollingIoProcessor<S 
extends AbstractIoSession> im
                 }
 
                 if (localWrittenBytes == 0) {
-                    // Kernel buffer is full.
-                    setInterestedInWrite(session, true);
-                    return false;
-                }
-
-                writtenBytes += localWrittenBytes;
-
-                if (writtenBytes >= maxWrittenBytes) {
-                    // Wrote too much
-                    scheduleFlush(session);
-                    return false;
+                    if (isEmptyMessage) {
+                        // Kernel buffer is full.
+                        setInterestedInWrite(session, true);
+                        return false;
+                    } else {
+                        // Just processed a message marker - empty buffer;
+                        // set the session write flag and continue
+                        setInterestedInWrite(session, true);
+                    }
+                } else {
+                    writtenBytes += localWrittenBytes;
+    
+                    if (writtenBytes >= maxWrittenBytes) {
+                        // Wrote too much
+                        scheduleFlush(session);
+                        return false;
+                    }
                 }
 
                 if (message instanceof IoBuffer) {

Reply via email to