You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by tr...@apache.org on 2007/07/06 13:47:03 UTC

svn commit: r553847 - /mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestResponseFilter.java

Author: trustin
Date: Fri Jul  6 04:47:02 2007
New Revision: 553847

URL: http://svn.apache.org/viewvc?view=rev&rev=553847
Log:
Replaced ConcurrentHashMap with synchronized HashMap because it performs much better for RequestResponseFilter

Modified:
    mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestResponseFilter.java

Modified: mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestResponseFilter.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestResponseFilter.java?view=diff&rev=553847&r1=553846&r2=553847
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestResponseFilter.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/filter/reqres/RequestResponseFilter.java Fri Jul  6 04:47:02 2007
@@ -21,12 +21,11 @@
 
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
@@ -82,7 +81,7 @@
     public void onPreAdd(IoFilterChain parent, String name, NextFilter nextFilter) throws Exception {
         IoSession session = parent.getSession();
         session.setAttribute(RESPONSE_INSPECTOR, responseInspectorFactory.getResponseInspector());
-        session.setAttribute(REQUEST_STORE, new ConcurrentHashMap<Object, Request>());
+        session.setAttribute(REQUEST_STORE, new HashMap<Object, Request>());
         session.setAttribute(UNRESPONDED_REQUESTS, new LinkedHashSet<Request>());
     }
     
@@ -120,10 +119,14 @@
         switch (type) {
         case WHOLE:
         case PARTIAL_LAST:
-            request = requestStore.remove(requestId);
+            synchronized (requestStore) {
+                request = requestStore.remove(requestId);
+            }
             break;
         case PARTIAL:
-            request = requestStore.get(requestId);
+            synchronized (requestStore) {
+                request = requestStore.get(requestId);
+            }
             break;
         default:
             throw new InternalError();
@@ -142,7 +145,7 @@
             // Found a matching request.
             // Cancel the timeout task if needed.
             if (type != ResponseType.PARTIAL) {
-                ScheduledFuture scheduledFuture = request.getTimeoutFuture();
+                ScheduledFuture<?> scheduledFuture = request.getTimeoutFuture();
                 if (scheduledFuture != null) {
                     scheduledFuture.cancel(false);
                     Set<Request> unrespondedRequests = getUnrespondedRequests(session);
@@ -174,8 +177,15 @@
                     new IllegalArgumentException("Request can not be reused."));
         }
         
-        ConcurrentMap<Object, Request> requestStore = getRequestStore(session);
-        Object oldValue = requestStore.putIfAbsent(request.getId(), request);
+        Map<Object, Request> requestStore = getRequestStore(session);
+        Object oldValue = null;
+        Object requestId = request.getId();
+        synchronized (requestStore) {
+            oldValue = requestStore.get(requestId);
+            if (oldValue == null) {
+                requestStore.put(requestId, request);
+            }
+        }
         if (oldValue != null) {
             nextFilter.exceptionCaught(
                     session,
@@ -241,15 +251,18 @@
         }
 
         // Clear the request store just in case we missed something, though it's unlikely.
-        getRequestStore(session).clear();
+        Map<Object, Request> requestStore = getRequestStore(session);
+        synchronized (requestStore) {
+            requestStore.clear();
+        }
         
         // Now tell the main subject.
         nextFilter.sessionClosed(session);
     }
 
     @SuppressWarnings("unchecked")
-    private ConcurrentMap<Object, Request> getRequestStore(IoSession session) {
-        return (ConcurrentMap<Object, Request>) session.getAttribute(REQUEST_STORE);
+    private Map<Object, Request> getRequestStore(IoSession session) {
+        return (Map<Object, Request>) session.getAttribute(REQUEST_STORE);
     }
     
     @SuppressWarnings("unchecked")
@@ -276,8 +289,19 @@
                 }
             }
         
-            ConcurrentMap<Object, Request> requestStore = getRequestStore(session);
-            if (requestStore.remove(request.getId(), request)) {
+            Map<Object, Request> requestStore = getRequestStore(session);
+            Object requestId = request.getId();
+            boolean timedOut;
+            synchronized (requestStore) {
+                if (requestStore.get(requestId) == request) {
+                    requestStore.remove(requestId);
+                    timedOut = true;
+                } else {
+                    timedOut = false;
+                }
+            }
+
+            if (timedOut) {
                 // Throw the exception only when it's really timed out.
                 RequestTimeoutException e = new RequestTimeoutException(request);
                 request.signal(e);