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];


Reply via email to