Author: trustin
Date: Mon Nov 12 08:15:07 2007
New Revision: 594199
URL: http://svn.apache.org/viewvc?rev=594199&view=rev
Log:
Fixed NPE in SimpleIoProcessorPool due to timing issue
Modified:
mina/trunk/core/src/main/java/org/apache/mina/common/SimpleIoProcessorPool.java
Modified:
mina/trunk/core/src/main/java/org/apache/mina/common/SimpleIoProcessorPool.java
URL:
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/SimpleIoProcessorPool.java?rev=594199&r1=594198&r2=594199&view=diff
==============================================================================
---
mina/trunk/core/src/main/java/org/apache/mina/common/SimpleIoProcessorPool.java
(original)
+++
mina/trunk/core/src/main/java/org/apache/mina/common/SimpleIoProcessorPool.java
Mon Nov 12 08:15:07 2007
@@ -171,27 +171,19 @@
}
public void add(T session) {
- IoProcessor<T> p = nextProcessor();
- session.setAttribute(PROCESSOR, p);
- p.add(session);
+ getProcessor(session).add(session);
}
- @SuppressWarnings("unchecked")
public void flush(T session) {
- IoProcessor<T> p = (IoProcessor<T>) session.getAttribute(PROCESSOR);
- p.flush(session);
+ getProcessor(session).flush(session);
}
- @SuppressWarnings("unchecked")
public void remove(T session) {
- IoProcessor<T> p = (IoProcessor<T>) session.removeAttribute(PROCESSOR);
- p.remove(session);
+ getProcessor(session).remove(session);
}
- @SuppressWarnings("unchecked")
public void updateTrafficMask(T session) {
- IoProcessor<T> p = (IoProcessor<T>) session.getAttribute(PROCESSOR);
- p.updateTrafficMask(session);
+ getProcessor(session).updateTrafficMask(session);
}
public void dispose() {
@@ -221,6 +213,21 @@
}
}
+ @SuppressWarnings("unchecked")
+ private IoProcessor<T> getProcessor(T session) {
+ IoProcessor<T> p = (IoProcessor<T>) session.getAttribute(PROCESSOR);
+ if (p == null) {
+ p = nextProcessor();
+ IoProcessor<T> oldp =
+ (IoProcessor<T>) session.setAttributeIfAbsent(PROCESSOR, p);
+ if (oldp != null) {
+ p = oldp;
+ }
+ }
+
+ return p;
+ }
+
private IoProcessor<T> nextProcessor() {
checkDisposal();
return pool[Math.abs(processorDistributor.getAndIncrement()) %
pool.length];