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