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;