asio handlers are now properly cancelled when destructing the session object, race conditions are avoided by waiting for the io service to complete all tasks

This commit is contained in:
Arvid Norberg
2007-10-26 07:14:19 +00:00
parent fe5e88b548
commit 8f07edbed2
11 changed files with 77 additions and 34 deletions

View File

@@ -96,7 +96,9 @@ namespace libtorrent
m_name_lookup.async_resolve(q
, m_strand.wrap(boost::bind(
&udp_tracker_connection::name_lookup, self(), _1, _2)));
set_timeout(m_settings.tracker_completion_timeout
set_timeout(req.event == tracker_request::stopped
? m_settings.stop_tracker_timeout
: m_settings.tracker_completion_timeout
, m_settings.tracker_receive_timeout);
}
@@ -156,11 +158,20 @@ namespace libtorrent
void udp_tracker_connection::on_timeout()
{
m_socket.close();
asio::error_code ec;
m_socket.close(ec);
m_name_lookup.cancel();
fail_timeout();
}
void udp_tracker_connection::close()
{
asio::error_code ec;
m_socket.close(ec);
m_name_lookup.cancel();
tracker_connection::close();
}
void udp_tracker_connection::send_udp_connect()
{
#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING)
@@ -468,6 +479,7 @@ namespace libtorrent
, complete, incomplete);
m_man.remove_request(this);
close();
return;
}
catch (std::exception& e)
@@ -543,6 +555,7 @@ namespace libtorrent
if (!cb)
{
m_man.remove_request(this);
close();
return;
}
@@ -551,6 +564,7 @@ namespace libtorrent
, complete, incomplete);
m_man.remove_request(this);
close();
}
catch (std::exception& e)
{