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();