Repository: mina Updated Branches: refs/heads/2.0 2030bf02a -> a2b686e11
Applied patch for DIRMINA-934 Project: http://git-wip-us.apache.org/repos/asf/mina/repo Commit: http://git-wip-us.apache.org/repos/asf/mina/commit/a2b686e1 Tree: http://git-wip-us.apache.org/repos/asf/mina/tree/a2b686e1 Diff: http://git-wip-us.apache.org/repos/asf/mina/diff/a2b686e1 Branch: refs/heads/2.0 Commit: a2b686e1134ef8f83f6bf397a2de8c42bba3cbe3 Parents: 2030bf0 Author: Emmanuel Lécharny <[email protected]> Authored: Tue Sep 2 12:36:16 2014 +0200 Committer: Emmanuel Lécharny <[email protected]> Committed: Tue Sep 2 12:36:16 2014 +0200 ---------------------------------------------------------------------- .../codec/AbstractProtocolDecoderOutput.java | 4 ++-- .../mina/filter/codec/ProtocolCodecFilter.java | 20 +++++++++----------- 2 files changed, 11 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mina/blob/a2b686e1/mina-core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolDecoderOutput.java ---------------------------------------------------------------------- diff --git a/mina-core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolDecoderOutput.java b/mina-core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolDecoderOutput.java index 64ac583..b98d0ab 100644 --- a/mina-core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolDecoderOutput.java +++ b/mina-core/src/main/java/org/apache/mina/filter/codec/AbstractProtocolDecoderOutput.java @@ -19,8 +19,8 @@ */ package org.apache.mina.filter.codec; +import java.util.LinkedList; import java.util.Queue; -import java.util.concurrent.ConcurrentLinkedQueue; /** * A {@link ProtocolDecoderOutput} based on queue. @@ -28,7 +28,7 @@ import java.util.concurrent.ConcurrentLinkedQueue; * @author <a href="http://mina.apache.org">Apache MINA Project</a> */ public abstract class AbstractProtocolDecoderOutput implements ProtocolDecoderOutput { - private final Queue<Object> messageQueue = new ConcurrentLinkedQueue<Object>(); + private final Queue<Object> messageQueue = new LinkedList<Object>(); public AbstractProtocolDecoderOutput() { // Do nothing http://git-wip-us.apache.org/repos/asf/mina/blob/a2b686e1/mina-core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java ---------------------------------------------------------------------- diff --git a/mina-core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java b/mina-core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java index 99270e5..faa5d90 100644 --- a/mina-core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java +++ b/mina-core/src/main/java/org/apache/mina/filter/codec/ProtocolCodecFilter.java @@ -21,6 +21,7 @@ package org.apache.mina.filter.codec; import java.net.SocketAddress; import java.util.Queue; +import java.util.concurrent.Semaphore; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.file.FileRegion; @@ -65,8 +66,9 @@ public class ProtocolCodecFilter extends IoFilterAdapter { /** The factory responsible for creating the encoder and decoder */ private final ProtocolCodecFactory factory; + private final Semaphore lock = new Semaphore(1, true); + /** - * * Creates a new instance of ProtocolCodecFilter, associating a factory * for the creation of the encoder and decoder. * @@ -225,13 +227,10 @@ public class ProtocolCodecFilter extends IoFilterAdapter { // data in the buffer while (in.hasRemaining()) { int oldPos = in.position(); - try { - synchronized (decoderOut) { - // Call the decoder with the read bytes - decoder.decode(session, in, decoderOut); - } - + lock.acquire(); + // Call the decoder with the read bytes + decoder.decode(session, in, decoderOut); // Finish decoding if no exception was thrown. decoderOut.flush(nextFilter, session); } catch (Throwable t) { @@ -241,7 +240,6 @@ public class ProtocolCodecFilter extends IoFilterAdapter { } else { pde = new ProtocolDecoderException(t); } - if (pde.getHexdump() == null) { // Generate a message hex dump int curPos = in.position(); @@ -249,11 +247,9 @@ public class ProtocolCodecFilter extends IoFilterAdapter { pde.setHexdump(in.getHexDump()); in.position(curPos); } - // Fire the exceptionCaught event. decoderOut.flush(nextFilter, session); nextFilter.exceptionCaught(session, pde); - // Retry only if the type of the caught exception is // recoverable and the buffer position has changed. // We check buffer position additionally to prevent an @@ -261,6 +257,8 @@ public class ProtocolCodecFilter extends IoFilterAdapter { if (!(t instanceof RecoverableProtocolDecoderException) || (in.position() == oldPos)) { break; } + } finally { + lock.release(); } } } @@ -446,7 +444,7 @@ public class ProtocolCodecFilter extends IoFilterAdapter { if (future == null) { // Creates an empty writeRequest containing the destination WriteRequest writeRequest = new DefaultWriteRequest( - DefaultWriteRequest.EMPTY_MESSAGE, null, destination); + DefaultWriteRequest.EMPTY_MESSAGE, null, destination); future = DefaultWriteFuture.newNotWrittenFuture(session, new NothingWrittenException(writeRequest)); }
