Add checks for Connection construction/destruction.

Make sure that instances are always created+deleted on the
network thread.

Bug: webrtc:11988
Change-Id: I4fb5dd5bd14768d89ca78b348988a797fcdd130a
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/249942
Reviewed-by: Niels Moller <nisse@webrtc.org>
Auto-Submit: Tomas Gunnarsson <tommi@webrtc.org>
Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#35842}
This commit is contained in:
Tommi 2022-01-31 09:12:48 +01:00 committed by WebRTC LUCI CQ
parent 66c4036d1b
commit cb01e5ecb2
2 changed files with 21 additions and 4 deletions

View File

@ -282,7 +282,8 @@ int ConnectionRequest::resend_delay() {
Connection::Connection(Port* port,
size_t index,
const Candidate& remote_candidate)
: id_(rtc::CreateRandomId()),
: network_thread_(port->thread()),
id_(rtc::CreateRandomId()),
port_(port),
local_candidate_index_(index),
remote_candidate_(remote_candidate),
@ -304,6 +305,7 @@ Connection::Connection(Port* port,
time_created_ms_(rtc::TimeMillis()),
field_trials_(&kDefaultFieldTrials),
rtt_estimate_(DEFAULT_RTT_ESTIMATE_HALF_TIME_MS) {
RTC_DCHECK_RUN_ON(network_thread());
// All of our connections start in WAITING state.
// TODO(mallinath) - Start connections from STATE_FROZEN.
// Wire up to send stun packets
@ -311,7 +313,13 @@ Connection::Connection(Port* port,
RTC_LOG(LS_INFO) << ToString() << ": Connection created";
}
Connection::~Connection() {}
Connection::~Connection() {
RTC_DCHECK_RUN_ON(network_thread());
}
webrtc::TaskQueueBase* Connection::network_thread() const {
return network_thread_;
}
const Candidate& Connection::local_candidate() const {
RTC_DCHECK(local_candidate_index_ < port_->Candidates().size());
@ -750,6 +758,7 @@ void Connection::Destroy() {
// tests, with a workaround in
// AutoSocketServerThread::~AutoSocketServerThread.
RTC_LOG(LS_VERBOSE) << ToString() << ": Connection destroyed";
// TODO(bugs.webrtc.org/11988): Use PostTask.
port_->thread()->Post(RTC_FROM_HERE, this, MSG_DELETE);
LogCandidatePairConfig(webrtc::IceCandidatePairConfigType::kDestroyed);
}

View File

@ -88,6 +88,8 @@ class Connection : public CandidatePairInterface,
// A unique ID assigned when the connection is created.
uint32_t id() const { return id_; }
webrtc::TaskQueueBase* network_thread() const;
// Implementation of virtual methods in CandidatePairInterface.
// Returns the description of the local port
const Candidate& local_candidate() const override;
@ -369,8 +371,14 @@ class Connection : public CandidatePairInterface,
Port* port() { return port_; }
const Port* port() const { return port_; }
uint32_t id_;
Port* port_;
// NOTE: A pointer to the network thread is held by `port_` so in theory we
// shouldn't need to hold on to this pointer here, but rather defer to
// port_->thread(). However, some tests delete the classes in the wrong order
// so `port_` may be deleted before an instance of this class is deleted.
// TODO(tommi): This ^^^ should be fixed.
webrtc::TaskQueueBase* const network_thread_;
const uint32_t id_;
Port* const port_;
size_t local_candidate_index_;
Candidate remote_candidate_;