Remove 2 Invokes to the network thread when creating a channel.
...and one when destroying a channel object. This CL removes Init_n() and Deinit_n() from the BaseChannel class. Channel classes now use SetRtpTransport to do initialization and uninitialization on the network thread. Notably if an implementation has called SetRtpTransport() with a valid transport pointer, it is required that SetRtpTransport be called again with a nullptr before the channel object can be deleted. In situations where multiple channels are created, this can mean a substantial reduction in thread hops. We still hop to the worker in order to construct the objects - this can probably be avoided and SetChannel() is still a synchronous operation for the transceivers. Furthermore, teardown of channel objects also still happens synchronously and across network/worker/signaling threads. Bug: webrtc:11992 Change-Id: I68ca7596e181fc82996e3e290733d97381aa5e78 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/246740 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org> Cr-Commit-Position: refs/heads/main@{#35738}
This commit is contained in:
committed by
WebRTC LUCI CQ
parent
4f19950660
commit
4f8a58c3d2
@ -156,7 +156,9 @@ RtpTransceiver::~RtpTransceiver() {
|
||||
}
|
||||
}
|
||||
|
||||
void RtpTransceiver::SetChannel(cricket::ChannelInterface* channel) {
|
||||
void RtpTransceiver::SetChannel(
|
||||
cricket::ChannelInterface* channel,
|
||||
std::function<RtpTransportInternal*(const std::string&)> transport_lookup) {
|
||||
RTC_DCHECK_RUN_ON(thread_);
|
||||
// Cannot set a non-null channel on a stopped transceiver.
|
||||
if (stopped_ && channel) {
|
||||
@ -164,6 +166,7 @@ void RtpTransceiver::SetChannel(cricket::ChannelInterface* channel) {
|
||||
}
|
||||
|
||||
RTC_DCHECK(channel || channel_);
|
||||
RTC_DCHECK(!channel || transport_lookup) << "lookup function not supplied";
|
||||
|
||||
RTC_LOG_THREAD_BLOCK_COUNT();
|
||||
|
||||
@ -189,11 +192,13 @@ void RtpTransceiver::SetChannel(cricket::ChannelInterface* channel) {
|
||||
channel_manager_->network_thread()->Invoke<void>(RTC_FROM_HERE, [&]() {
|
||||
if (channel_) {
|
||||
channel_->SetFirstPacketReceivedCallback(nullptr);
|
||||
channel_->SetRtpTransport(nullptr);
|
||||
}
|
||||
|
||||
channel_ = channel;
|
||||
|
||||
if (channel_) {
|
||||
channel_->SetRtpTransport(transport_lookup(channel_->content_name()));
|
||||
channel_->SetFirstPacketReceivedCallback(
|
||||
[thread = thread_, flag = signaling_thread_safety_, this]() mutable {
|
||||
thread->PostTask(ToQueuedTask(
|
||||
|
||||
Reference in New Issue
Block a user