You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by tr...@apache.org on 2008/03/12 14:43:30 UTC
svn commit: r636321 - in /mina/trunk/core/src/main/java/org/apache/mina:
common/AbstractPollingIoProcessor.java transport/socket/nio/NioProcessor.java
Author: trustin
Date: Wed Mar 12 06:43:25 2008
New Revision: 636321
URL: http://svn.apache.org/viewvc?rev=636321&view=rev
Log:
* Minimized the number of interestOps(int) calls
* Tiny optimization: AbstractPollingIoProcessor.flush() now flushes write request queue immediately if the operation is called from the worker thread itself.
Modified:
mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoProcessor.java
mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioProcessor.java
Modified: mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoProcessor.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoProcessor.java?rev=636321&r1=636320&r2=636321&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoProcessor.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoProcessor.java Wed Mar 12 06:43:25 2008
@@ -62,6 +62,7 @@
private final Queue<T> trafficControllingSessions = new ConcurrentLinkedQueue<T>();
private Worker worker;
+ private Thread workerThread;
private long lastIdleCheckTime;
private final Object disposalLock = new Object();
@@ -199,9 +200,15 @@
}
public final void flush(T session) {
- boolean needsWakeup = flushingSessions.isEmpty();
- if (scheduleFlush(session) && needsWakeup) {
- wakeup();
+ if (Thread.currentThread() == workerThread) {
+ // Bypass the queue if called from the worker thread itself
+ // (i.e. single thread model).
+ flushNow(session);
+ } else {
+ boolean needsWakeup = flushingSessions.isEmpty();
+ if (scheduleFlush(session) && needsWakeup) {
+ wakeup();
+ }
}
}
@@ -664,6 +671,7 @@
private class Worker implements Runnable {
public void run() {
+ workerThread = Thread.currentThread();
int nSessions = 0;
lastIdleCheckTime = System.currentTimeMillis();
@@ -710,6 +718,7 @@
}
}
+ workerThread = null;
if (isDisposing()) {
try {
dispose0();
Modified: mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioProcessor.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioProcessor.java?rev=636321&r1=636320&r2=636321&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioProcessor.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioProcessor.java Wed Mar 12 06:43:25 2008
@@ -134,20 +134,30 @@
@Override
protected void setInterestedInRead(NioSession session, boolean value) throws Exception {
SelectionKey key = session.getSelectionKey();
+ int oldInterestOps = key.interestOps();
+ int newInterestOps;
if (value) {
- key.interestOps(key.interestOps() | SelectionKey.OP_READ);
+ newInterestOps = oldInterestOps | SelectionKey.OP_READ;
} else {
- key.interestOps(key.interestOps() & ~SelectionKey.OP_READ);
+ newInterestOps = oldInterestOps & ~SelectionKey.OP_READ;
+ }
+ if (oldInterestOps != newInterestOps) {
+ key.interestOps(newInterestOps);
}
}
@Override
protected void setInterestedInWrite(NioSession session, boolean value) throws Exception {
SelectionKey key = session.getSelectionKey();
+ int oldInterestOps = key.interestOps();
+ int newInterestOps;
if (value) {
- key.interestOps(key.interestOps() | SelectionKey.OP_WRITE);
+ newInterestOps = oldInterestOps | SelectionKey.OP_WRITE;
} else {
- key.interestOps(key.interestOps() & ~SelectionKey.OP_WRITE);
+ newInterestOps = oldInterestOps & ~SelectionKey.OP_WRITE;
+ }
+ if (oldInterestOps != newInterestOps) {
+ key.interestOps(newInterestOps);
}
}