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