Author: trustin
Date: Mon Nov  5 18:11:40 2007
New Revision: 592224

URL: http://svn.apache.org/viewvc?rev=592224&view=rev
Log:
* Removed I/O spinning on the reader side because it seems like there's no 
effect at all
* Instead, increased the write spinning loop count to 256, which improves 
memory utilization and write throughput significantly.


Modified:
    
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
    
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
    
mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoProcessor.java

Modified: 
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
URL: 
http://svn.apache.org/viewvc/mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java?rev=592224&r1=592223&r2=592224&view=diff
==============================================================================
--- 
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
 (original)
+++ 
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
 Mon Nov  5 18:11:40 2007
@@ -29,6 +29,7 @@
 import org.apache.mina.common.ByteBuffer;
 import org.apache.mina.common.ExceptionMonitor;
 import org.apache.mina.common.IdleStatus;
+import org.apache.mina.common.IoSession;
 import org.apache.mina.common.WriteTimeoutException;
 import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.util.NamePreservingRunnable;
@@ -44,7 +45,13 @@
  */
 class SocketIoProcessor {
 
-    private static final int IO_SPIN_COUNT = 3;
+    /**
+     * The maximum loop count for a write operation until
+     * [EMAIL PROTECTED] #write(IoSession, IoBuffer)} returns non-zero value.
+     * It is similar to what a spin lock is for in concurrency programming.
+     * It improves memory utilization and write throughput significantly.
+     */
+    private static final int WRITE_SPIN_COUNT = 256;
     
     private final Object lock = new Object();
 
@@ -241,16 +248,11 @@
 
         try {
             int readBytes = 0;
-            int ret = 0;
+            int ret;
 
             try {
-                for (int i = IO_SPIN_COUNT; i > 0; i --) {
-                    while ((ret = ch.read(buf.buf())) > 0) {
-                        readBytes += ret;
-                    }
-                    if (readBytes != 0 || ret < 0) {
-                        break;
-                    }
+                while ((ret = ch.read(buf.buf())) > 0) {
+                    readBytes += ret;
                 }
             } finally {
                 buf.flip();
@@ -459,7 +461,7 @@
                 }
     
                 int localWrittenBytes = 0;
-                for (int i = IO_SPIN_COUNT; i > 0; i --) {
+                for (int i = WRITE_SPIN_COUNT; i > 0; i --) {
                     localWrittenBytes = ch.write(buf.buf());
                     if (localWrittenBytes != 0 || !buf.hasRemaining()) {
                         break;

Modified: 
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
URL: 
http://svn.apache.org/viewvc/mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java?rev=592224&r1=592223&r2=592224&view=diff
==============================================================================
--- 
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
 (original)
+++ 
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
 Mon Nov  5 18:11:40 2007
@@ -31,6 +31,7 @@
 import org.apache.mina.common.ByteBuffer;
 import org.apache.mina.common.ExceptionMonitor;
 import org.apache.mina.common.IdleStatus;
+import org.apache.mina.common.IoSession;
 import org.apache.mina.common.WriteTimeoutException;
 import org.apache.mina.common.IoFilter.WriteRequest;
 import org.apache.mina.util.NamePreservingRunnable;
@@ -43,7 +44,13 @@
  */
 class SocketIoProcessor {
 
-    private static final int IO_SPIN_COUNT = 3;
+    /**
+     * The maximum loop count for a write operation until
+     * [EMAIL PROTECTED] #write(IoSession, IoBuffer)} returns non-zero value.
+     * It is similar to what a spin lock is for in concurrency programming.
+     * It improves memory utilization and write throughput significantly.
+     */
+    private static final int WRITE_SPIN_COUNT = 256;
     
     private final Object lock = new Object();
 
@@ -205,16 +212,11 @@
 
         try {
             int readBytes = 0;
-            int ret = 0;
+            int ret;
 
             try {
-                for (int i = IO_SPIN_COUNT; i > 0; i --) {
-                    while ((ret = ch.read(buf.buf())) > 0) {
-                        readBytes += ret;
-                    }
-                    if (readBytes != 0 || ret < 0) {
-                        break;
-                    }
+                while ((ret = ch.read(buf.buf())) > 0) {
+                    readBytes += ret;
                 }
             } finally {
                 buf.flip();
@@ -408,7 +410,7 @@
                 }
 
                 int localWrittenBytes = 0;
-                for (int i = IO_SPIN_COUNT; i > 0; i --) {
+                for (int i = WRITE_SPIN_COUNT; i > 0; i --) {
                     localWrittenBytes = ch.write(buf.buf());
                     if (localWrittenBytes != 0 || !buf.hasRemaining()) {
                         break;

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoProcessor.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoProcessor.java?rev=592224&r1=592223&r2=592224&view=diff
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoProcessor.java 
(original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/common/AbstractIoProcessor.java 
Mon Nov  5 18:11:40 2007
@@ -39,7 +39,13 @@
  */
 public abstract class AbstractIoProcessor implements IoProcessor {
     
-    private static final int IO_SPIN_COUNT = 3;
+    /**
+     * The maximum loop count for a write operation until
+     * [EMAIL PROTECTED] #write(IoSession, IoBuffer)} returns non-zero value.
+     * It is similar to what a spin lock is for in concurrency programming.
+     * It improves memory utilization and write throughput significantly.
+     */
+    private static final int WRITE_SPIN_COUNT = 256;
     
     private final Object lock = new Object();
     private final String threadName;
@@ -289,25 +295,15 @@
 
         try {
             int readBytes = 0;
-            int ret = 0;
+            int ret;
 
             try {
                 if (session.getTransportMetadata().hasFragmentation()) {
-                    for (int i = IO_SPIN_COUNT; i > 0; i --) {
-                        while ((ret = read(session, buf)) > 0) {
-                            readBytes += ret;
-                        }
-                        if (readBytes != 0 || ret < 0) {
-                            break;
-                        }
+                    while ((ret = read(session, buf)) > 0) {
+                        readBytes += ret;
                     }
                 } else {
-                    for (int i = IO_SPIN_COUNT; i > 0; i --) {
-                        ret = read(session, buf);
-                        if (ret != 0) {
-                            break;
-                        }
-                    }
+                    ret = read(session, buf);
                     if (ret > 0) {
                         readBytes = ret;
                     }
@@ -480,7 +476,7 @@
                     continue;
                 }
 
-                for (int i = IO_SPIN_COUNT; i > 0; i --) {
+                for (int i = WRITE_SPIN_COUNT; i > 0; i --) {
                     localWrittenBytes = write(session, buf);
                     if (localWrittenBytes != 0 || !buf.hasRemaining()) {
                         break;


Reply via email to