From 5fa9ecb3dff1a5918c202b72a5db313c0b7b879a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Remko=20Tron=C3=A7on?= Date: Fri, 10 Sep 2010 17:02:18 +0200 Subject: Fixed some memory leaks. diff --git a/Swiften/Client/ClientSession.cpp b/Swiften/Client/ClientSession.cpp index daffbc6..17b3931 100644 --- a/Swiften/Client/ClientSession.cpp +++ b/Swiften/Client/ClientSession.cpp @@ -56,10 +56,10 @@ ClientSession::~ClientSession() { } void ClientSession::start() { - stream->onStreamStartReceived.connect(boost::bind(&ClientSession::handleStreamStart, shared_from_this(), _1)); - stream->onElementReceived.connect(boost::bind(&ClientSession::handleElement, shared_from_this(), _1)); - stream->onError.connect(boost::bind(&ClientSession::handleStreamError, shared_from_this(), _1)); - stream->onTLSEncrypted.connect(boost::bind(&ClientSession::handleTLSEncrypted, shared_from_this())); + streamOnStreamStartReceivedConnection = stream->onStreamStartReceived.connect(boost::bind(&ClientSession::handleStreamStart, shared_from_this(), _1)); + streamOnElementReceivedConnection = stream->onElementReceived.connect(boost::bind(&ClientSession::handleElement, shared_from_this(), _1)); + streamOnErrorConnection = stream->onError.connect(boost::bind(&ClientSession::handleStreamError, shared_from_this(), _1)); + streamOnTLSEncryptedConnection = stream->onTLSEncrypted.connect(boost::bind(&ClientSession::handleTLSEncrypted, shared_from_this())); assert(state == Initial); state = WaitingForStreamStart; @@ -347,6 +347,10 @@ void ClientSession::finishSession(Error::Type error) { void ClientSession::finishSession(boost::shared_ptr error) { state = Finished; stream->setWhitespacePingEnabled(false); + streamOnStreamStartReceivedConnection.disconnect(); + streamOnElementReceivedConnection.disconnect(); + streamOnErrorConnection.disconnect(); + streamOnTLSEncryptedConnection.disconnect(); onFinished(error); } diff --git a/Swiften/Client/ClientSession.h b/Swiften/Client/ClientSession.h index 359d7c8..cd364fe 100644 --- a/Swiften/Client/ClientSession.h +++ b/Swiften/Client/ClientSession.h @@ -123,5 +123,9 @@ namespace Swift { ClientAuthenticator* authenticator; boost::shared_ptr stanzaAckRequester_; boost::shared_ptr stanzaAckResponder_; + boost::bsignals::connection streamOnStreamStartReceivedConnection; + boost::bsignals::connection streamOnElementReceivedConnection; + boost::bsignals::connection streamOnErrorConnection; + boost::bsignals::connection streamOnTLSEncryptedConnection; }; } diff --git a/Swiften/Client/UnitTest/ClientSessionTest.cpp b/Swiften/Client/UnitTest/ClientSessionTest.cpp index 2762188..2cd9fd2 100644 --- a/Swiften/Client/UnitTest/ClientSessionTest.cpp +++ b/Swiften/Client/UnitTest/ClientSessionTest.cpp @@ -82,6 +82,8 @@ class ClientSessionTest : public CppUnit::TestFixture { server->onTLSEncrypted(); server->receiveStreamStart(); server->sendStreamStart(); + + session->finish(); } void testStartTLS_ServerError() { @@ -126,6 +128,8 @@ class ClientSessionTest : public CppUnit::TestFixture { server->receiveAuthRequest("PLAIN"); server->sendAuthSuccess(); server->receiveStreamStart(); + + session->finish(); } void testAuthenticate_Unauthorized() { @@ -190,6 +194,8 @@ class ClientSessionTest : public CppUnit::TestFixture { CPPUNIT_ASSERT(session->getStreamManagementEnabled()); // TODO: Test if the requesters & responders do their work CPPUNIT_ASSERT_EQUAL(ClientSession::Initialized, session->getState()); + + session->finish(); } void testStreamManagement_Failed() { @@ -211,6 +217,8 @@ class ClientSessionTest : public CppUnit::TestFixture { CPPUNIT_ASSERT(!session->getStreamManagementEnabled()); CPPUNIT_ASSERT_EQUAL(ClientSession::Initialized, session->getState()); + + session->finish(); } diff --git a/Swiften/Disco/UnitTest/CapsManagerTest.cpp b/Swiften/Disco/UnitTest/CapsManagerTest.cpp index 2156c3e..7925ae7 100644 --- a/Swiften/Disco/UnitTest/CapsManagerTest.cpp +++ b/Swiften/Disco/UnitTest/CapsManagerTest.cpp @@ -57,6 +57,7 @@ class CapsManagerTest : public CppUnit::TestFixture { } void tearDown() { + delete storage; delete iqRouter; delete stanzaChannel; } diff --git a/Swiften/Network/Connector.cpp b/Swiften/Network/Connector.cpp index 34fdf0b..d9a4c5d 100644 --- a/Swiften/Network/Connector.cpp +++ b/Swiften/Network/Connector.cpp @@ -112,7 +112,7 @@ void Connector::tryConnect(const HostAddressPort& target) { assert(!currentConnection); //std::cout << "Connector::tryConnect() " << target.getAddress().toString() << " " << target.getPort() << std::endl; currentConnection = connectionFactory->createConnection(); - currentConnection->onConnectFinished.connect(boost::bind(&Connector::handleConnectionConnectFinished, shared_from_this(), _1)); + connectFinishedConnection = currentConnection->onConnectFinished.connect(boost::bind(&Connector::handleConnectionConnectFinished, shared_from_this(), _1)); currentConnection->connect(target); } @@ -140,6 +140,13 @@ void Connector::finish(boost::shared_ptr connection) { timer->stop(); timer.reset(); } + if (serviceQuery) { + serviceQuery.reset(); + } + if (addressQuery) { + addressQuery.reset(); + } + connectFinishedConnection.disconnect(); onConnectFinished(connection); } diff --git a/Swiften/Network/Connector.h b/Swiften/Network/Connector.h index 6442a8f..36026de 100644 --- a/Swiften/Network/Connector.h +++ b/Swiften/Network/Connector.h @@ -65,5 +65,6 @@ namespace Swift { std::deque addressQueryResults; bool queriedAllServices; boost::shared_ptr currentConnection; + boost::bsignals::connection connectFinishedConnection; }; }; -- cgit v0.10.2-6-g49f6