Author: trustin
Date: Mon Aug  6 19:49:24 2007
New Revision: 563373

URL: http://svn.apache.org/viewvc?view=rev&rev=563373
Log:
Fixed issue: DIRMINA-416 again (Possible visibility problem against Selector 
access) * Fixed NPE on selector.wakeup() due to wrong synchronization

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/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/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=563373&r1=563372&r2=563373
==============================================================================
--- 
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
 Mon Aug  6 19:49:24 2007
@@ -142,14 +142,16 @@
         RegistrationRequest request = new RegistrationRequest(address, handler,
                 config);
 
-        synchronized (registerQueue) {
-            registerQueue.push(request);
+        synchronized (lock) {
+            startupWorker();
+    
+            synchronized (registerQueue) {
+                registerQueue.push(request);
+            }
+    
+            selector.wakeup();
         }
 
-        startupWorker();
-
-        selector.wakeup();
-
         synchronized (request) {
             while (!request.done) {
                 try {
@@ -262,7 +264,7 @@
                                     ExceptionMonitor.getInstance()
                                             .exceptionCaught(e);
                                 } finally {
-                                    selector = null;
+                                    SocketAcceptor.this.selector = null;
                                 }
                                 break;
                             }

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=563373&r1=563372&r2=563373
==============================================================================
--- 
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
 Mon Aug  6 19:49:24 2007
@@ -190,22 +190,24 @@
         }
 
         ConnectionRequest request = new ConnectionRequest(ch, handler, config);
-        try {
-            startupWorker();
-        } catch (IOException e) {
+        synchronized (lock) {
             try {
-                ch.close();
-            } catch (IOException e2) {
-                ExceptionMonitor.getInstance().exceptionCaught(e2);
+                startupWorker();
+            } catch (IOException e) {
+                try {
+                    ch.close();
+                } catch (IOException e2) {
+                    ExceptionMonitor.getInstance().exceptionCaught(e2);
+                }
+    
+                return DefaultConnectFuture.newFailedFuture(e);
             }
-
-            return DefaultConnectFuture.newFailedFuture(e);
-        }
-
-        synchronized (connectQueue) {
-            connectQueue.push(request);
+    
+            synchronized (connectQueue) {
+                connectQueue.push(request);
+            }
+            selector.wakeup();
         }
-        selector.wakeup();
 
         return request;
     }
@@ -389,7 +391,7 @@
                                         ExceptionMonitor.getInstance()
                                                 .exceptionCaught(e);
                                     } finally {
-                                        selector = null;
+                                        SocketConnector.this.selector = null;
                                     }
                                     break;
                                 }

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=563373&r1=563372&r2=563373
==============================================================================
--- 
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
 Mon Aug  6 19:49:24 2007
@@ -111,8 +111,8 @@
                 registerQueue.push(request);
             }
             startupWorker();
+            selector.wakeup();
         }
-        selector.wakeup();
 
         synchronized (request) {
             while (!request.done) {
@@ -149,8 +149,8 @@
             synchronized (cancelQueue) {
                 cancelQueue.push(request);
             }
+            selector.wakeup();
         }
-        selector.wakeup();
 
         synchronized (request) {
             while (!request.done) {
@@ -333,7 +333,7 @@
                                     ExceptionMonitor.getInstance()
                                             .exceptionCaught(e);
                                 } finally {
-                                    selector = null;
+                                    DatagramAcceptorDelegate.this.selector = 
null;
                                 }
                                 break;
                             }

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=563373&r1=563372&r2=563373
==============================================================================
--- 
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
 Mon Aug  6 19:49:24 2007
@@ -172,9 +172,9 @@
             synchronized (registerQueue) {
                 registerQueue.push(request);
             }
+            selector.wakeup();
         }
 
-        selector.wakeup();
         return request;
     }
 
@@ -223,9 +223,9 @@
             synchronized (cancelQueue) {
                 cancelQueue.push(session);
             }
-        }
 
-        selector.wakeup();
+            selector.wakeup();
+        }
     }
 
     public void flushSession(DatagramSessionImpl session) {
@@ -331,7 +331,7 @@
                                     ExceptionMonitor.getInstance()
                                             .exceptionCaught(e);
                                 } finally {
-                                    selector = null;
+                                    DatagramConnectorDelegate.this.selector = 
null;
                                 }
                                 break;
                             }

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=563373&r1=563372&r2=563373
==============================================================================
--- 
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
 Mon Aug  6 19:49:24 2007
@@ -137,11 +137,13 @@
         RegistrationRequest request = new RegistrationRequest(address, handler,
                 config);
 
-        registerQueue.add(request);
-
-        startupWorker();
-
-        selector.wakeup();
+        synchronized (lock) {
+            startupWorker();
+    
+            registerQueue.add(request);
+    
+            selector.wakeup();
+        }
 
         try {
             request.done.await();
@@ -172,20 +174,22 @@
 
         CancellationRequest request = new CancellationRequest(address);
 
-        try {
-            startupWorker();
-        } catch (IOException e) {
-            // IOException is thrown only when Worker thread is not
-            // running and failed to open a selector.  We simply throw
-            // IllegalArgumentException here because we can simply
-            // conclude that nothing is bound to the selector.
-            throw new IllegalArgumentException("Address not bound: " + 
address);
+        synchronized (lock) {
+            try {
+                startupWorker();
+            } catch (IOException e) {
+                // IOException is thrown only when Worker thread is not
+                // running and failed to open a selector.  We simply throw
+                // IllegalArgumentException here because we can simply
+                // conclude that nothing is bound to the selector.
+                throw new IllegalArgumentException("Address not bound: " + 
address);
+            }
+    
+            cancelQueue.add(request);
+    
+            selector.wakeup();
         }
 
-        cancelQueue.add(request);
-
-        selector.wakeup();
-
         try {
             request.done.await();
         } catch (InterruptedException e) {
@@ -237,7 +241,7 @@
                                     ExceptionMonitor.getInstance()
                                             .exceptionCaught(e);
                                 } finally {
-                                    selector = null;
+                                    SocketAcceptor.this.selector = null;
                                 }
                                 break;
                             }

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=563373&r1=563372&r2=563373
==============================================================================
--- 
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
 Mon Aug  6 19:49:24 2007
@@ -185,21 +185,23 @@
         }
 
         ConnectionRequest request = new ConnectionRequest(ch, handler, config);
-        try {
-            startupWorker();
-        } catch (IOException e) {
+        synchronized (lock) {
             try {
-                ch.close();
-            } catch (IOException e2) {
-                ExceptionMonitor.getInstance().exceptionCaught(e2);
+                startupWorker();
+            } catch (IOException e) {
+                try {
+                    ch.close();
+                } catch (IOException e2) {
+                    ExceptionMonitor.getInstance().exceptionCaught(e2);
+                }
+    
+                return DefaultConnectFuture.newFailedFuture(e);
             }
-
-            return DefaultConnectFuture.newFailedFuture(e);
+    
+            connectQueue.add(request);
+            selector.wakeup();
         }
 
-        connectQueue.add(request);
-        selector.wakeup();
-
         return request;
     }
 
@@ -366,7 +368,7 @@
                                         ExceptionMonitor.getInstance()
                                                 .exceptionCaught(e);
                                     } finally {
-                                        selector = null;
+                                        SocketConnector.this.selector = null;
                                     }
                                     break;
                                 }

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=563373&r1=563372&r2=563373
==============================================================================
--- 
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
 Mon Aug  6 19:49:24 2007
@@ -109,10 +109,12 @@
 
         RegistrationRequest request = new RegistrationRequest(address, handler,
                 config);
-        registerQueue.add(request);
-        startupWorker();
-
-        selector.wakeup();
+        
+        synchronized (lock) {
+            startupWorker();
+            registerQueue.add(request);
+            selector.wakeup();
+        }
 
         synchronized (request) {
             while (!request.done) {
@@ -135,19 +137,21 @@
             throw new NullPointerException("address");
 
         CancellationRequest request = new CancellationRequest(address);
-        try {
-            startupWorker();
-        } catch (IOException e) {
-            // IOException is thrown only when Worker thread is not
-            // running and failed to open a selector.  We simply throw
-            // IllegalArgumentException here because we can simply
-            // conclude that nothing is bound to the selector.
-            throw new IllegalArgumentException("Address not bound: " + 
address);
+        synchronized (lock) {
+            try {
+                startupWorker();
+            } catch (IOException e) {
+                // IOException is thrown only when Worker thread is not
+                // running and failed to open a selector.  We simply throw
+                // IllegalArgumentException here because we can simply
+                // conclude that nothing is bound to the selector.
+                throw new IllegalArgumentException("Address not bound: " + 
address);
+            }
+    
+            cancelQueue.add(request);
+            selector.wakeup();
         }
 
-        cancelQueue.add(request);
-        selector.wakeup();
-
         synchronized (request) {
             while (!request.done) {
                 try {
@@ -326,7 +330,7 @@
                                     ExceptionMonitor.getInstance()
                                             .exceptionCaught(e);
                                 } finally {
-                                    selector = null;
+                                    DatagramAcceptorDelegate.this.selector = 
null;
                                 }
                                 break;
                             }
@@ -472,6 +476,7 @@
         if (registerQueue.isEmpty())
             return;
 
+        Selector selector = this.selector;
         for (;;) {
             RegistrationRequest req = registerQueue.poll();
 
@@ -532,6 +537,7 @@
         if (cancelQueue.isEmpty())
             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/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=563373&r1=563372&r2=563373
==============================================================================
--- 
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
 Mon Aug  6 19:49:24 2007
@@ -157,22 +157,24 @@
 
         RegistrationRequest request = new RegistrationRequest(ch, handler,
                 config);
-        try {
-            startupWorker();
-        } catch (IOException e) {
+        synchronized (lock) {
             try {
-                ch.disconnect();
-                ch.close();
-            } catch (IOException e2) {
-                ExceptionMonitor.getInstance().exceptionCaught(e2);
+                startupWorker();
+            } catch (IOException e) {
+                try {
+                    ch.disconnect();
+                    ch.close();
+                } catch (IOException e2) {
+                    ExceptionMonitor.getInstance().exceptionCaught(e2);
+                }
+    
+                return DefaultConnectFuture.newFailedFuture(e);
             }
-
-            return DefaultConnectFuture.newFailedFuture(e);
+    
+            registerQueue.add(request);
+    
+            selector.wakeup();
         }
-
-        registerQueue.add(request);
-
-        selector.wakeup();
         return request;
     }
 
@@ -204,20 +206,22 @@
     }
 
     public void closeSession(DatagramSessionImpl session) {
-        try {
-            startupWorker();
-        } catch (IOException e) {
-            // IOException is thrown only when Worker thread is not
-            // running and failed to open a selector.  We simply return
-            // silently here because it we can simply conclude that
-            // this session is not managed by this connector or
-            // already closed.
-            return;
+        synchronized (lock) {
+            try {
+                startupWorker();
+            } catch (IOException e) {
+                // IOException is thrown only when Worker thread is not
+                // running and failed to open a selector.  We simply return
+                // silently here because it we can simply conclude that
+                // this session is not managed by this connector or
+                // already closed.
+                return;
+            }
+    
+            cancelQueue.add(session);
+    
+            selector.wakeup();
         }
-
-        cancelQueue.add(session);
-
-        selector.wakeup();
     }
 
     public void flushSession(DatagramSessionImpl session) {
@@ -311,7 +315,7 @@
                                     ExceptionMonitor.getInstance()
                                             .exceptionCaught(e);
                                 } finally {
-                                    selector = null;
+                                    DatagramConnectorDelegate.this.selector = 
null;
                                 }
                                 break;
                             }
@@ -458,6 +462,7 @@
         if (registerQueue.isEmpty())
             return;
 
+        Selector selector = this.selector;
         for (;;) {
             RegistrationRequest req = registerQueue.poll();
 
@@ -512,6 +517,7 @@
         if (cancelQueue.isEmpty())
             return;
 
+        Selector selector = this.selector;
         for (;;) {
             DatagramSessionImpl session = cancelQueue.poll();
 


Reply via email to