You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by el...@apache.org on 2016/02/12 17:18:05 UTC

[2/3] mina git commit: Applied correctly the patch submitted by Terence Marks (https://issues.apache.org/jira/browse/DIRMINA-1019) that I stupidely fucked up before injecting it a first time. My bad.

Applied correctly the patch submitted by Terence Marks
(https://issues.apache.org/jira/browse/DIRMINA-1019) that I stupidely
fucked up before injecting it a first time. My bad.

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

Branch: refs/heads/2.0
Commit: 1d43747721ea26664bf272738f6c33b6439cef30
Parents: ab3b933
Author: Emmanuel Lécharny <el...@symas.com>
Authored: Fri Feb 12 11:33:29 2016 +0100
Committer: Emmanuel Lécharny <el...@symas.com>
Committed: Fri Feb 12 11:33:29 2016 +0100

----------------------------------------------------------------------
 .../org/apache/mina/filter/ssl/SslHandler.java  | 43 ++++++++++++--------
 1 file changed, 27 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina/blob/1d437477/mina-core/src/main/java/org/apache/mina/filter/ssl/SslHandler.java
----------------------------------------------------------------------
diff --git a/mina-core/src/main/java/org/apache/mina/filter/ssl/SslHandler.java b/mina-core/src/main/java/org/apache/mina/filter/ssl/SslHandler.java
index 6706627..fa51002 100644
--- a/mina-core/src/main/java/org/apache/mina/filter/ssl/SslHandler.java
+++ b/mina-core/src/main/java/org/apache/mina/filter/ssl/SslHandler.java
@@ -23,6 +23,7 @@ import java.net.InetSocketAddress;
 import java.nio.ByteBuffer;
 import java.util.Queue;
 import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.ReentrantLock;
 
 import javax.net.ssl.SSLEngine;
@@ -115,7 +116,11 @@ class SslHandler {
      * for data being produced during the handshake). */
     private boolean writingEncryptedData;
 
+    /** A lock to protect the SSL flush of events */
     private ReentrantLock sslLock = new ReentrantLock();
+    
+    /** A counter of schedules events */
+    private final AtomicInteger scheduled_events = new AtomicInteger(0);
 
     /**
      * Create a new SSL Handler, and initialize it.
@@ -300,24 +305,29 @@ class SslHandler {
     }
 
     /* no qualifier */void flushScheduledEvents() {
-        // Fire events only when the lock is available for this handler.
-        IoFilterEvent event;
-        try {
-            sslLock.lock();
+        scheduled_events.incrementAndGet();
 
-            // We need synchronization here inevitably because filterWrite can be
-            // called simultaneously and cause 'bad record MAC' integrity error.
-            while ((event = filterWriteEventQueue.poll()) != null) {
-                NextFilter nextFilter = event.getNextFilter();
-                nextFilter.filterWrite(session, (WriteRequest) event.getParameter());
+        // Fire events only when the lock is available for this handler.
+        if (sslLock.tryLock()) {
+            IoFilterEvent event;
+            
+            try {
+                do {
+                    // We need synchronization here inevitably because filterWrite can be
+                    // called simultaneously and cause 'bad record MAC' integrity error.
+                    while ((event = filterWriteEventQueue.poll()) != null) {
+                        NextFilter nextFilter = event.getNextFilter();
+                        nextFilter.filterWrite(session, (WriteRequest) event.getParameter());
+                    }
+            
+                    while ((event = messageReceivedEventQueue.poll()) != null) {
+                        NextFilter nextFilter = event.getNextFilter();
+                        nextFilter.messageReceived(session, event.getParameter());
+                    }
+                } while (scheduled_events.decrementAndGet() > 0);
+            } finally {
+                sslLock.unlock();
             }
-        } finally {
-            sslLock.unlock();
-        }
-
-        while ((event = messageReceivedEventQueue.poll()) != null) {
-            NextFilter nextFilter = event.getNextFilter();
-            nextFilter.messageReceived(session, event.getParameter());
         }
     }
 
@@ -440,6 +450,7 @@ class SslHandler {
         while (src.hasRemaining()) {
 
             SSLEngineResult result = sslEngine.wrap(src, outNetBuffer.buf());
+            
             if (result.getStatus() == SSLEngineResult.Status.OK) {
                 if (result.getHandshakeStatus() == SSLEngineResult.HandshakeStatus.NEED_TASK) {
                     doTasks();