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