From: Mike Gelfand Date: Sat, 15 Jul 2017 05:46:31 +0000 (+0300) Subject: Revert dd538539aa, fix RPC queue processing X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=375f2642c8032971733f4b8e594834d6542ababd;p=transmission Revert dd538539aa, fix RPC queue processing Queue callback for items returning no new future was never called leaving queue alive and leading to memory leak in Qt client. --- diff --git a/qt/RpcQueue.cc b/qt/RpcQueue.cc index 09484ee62..c33f2e3af 100644 --- a/qt/RpcQueue.cc +++ b/qt/RpcQueue.cc @@ -72,9 +72,25 @@ void RpcQueue::runNext(RpcResponseFuture const& response) { assert(!myQueue.isEmpty()); - auto next = myQueue.dequeue(); - myNextErrorHandler = next.second; - myFutureWatcher.setFuture((next.first)(response)); + RpcResponseFuture const oldFuture = myFutureWatcher.future(); + + while (true) + { + auto next = myQueue.dequeue(); + myNextErrorHandler = next.second; + myFutureWatcher.setFuture((next.first)(response)); + + if (oldFuture != myFutureWatcher.future()) + { + break; + } + + if (myQueue.isEmpty()) + { + deleteLater(); + break; + } + } } void RpcQueue::run() diff --git a/qt/Session.cc b/qt/Session.cc index 1a710cdf9..cea7fbd53 100644 --- a/qt/Session.cc +++ b/qt/Session.cc @@ -995,7 +995,7 @@ void Session::addTorrent(AddData const& addMe, tr_variant* args, bool trashOrigi d->show(); }); - q->add([this, addMe, trashOriginal](RpcResponse const& r) + q->add([this, addMe](RpcResponse const& r) { tr_variant* dup; char const* str; @@ -1010,13 +1010,17 @@ void Session::addTorrent(AddData const& addMe, tr_variant* args, bool trashOrigi connect(d, SIGNAL(rejected()), d, SLOT(deleteLater())); d->show(); } - else if (trashOriginal && addMe.type == AddData::FILENAME) + }); + + if (trashOriginal && addMe.type == AddData::FILENAME) + { + q->add([this, addMe]() { QFile original(addMe.filename); original.setPermissions(QFile::ReadOwner | QFile::WriteOwner); original.remove(); - } - }); + }); + } q->run(); }