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;
         }
     }

Reply via email to