Updated Branches: refs/heads/trunk ccc7fc3c9 -> daec22a50
Fixed a potential pb where we would have enqueued the session sendBuffer, instead of creating a new one. Project: http://git-wip-us.apache.org/repos/asf/mina/repo Commit: http://git-wip-us.apache.org/repos/asf/mina/commit/daec22a5 Tree: http://git-wip-us.apache.org/repos/asf/mina/tree/daec22a5 Diff: http://git-wip-us.apache.org/repos/asf/mina/diff/daec22a5 Branch: refs/heads/trunk Commit: daec22a509e394b3671beab26b50c2633049639d Parents: ccc7fc3 Author: Emmanuel Lécharny <[email protected]> Authored: Fri Jan 11 06:32:48 2013 +0100 Committer: Emmanuel Lécharny <[email protected]> Committed: Fri Jan 11 06:32:48 2013 +0100 ---------------------------------------------------------------------- .../org/apache/mina/session/AbstractIoSession.java | 16 ++++++++++++-- .../apache/mina/transport/nio/NioTcpSession.java | 5 +-- .../apache/mina/transport/nio/NioUdpSession.java | 4 +- .../service/idlecheker/IndexedIdleChekerTest.java | 2 +- .../apache/mina/session/AbstractIoSessionTest.java | 2 +- 5 files changed, 19 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mina/blob/daec22a5/core/src/main/java/org/apache/mina/session/AbstractIoSession.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/mina/session/AbstractIoSession.java b/core/src/main/java/org/apache/mina/session/AbstractIoSession.java index f24dd02..56eccca 100644 --- a/core/src/main/java/org/apache/mina/session/AbstractIoSession.java +++ b/core/src/main/java/org/apache/mina/session/AbstractIoSession.java @@ -531,7 +531,14 @@ public abstract class AbstractIoSession implements IoSession, ReadFilterChainCon */ protected abstract int writeDirect(Object message); - protected abstract ByteBuffer convertToDirectBuffer(WriteRequest writeRequest); + /** + * Copy the HeapBuffer into a DirectBuffer, if needed. + * + * @param writeRequest The request containing the HeapBuffer + * @param createNew A flag to force the creation of a DirectBuffer + * @return A DirectBuffer + */ + protected abstract ByteBuffer convertToDirectBuffer(WriteRequest writeRequest, boolean createNew); /** * {@inheritDoc} @@ -554,7 +561,7 @@ public abstract class AbstractIoSession implements IoSession, ReadFilterChainCon if (writeQueue.isEmpty()) { // Transfer the buffer in a DirectByteBuffer if it's a HeapByteBuffer and if it's too big - message = convertToDirectBuffer(writeRequest); + message = convertToDirectBuffer(writeRequest, false); // We don't have anything in the writeQueue, let's try to write the // data in the channel immediately if we can @@ -571,6 +578,9 @@ public abstract class AbstractIoSession implements IoSession, ReadFilterChainCon int remaining = message.remaining(); if ((written < 0) || (remaining > 0)) { + // Create a DirectBuffer unconditionally + convertToDirectBuffer(writeRequest, true); + // We have to push the request on the writeQueue writeQueue.add(writeRequest); @@ -597,7 +607,7 @@ public abstract class AbstractIoSession implements IoSession, ReadFilterChainCon } } else { // Transfer the buffer in a DirectByteBuffer if it's a HeapByteBuffer - message = convertToDirectBuffer(writeRequest); + message = convertToDirectBuffer(writeRequest, true); // We have to push the request on the writeQueue writeQueue.add(writeRequest); http://git-wip-us.apache.org/repos/asf/mina/blob/daec22a5/core/src/main/java/org/apache/mina/transport/nio/NioTcpSession.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/mina/transport/nio/NioTcpSession.java b/core/src/main/java/org/apache/mina/transport/nio/NioTcpSession.java index f36f572..7dbb324 100644 --- a/core/src/main/java/org/apache/mina/transport/nio/NioTcpSession.java +++ b/core/src/main/java/org/apache/mina/transport/nio/NioTcpSession.java @@ -174,14 +174,13 @@ public class NioTcpSession extends AbstractIoSession implements SelectorListener * {@inheritDoc} */ @Override - protected ByteBuffer convertToDirectBuffer(WriteRequest writeRequest) { + protected ByteBuffer convertToDirectBuffer(WriteRequest writeRequest, boolean createNew) { ByteBuffer message = (ByteBuffer) writeRequest.getMessage(); if (!message.isDirect()) { - //int sendBufferSize = configuration.getSendBufferSize(); int remaining = message.remaining(); - if (remaining > sendBufferSize) { + if ((remaining > sendBufferSize) || createNew) { ByteBuffer directBuffer = ByteBuffer.allocateDirect(remaining); directBuffer.put(message); directBuffer.flip(); http://git-wip-us.apache.org/repos/asf/mina/blob/daec22a5/core/src/main/java/org/apache/mina/transport/nio/NioUdpSession.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/mina/transport/nio/NioUdpSession.java b/core/src/main/java/org/apache/mina/transport/nio/NioUdpSession.java index a902b9e..25006e2 100644 --- a/core/src/main/java/org/apache/mina/transport/nio/NioUdpSession.java +++ b/core/src/main/java/org/apache/mina/transport/nio/NioUdpSession.java @@ -213,7 +213,7 @@ public class NioUdpSession extends AbstractIoSession { * {@inheritDoc} */ @Override - protected ByteBuffer convertToDirectBuffer(WriteRequest writeRequest) { - return null; + protected ByteBuffer convertToDirectBuffer(WriteRequest writeRequest, boolean createNew) { + return (ByteBuffer) writeRequest.getMessage(); } } http://git-wip-us.apache.org/repos/asf/mina/blob/daec22a5/core/src/test/java/org/apache/mina/service/idlecheker/IndexedIdleChekerTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/mina/service/idlecheker/IndexedIdleChekerTest.java b/core/src/test/java/org/apache/mina/service/idlecheker/IndexedIdleChekerTest.java index 3d903d0..96a5a94 100644 --- a/core/src/test/java/org/apache/mina/service/idlecheker/IndexedIdleChekerTest.java +++ b/core/src/test/java/org/apache/mina/service/idlecheker/IndexedIdleChekerTest.java @@ -204,7 +204,7 @@ public class IndexedIdleChekerTest { * {@inheritDoc} */ @Override - protected ByteBuffer convertToDirectBuffer(WriteRequest writeRequest) { + protected ByteBuffer convertToDirectBuffer(WriteRequest writeRequest, boolean createNew) { return null; } } http://git-wip-us.apache.org/repos/asf/mina/blob/daec22a5/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java b/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java index d71f83b..48f6b21 100644 --- a/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java +++ b/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java @@ -149,7 +149,7 @@ public class AbstractIoSessionTest { * {@inheritDoc} */ @Override - protected ByteBuffer convertToDirectBuffer(WriteRequest writeRequest) { + protected ByteBuffer convertToDirectBuffer(WriteRequest writeRequest, boolean createNew) { return null; } }
