Author: trustin
Date: Thu Aug  2 23:48:11 2007
New Revision: 562355

URL: http://svn.apache.org/viewvc?view=rev&rev=562355
Log:
Fixed issue: DIRMINA-416 (Possible visibility problem against Selector access)
* Changed selector member variables to volatile in 1.1
* Added explicit locking in 1.0 instead of volatile


Modified:
    
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketAcceptor.java
    
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java
    
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketIoProcessor.java
    
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramAcceptorDelegate.java
    
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java
    
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketAcceptor.java
    
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java
    
mina/branches/1.1/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/support/DatagramAcceptorDelegate.java
    
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java

Modified: 
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketAcceptor.java
URL: 
http://svn.apache.org/viewvc/mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketAcceptor.java?view=diff&rev=562355&r1=562354&r2=562355
==============================================================================
--- 
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketAcceptor.java
 (original)
+++ 
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketAcceptor.java
 Thu Aug  2 23:48:11 2007
@@ -164,6 +164,12 @@
             throw request.exception;
         }
     }
+    
+    private Selector getSelector() {
+        synchronized (lock) {
+            return this.selector;
+        }
+    }
 
     private void startupWorker() throws IOException {
         synchronized (lock) {
@@ -231,6 +237,7 @@
         public void run() {
             Thread.currentThread().setName(SocketAcceptor.this.threadName);
 
+            Selector selector = getSelector();
             for (;;) {
                 try {
                     int nKeys = selector.select();
@@ -349,6 +356,7 @@
             return;
         }
 
+        Selector selector = getSelector();
         for (;;) {
             RegistrationRequest req;
 
@@ -418,6 +426,7 @@
             return;
         }
 
+        Selector selector = getSelector();
         for (;;) {
             CancellationRequest request;
 

Modified: 
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java
URL: 
http://svn.apache.org/viewvc/mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java?view=diff&rev=562355&r1=562354&r2=562355
==============================================================================
--- 
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java
 (original)
+++ 
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java
 Thu Aug  2 23:48:11 2007
@@ -226,6 +226,12 @@
         }
         this.defaultConfig = defaultConfig;
     }
+    
+    private Selector getSelector() {
+        synchronized (lock) {
+            return this.selector;
+        }
+    }
 
     private void startupWorker() throws IOException {
         synchronized (lock) {
@@ -241,6 +247,7 @@
         if (connectQueue.isEmpty())
             return;
 
+        Selector selector = getSelector();
         for (;;) {
             ConnectionRequest req;
             synchronized (connectQueue) {
@@ -357,6 +364,7 @@
         public void run() {
             Thread.currentThread().setName(SocketConnector.this.threadName);
 
+            Selector selector = getSelector();
             for (;;) {
                 try {
                     int nKeys = selector.select(1000);

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?view=diff&rev=562355&r1=562354&r2=562355
==============================================================================
--- 
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
 Thu Aug  2 23:48:11 2007
@@ -83,6 +83,12 @@
         startupWorker();
     }
 
+    private Selector getSelector() {
+        synchronized (lock) {
+            return this.selector;
+        }
+    }
+    
     private void startupWorker() throws IOException {
         synchronized (lock) {
             if (worker == null) {
@@ -96,7 +102,7 @@
 
     void flush(SocketSessionImpl session) {
         scheduleFlush(session);
-        Selector selector = this.selector;
+        Selector selector = getSelector();
         if (selector != null) {
             selector.wakeup();
         }
@@ -104,7 +110,7 @@
 
     void updateTrafficMask(SocketSessionImpl session) {
         scheduleTrafficControl(session);
-        Selector selector = this.selector;
+        Selector selector = getSelector();
         if (selector != null) {
             selector.wakeup();
         }
@@ -132,6 +138,7 @@
         if (newSessions.isEmpty())
             return;
 
+        Selector selector = getSelector();
         for (;;) {
             SocketSessionImpl session;
 
@@ -265,6 +272,7 @@
         long currentTime = System.currentTimeMillis();
         if ((currentTime - lastIdleCheckTime) >= 1000) {
             lastIdleCheckTime = currentTime;
+            Selector selector = getSelector();
             Set keys = selector.keys();
             if (keys != null) {
                 for (Iterator it = keys.iterator(); it.hasNext();) {
@@ -482,6 +490,7 @@
         public void run() {
             Thread.currentThread().setName(SocketIoProcessor.this.threadName);
 
+            Selector selector = getSelector();
             for (;;) {
                 try {
                     int nKeys = selector.select(1000);
@@ -527,5 +536,4 @@
             }
         }
     }
-
 }

Modified: 
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramAcceptorDelegate.java
URL: 
http://svn.apache.org/viewvc/mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramAcceptorDelegate.java?view=diff&rev=562355&r1=562354&r2=562355
==============================================================================
--- 
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramAcceptorDelegate.java
 (original)
+++ 
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramAcceptorDelegate.java
 Thu Aug  2 23:48:11 2007
@@ -186,7 +186,7 @@
             throw new NullPointerException("localAddress");
         }
 
-        Selector selector = this.selector;
+        Selector selector = getSelector();
         DatagramChannel ch = (DatagramChannel) channels.get(localAddress);
         if (selector == null || ch == null) {
             throw new IllegalArgumentException("Unknown localAddress: "
@@ -273,6 +273,10 @@
         }
         this.defaultConfig = defaultConfig;
     }
+    
+    private synchronized Selector getSelector() {
+        return this.selector;
+    }
 
     private synchronized void startupWorker() throws IOException {
         if (worker == null) {
@@ -284,7 +288,7 @@
 
     public void flushSession(DatagramSessionImpl session) {
         scheduleFlush(session);
-        Selector selector = this.selector;
+        Selector selector = getSelector();
         if (selector != null) {
             selector.wakeup();
         }
@@ -303,6 +307,7 @@
         public void run() {
             Thread.currentThread().setName("DatagramAcceptor-" + id);
 
+            Selector selector = DatagramAcceptorDelegate.this.getSelector();
             for (;;) {
                 try {
                     int nKeys = selector.select();
@@ -486,6 +491,7 @@
         if (registerQueue.isEmpty())
             return;
 
+        Selector selector = getSelector();
         for (;;) {
             RegistrationRequest req;
             synchronized (registerQueue) {
@@ -552,6 +558,7 @@
         if (cancelQueue.isEmpty())
             return;
 
+        Selector selector = getSelector();
         for (;;) {
             CancellationRequest request;
             synchronized (cancelQueue) {

Modified: 
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java
URL: 
http://svn.apache.org/viewvc/mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java?view=diff&rev=562355&r1=562354&r2=562355
==============================================================================
--- 
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java
 (original)
+++ 
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java
 Thu Aug  2 23:48:11 2007
@@ -194,6 +194,10 @@
         }
         this.defaultConfig = defaultConfig;
     }
+    
+    private synchronized Selector getSelector() {
+        return this.selector;
+    }
 
     private synchronized void startupWorker() throws IOException {
         if (worker == null) {
@@ -226,7 +230,7 @@
 
     public void flushSession(DatagramSessionImpl session) {
         scheduleFlush(session);
-        Selector selector = this.selector;
+        Selector selector = getSelector();
         if (selector != null) {
             selector.wakeup();
         }
@@ -240,7 +244,7 @@
 
     public void updateTrafficMask(DatagramSessionImpl session) {
         scheduleTrafficControl(session);
-        Selector selector = this.selector;
+        Selector selector = getSelector();
         if (selector != null) {
             selector.wakeup();
         }
@@ -300,6 +304,7 @@
         public void run() {
             Thread.currentThread().setName("DatagramConnector-" + id);
 
+            Selector selector = getSelector();
             for (;;) {
                 try {
                     int nKeys = selector.select();
@@ -483,6 +488,7 @@
         if (registerQueue.isEmpty())
             return;
 
+        Selector selector = getSelector();
         for (;;) {
             RegistrationRequest req;
             synchronized (registerQueue) {
@@ -540,6 +546,7 @@
         if (cancelQueue.isEmpty())
             return;
 
+        Selector selector = getSelector();
         for (;;) {
             DatagramSessionImpl session;
             synchronized (cancelQueue) {

Modified: 
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketAcceptor.java
URL: 
http://svn.apache.org/viewvc/mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketAcceptor.java?view=diff&rev=562355&r1=562354&r2=562355
==============================================================================
--- 
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketAcceptor.java
 (original)
+++ 
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketAcceptor.java
 Thu Aug  2 23:48:11 2007
@@ -75,7 +75,7 @@
 
     private final int processorCount;
 
-    private Selector selector;
+    private volatile Selector selector;
 
     private Worker worker;
 
@@ -212,6 +212,7 @@
         public void run() {
             Thread.currentThread().setName(SocketAcceptor.this.threadName);
 
+            Selector selector = SocketAcceptor.this.selector;
             for (;;) {
                 try {
                     int nKeys = selector.select();
@@ -330,6 +331,7 @@
             return;
         }
 
+        Selector selector = this.selector;
         for (;;) {
             RegistrationRequest req = registerQueue.poll();
 
@@ -388,6 +390,7 @@
             return;
         }
 
+        Selector selector = this.selector;
         for (;;) {
             CancellationRequest request = cancelQueue.poll();
 

Modified: 
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java
URL: 
http://svn.apache.org/viewvc/mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java?view=diff&rev=562355&r1=562354&r2=562355
==============================================================================
--- 
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java
 (original)
+++ 
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java
 Thu Aug  2 23:48:11 2007
@@ -69,7 +69,7 @@
 
     private final Executor executor;
 
-    private Selector selector;
+    private volatile Selector selector;
 
     private Worker worker;
 
@@ -234,6 +234,7 @@
         if (connectQueue.isEmpty())
             return;
 
+        Selector selector = this.selector;
         for (;;) {
             ConnectionRequest req = connectQueue.poll();
 
@@ -340,6 +341,7 @@
         public void run() {
             Thread.currentThread().setName(SocketConnector.this.threadName);
 
+            Selector selector = SocketConnector.this.selector;
             for (;;) {
                 try {
                     int nKeys = selector.select(1000);

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?view=diff&rev=562355&r1=562354&r2=562355
==============================================================================
--- 
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
 Thu Aug  2 23:48:11 2007
@@ -48,7 +48,7 @@
 
     private final Executor executor;
 
-    private Selector selector;
+    private volatile Selector selector;
 
     private final Queue<SocketSessionImpl> newSessions = new 
ConcurrentLinkedQueue<SocketSessionImpl>();
 
@@ -117,6 +117,7 @@
     }
 
     private void doAddNew() {
+        Selector selector = this.selector;
         for (;;) {
             SocketSessionImpl session = newSessions.poll();
 
@@ -436,6 +437,7 @@
         public void run() {
             Thread.currentThread().setName(SocketIoProcessor.this.threadName);
 
+            Selector selector = SocketIoProcessor.this.selector;
             for (;;) {
                 try {
                     int nKeys = selector.select(1000);
@@ -481,5 +483,4 @@
             }
         }
     }
-
 }

Modified: 
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramAcceptorDelegate.java
URL: 
http://svn.apache.org/viewvc/mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramAcceptorDelegate.java?view=diff&rev=562355&r1=562354&r2=562355
==============================================================================
--- 
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramAcceptorDelegate.java
 (original)
+++ 
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramAcceptorDelegate.java
 Thu Aug  2 23:48:11 2007
@@ -70,7 +70,7 @@
 
     private final int id = nextId.getAndIncrement();
 
-    private Selector selector;
+    private volatile Selector selector;
 
     private DatagramAcceptorConfig defaultConfig = new 
DatagramAcceptorConfig();
 
@@ -300,6 +300,7 @@
         public void run() {
             Thread.currentThread().setName("DatagramAcceptor-" + id);
 
+            Selector selector = DatagramAcceptorDelegate.this.selector;
             for (;;) {
                 try {
                     int nKeys = selector.select();

Modified: 
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java
URL: 
http://svn.apache.org/viewvc/mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java?view=diff&rev=562355&r1=562354&r2=562355
==============================================================================
--- 
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java
 (original)
+++ 
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/support/DatagramConnectorDelegate.java
 Thu Aug  2 23:48:11 2007
@@ -67,7 +67,7 @@
 
     private final int id = nextId.getAndIncrement();
 
-    private Selector selector;
+    private volatile Selector selector;
 
     private DatagramConnectorConfig defaultConfig = new 
DatagramConnectorConfig();
 
@@ -284,6 +284,7 @@
         public void run() {
             Thread.currentThread().setName("DatagramConnector-" + id);
 
+            Selector selector = DatagramConnectorDelegate.this.selector;
             for (;;) {
                 try {
                     int nKeys = selector.select();


Reply via email to