P2PTransportChannel::OnCandidateResolved: fix resolver leak.

This change fixes a problem where the eventual destruction of a
completed resolver sometimes doesn't happen. This is because the
destruction is posted to the network thread, and if it's destroyed
before the closure is executed, the resolver is leaked.

The fix is in three parts:
1. The resolver->Destroy call is performed on closure destruction
   to make sure it will always run.
2. The closure is executed with task queue. This because the
   RTC_DCHECK on thread:140 fires with the invoker_.
3. It's not possible to guarantee the context Destroy is called on due
   to TaskQueue semantics. Therefore SignalThread::Destroy was changed
   to accept any calling context and only requiring it's the last
   public call to the object.

For unknown reasons, this leak doesn't trigger the leak checker, see
referred bugs for further investigation.

Bug: webrtc:7723, webrtc:11605, chromium:905542
Change-Id: I2681ff1d2416ccbc564974a65ac84781a9ed7aee
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/176125
Commit-Queue: Markus Handell <handellm@webrtc.org>
Reviewed-by: Tommi <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#31359}
This commit is contained in:
Markus Handell
2020-05-26 18:22:24 +02:00
committed by Commit Bot
parent b7c63ab83a
commit ff84d86d9c
5 changed files with 25 additions and 11 deletions

View File

@ -144,8 +144,9 @@ class SignalThread : public sigslot::has_slots<>, protected MessageHandler {
Thread* main_;
Worker worker_;
CriticalSection cs_;
State state_;
int refcount_;
State state_ RTC_GUARDED_BY(cs_);
int refcount_ RTC_GUARDED_BY(cs_);
bool destroy_called_ RTC_GUARDED_BY(cs_) = false;
RTC_DISALLOW_COPY_AND_ASSIGN(SignalThread);
};