You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2011/10/06 15:07:34 UTC

svn commit: r1179609 - in /httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn: AbstractClientConnAdapter.java AbstractPooledConnAdapter.java

Author: olegk
Date: Thu Oct  6 13:07:33 2011
New Revision: 1179609

URL: http://svn.apache.org/viewvc?rev=1179609&view=rev
Log:
HTTPCLIENT-1127: fixed dead-lock between SingleClientConnManager and AbstractPooledConnAdapter

Modified:
    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractClientConnAdapter.java
    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractPooledConnAdapter.java

Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractClientConnAdapter.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractClientConnAdapter.java?rev=1179609&r1=1179608&r2=1179609&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractClientConnAdapter.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractClientConnAdapter.java Thu Oct  6 13:07:33 2011
@@ -78,7 +78,7 @@ public abstract class AbstractClientConn
      * This attribute MUST NOT be final, so the adapter can be detached
      * from the connection manager without keeping a hard reference there.
      */
-    private volatile ClientConnectionManager connManager;
+    private final ClientConnectionManager connManager;
 
     /** The wrapped connection. */
     private volatile OperatedClientConnection wrappedConnection;
@@ -114,9 +114,8 @@ public abstract class AbstractClientConn
      * Detaches this adapter from the wrapped connection.
      * This adapter becomes useless.
      */
-    protected synchronized void detach() {
+    protected void detach() {
         wrappedConnection = null;
-        connManager = null; // base class attribute
         duration = Long.MAX_VALUE;
     }
 
@@ -303,32 +302,32 @@ public abstract class AbstractClientConn
         }
     }
 
-    public synchronized void releaseConnection() {
-        if (released) {
-            return;
-        }
-        released = true;
-        if (connManager != null) {
+    public void releaseConnection() {
+        synchronized (connManager) {
+            if (released) {
+                return;
+            }
+            released = true;
             connManager.releaseConnection(this, duration, TimeUnit.MILLISECONDS);
         }
     }
 
-    public synchronized void abortConnection() {
-        if (released) {
-            return;
-        }
-        released = true;
-        unmarkReusable();
-        try {
-            shutdown();
-        } catch (IOException ignore) {
-        }
-        if (connManager != null) {
+    public void abortConnection() {
+        synchronized (connManager) {
+            if (released) {
+                return;
+            }
+            released = true;
+            unmarkReusable();
+            try {
+                shutdown();
+            } catch (IOException ignore) {
+            }
             connManager.releaseConnection(this, duration, TimeUnit.MILLISECONDS);
         }
     }
 
-    public synchronized Object getAttribute(final String id) {
+    public Object getAttribute(final String id) {
         OperatedClientConnection conn = getWrappedConnection();
         assertValid(conn);
         if (conn instanceof HttpContext) {
@@ -338,7 +337,7 @@ public abstract class AbstractClientConn
         }
     }
 
-    public synchronized Object removeAttribute(final String id) {
+    public Object removeAttribute(final String id) {
         OperatedClientConnection conn = getWrappedConnection();
         assertValid(conn);
         if (conn instanceof HttpContext) {
@@ -348,7 +347,7 @@ public abstract class AbstractClientConn
         }
     }
 
-    public synchronized void setAttribute(final String id, final Object obj) {
+    public void setAttribute(final String id, final Object obj) {
         OperatedClientConnection conn = getWrappedConnection();
         assertValid(conn);
         if (conn instanceof HttpContext) {

Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractPooledConnAdapter.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractPooledConnAdapter.java?rev=1179609&r1=1179608&r2=1179609&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractPooledConnAdapter.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractPooledConnAdapter.java Thu Oct  6 13:07:33 2011
@@ -105,7 +105,7 @@ public abstract class AbstractPooledConn
      * This adapter becomes useless.
      */
     @Override
-    protected synchronized void detach() {
+    protected void detach() {
         poolEntry = null;
         super.detach();
     }



Re: svn commit: r1179609

Posted by Oleg Kalnichevski <ol...@apache.org>.
On Thu, 2011-10-06 at 17:05 +0100, sebb wrote:
> On 6 October 2011 14:07,  <ol...@apache.org> wrote:
> > Author: olegk
> > Date: Thu Oct  6 13:07:33 2011
> > New Revision: 1179609
> >
> > URL: http://svn.apache.org/viewvc?rev=1179609&view=rev
> > Log:
> > HTTPCLIENT-1127: fixed dead-lock between SingleClientConnManager and AbstractPooledConnAdapter
> >
> > Modified:
> >    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractClientConnAdapter.java
> >    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractPooledConnAdapter.java
> >
> > Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractClientConnAdapter.java
> > URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractClientConnAdapter.java?rev=1179609&r1=1179608&r2=1179609&view=diff
> > ==============================================================================
> > --- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractClientConnAdapter.java (original)
> > +++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractClientConnAdapter.java Thu Oct  6 13:07:33 2011
> > @@ -78,7 +78,7 @@ public abstract class AbstractClientConn
> >      * This attribute MUST NOT be final, so the adapter can be detached
> >      * from the connection manager without keeping a hard reference there.
> >      */
> > -    private volatile ClientConnectionManager connManager;
> > +    private final ClientConnectionManager connManager;
> >
> 
> Does the comment about not using final no longer apply?
> If so, then the comment should be removed or fixed to avoid confusion later.

Comment removed.

Oleg



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@hc.apache.org
For additional commands, e-mail: dev-help@hc.apache.org


Re: svn commit: r1179609 - in /httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn: AbstractClientConnAdapter.java AbstractPooledConnAdapter.java

Posted by sebb <se...@gmail.com>.
On 6 October 2011 14:07,  <ol...@apache.org> wrote:
> Author: olegk
> Date: Thu Oct  6 13:07:33 2011
> New Revision: 1179609
>
> URL: http://svn.apache.org/viewvc?rev=1179609&view=rev
> Log:
> HTTPCLIENT-1127: fixed dead-lock between SingleClientConnManager and AbstractPooledConnAdapter
>
> Modified:
>    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractClientConnAdapter.java
>    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractPooledConnAdapter.java
>
> Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractClientConnAdapter.java
> URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractClientConnAdapter.java?rev=1179609&r1=1179608&r2=1179609&view=diff
> ==============================================================================
> --- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractClientConnAdapter.java (original)
> +++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/conn/AbstractClientConnAdapter.java Thu Oct  6 13:07:33 2011
> @@ -78,7 +78,7 @@ public abstract class AbstractClientConn
>      * This attribute MUST NOT be final, so the adapter can be detached
>      * from the connection manager without keeping a hard reference there.
>      */
> -    private volatile ClientConnectionManager connManager;
> +    private final ClientConnectionManager connManager;
>

Does the comment about not using final no longer apply?
If so, then the comment should be removed or fixed to avoid confusion later.

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@hc.apache.org
For additional commands, e-mail: dev-help@hc.apache.org