Return-Path: Delivered-To: apmail-jakarta-httpclient-commits-archive@www.apache.org Received: (qmail 57185 invoked from network); 16 Oct 2005 13:56:58 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 16 Oct 2005 13:56:58 -0000 Received: (qmail 47194 invoked by uid 500); 16 Oct 2005 13:56:57 -0000 Mailing-List: contact httpclient-commits-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: httpclient-dev@jakarta.apache.org Delivered-To: mailing list httpclient-commits@jakarta.apache.org Received: (qmail 47183 invoked by uid 500); 16 Oct 2005 13:56:57 -0000 Delivered-To: apmail-jakarta-httpclient-cvs@jakarta.apache.org Received: (qmail 47180 invoked by uid 99); 16 Oct 2005 13:56:57 -0000 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.29) with SMTP; Sun, 16 Oct 2005 06:56:57 -0700 Received: (qmail 56987 invoked by uid 65534); 16 Oct 2005 13:56:37 -0000 Message-ID: <20051016135637.56986.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r322473 - /jakarta/httpclient/trunk/http-common/src/java/org/apache/http/impl/AbstractHttpConnection.java Date: Sun, 16 Oct 2005 13:56:36 -0000 To: httpclient-cvs@jakarta.apache.org From: olegk@apache.org X-Mailer: svnmailer-1.0.5 X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: olegk Date: Sun Oct 16 06:56:31 2005 New Revision: 322473 URL: http://svn.apache.org/viewcvs?rev=322473&view=rev Log: Reworked AbstractHttpConnection#close() to ensure proper synchronization to volatile data (such as transmitter's internal buffer) Modified: jakarta/httpclient/trunk/http-common/src/java/org/apache/http/impl/AbstractHttpConnection.java Modified: jakarta/httpclient/trunk/http-common/src/java/org/apache/http/impl/AbstractHttpConnection.java URL: http://svn.apache.org/viewcvs/jakarta/httpclient/trunk/http-common/src/java/org/apache/http/impl/AbstractHttpConnection.java?rev=322473&r1=322472&r2=322473&view=diff ============================================================================== --- jakarta/httpclient/trunk/http-common/src/java/org/apache/http/impl/AbstractHttpConnection.java (original) +++ jakarta/httpclient/trunk/http-common/src/java/org/apache/http/impl/AbstractHttpConnection.java Sun Oct 16 06:56:31 2005 @@ -53,9 +53,15 @@ */ abstract class AbstractHttpConnection implements HttpConnection { - protected volatile Socket socket = null; - protected volatile HttpDataTransmitter datatransmitter = null; - protected volatile HttpDataReceiver datareceiver = null; + /* + * I/O operations may not be performed if this flag is set to false + * All methods must call #assertOpen() to ensure the connection + * is open prior to performing any I/O + */ + protected volatile boolean open; + protected Socket socket = null; + protected HttpDataTransmitter datatransmitter = null; + protected HttpDataReceiver datareceiver = null; /* * Dependent interfaces @@ -82,13 +88,13 @@ } protected void assertNotOpen() { - if (this.socket != null) { + if (this.open) { throw new IllegalStateException("Connection is already open"); } } protected void assertOpen() { - if (this.socket == null) { + if (!this.open) { throw new IllegalStateException("Connection is not open"); } } @@ -101,6 +107,7 @@ throw new IllegalArgumentException("HTTP parameters may not be null"); } assertNotOpen(); + this.open = true; this.socket = socket; this.socket.setTcpNoDelay(HttpConnectionParams.getTcpNoDelay(params)); this.socket.setSoTimeout(HttpConnectionParams.getSoTimeout(params)); @@ -131,28 +138,31 @@ } public boolean isOpen() { - return this.socket != null; + return this.open; } public void close() throws IOException { - HttpDataTransmitter tmptransmitter = this.datatransmitter; - if (tmptransmitter != null) { - tmptransmitter.flush(); - } - this.datareceiver = null; - this.datatransmitter = null; - Socket tmpsocket = this.socket; - this.socket = null; - if (tmpsocket != null) { - try { - tmpsocket.shutdownOutput(); - } catch (IOException ignore) { - } - try { - tmpsocket.shutdownInput(); - } catch (IOException ignore) { - } - tmpsocket.close(); + this.open = false; + synchronized (this) { + HttpDataTransmitter tmptransmitter = this.datatransmitter; + Socket tmpsocket = this.socket; + this.datareceiver = null; + this.datatransmitter = null; + this.socket = null; + if (tmptransmitter != null) { + tmptransmitter.flush(); + } + if (tmpsocket != null) { + try { + tmpsocket.shutdownOutput(); + } catch (IOException ignore) { + } + try { + tmpsocket.shutdownInput(); + } catch (IOException ignore) { + } + tmpsocket.close(); + } } }