always flush disk I/O job queue before shutdown

Leaving jobs on the queue can lead to memory leaks
This commit is contained in:
Steven Siloti 2019-03-24 17:41:52 -07:00 committed by Arvid Norberg
parent 64600f444b
commit 8d9c746149
2 changed files with 8 additions and 3 deletions

View File

@ -261,16 +261,23 @@ constexpr disk_job_flags_t disk_interface::cache_hit;
TORRENT_ASSERT(m_magic == 0x1337); TORRENT_ASSERT(m_magic == 0x1337);
m_magic = 0xdead; m_magic = 0xdead;
TORRENT_ASSERT(m_generic_io_jobs.m_queued_jobs.empty());
TORRENT_ASSERT(m_hash_io_jobs.m_queued_jobs.empty());
} }
#endif #endif
void disk_io_thread::abort(bool const wait) void disk_io_thread::abort(bool const wait)
{ {
// first make sure queued jobs have been submitted
// otherwise the queue may not get processed
submit_jobs();
// abuse the job mutex to make setting m_abort and checking the thread count atomic // abuse the job mutex to make setting m_abort and checking the thread count atomic
// see also the comment in thread_fun // see also the comment in thread_fun
std::unique_lock<std::mutex> l(m_job_mutex); std::unique_lock<std::mutex> l(m_job_mutex);
if (m_abort.exchange(true)) return; if (m_abort.exchange(true)) return;
bool const no_threads = m_num_running_threads == 0; bool const no_threads = m_generic_threads.num_threads() == 0
&& m_hash_threads.num_threads() == 0;
// abort outstanding jobs belonging to this torrent // abort outstanding jobs belonging to this torrent
for (auto i = m_hash_io_jobs.m_queued_jobs.iterate(); i.get(); i.next()) for (auto i = m_hash_io_jobs.m_queued_jobs.iterate(); i.get(); i.next())
@ -3100,7 +3107,6 @@ constexpr disk_job_flags_t disk_interface::cache_hit;
DLOG("started disk thread %s\n", thread_id_str.str().c_str()); DLOG("started disk thread %s\n", thread_id_str.str().c_str());
std::unique_lock<std::mutex> l(m_job_mutex); std::unique_lock<std::mutex> l(m_job_mutex);
if (m_abort) return;
++m_num_running_threads; ++m_num_running_threads;
m_stats_counters.inc_stats_counter(counters::num_running_threads, 1); m_stats_counters.inc_stats_counter(counters::num_running_threads, 1);

View File

@ -71,7 +71,6 @@ namespace libtorrent {
{ {
std::unique_lock<std::mutex> l(m_mutex); std::unique_lock<std::mutex> l(m_mutex);
if (m_abort) return; if (m_abort) return;
m_max_threads = 0;
m_abort = true; m_abort = true;
m_idle_timer.cancel(); m_idle_timer.cancel();
stop_threads(int(m_threads.size())); stop_threads(int(m_threads.size()));