From f9187481a14493a729987ebbcfd10839b2439b96 Mon Sep 17 00:00:00 2001
From: Tobias Markmann <tm@ayena.de>
Date: Thu, 29 Sep 2011 10:25:23 +0200
Subject: In case of writing when calling disconnect() postpone socket.close()
 to when writing has finished.

License: This patch is BSD-licensed, see http://www.opensource.org/licenses/bsd-license.php

diff --git a/Swiften/Network/BoostConnection.cpp b/Swiften/Network/BoostConnection.cpp
index 043743e..534ebdb 100644
--- a/Swiften/Network/BoostConnection.cpp
+++ b/Swiften/Network/BoostConnection.cpp
@@ -51,7 +51,7 @@ class SharedBuffer {
 // -----------------------------------------------------------------------------
 
 BoostConnection::BoostConnection(boost::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop) :
-		eventLoop(eventLoop), ioService(ioService), socket_(*ioService), writing_(false) {
+	eventLoop(eventLoop), ioService(ioService), socket_(*ioService), writing_(false), closeSocketAfterNextWrite_(false) {
 }
 
 BoostConnection::~BoostConnection() {
@@ -75,10 +75,11 @@ void BoostConnection::disconnect() {
 	// Mac OS X apparently exhibits a problem where closing a socket during a write could potentially go into uninterruptable sleep.
 	// See e.g. http://bugs.python.org/issue7401
 	// We therefore wait until any pending write finishes, which hopefully should fix our hang on exit during close().
-	while (writing_) {
-		Swift::sleep(10);
+	if (writing_) {
+		closeSocketAfterNextWrite_ = true;
+	} else {
+		socket_.close();
 	}
-	socket_.close();
 }
 
 void BoostConnection::write(const SafeByteArray& data) {
@@ -86,6 +87,9 @@ void BoostConnection::write(const SafeByteArray& data) {
 	if (!writing_) {
 		writing_ = true;
 		doWrite(data);
+		if (closeSocketAfterNextWrite_) {
+			socket_.close();
+		}
 	}
 	else {
 		append(writeQueue_, data);
diff --git a/Swiften/Network/BoostConnection.h b/Swiften/Network/BoostConnection.h
index 7d5ec60..2f0c7be 100644
--- a/Swiften/Network/BoostConnection.h
+++ b/Swiften/Network/BoostConnection.h
@@ -63,5 +63,6 @@ namespace Swift {
 			boost::mutex writeMutex_;
 			bool writing_;
 			SafeByteArray writeQueue_;
+			bool closeSocketAfterNextWrite_;
 	};
 }
-- 
cgit v0.10.2-6-g49f6