blob: 3fe5c00cfba26092954a05898eaa05b4848ea681 [file] [log] [blame]
Qingsi Wang1b368942018-06-13 13:54:08 -07001/*
2 * Copyright 2018 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Steve Anton10542f22019-01-11 09:11:00 -080011#include "p2p/base/regathering_controller.h"
Artem Titovc374d112022-06-16 21:27:45 +020012
13#include "api/task_queue/to_queued_task.h"
Qingsi Wang1b368942018-06-13 13:54:08 -070014
15namespace webrtc {
16
Qingsi Wang1b368942018-06-13 13:54:08 -070017BasicRegatheringController::BasicRegatheringController(
18 const Config& config,
19 cricket::IceTransportInternal* ice_transport,
20 rtc::Thread* thread)
Steve Antonf4172382020-01-27 15:45:02 -080021 : config_(config), ice_transport_(ice_transport), thread_(thread) {
Niels Möller83830f32022-05-20 09:12:57 +020022 RTC_DCHECK(thread_);
Tomas Gunnarsson4b5d3232020-11-23 09:32:59 +010023 RTC_DCHECK_RUN_ON(thread_);
Qingsi Wang1b368942018-06-13 13:54:08 -070024 RTC_DCHECK(ice_transport_);
Alex Loiko9289eda2018-11-23 16:18:59 +000025 ice_transport_->SignalStateChanged.connect(
Qingsi Wang1b368942018-06-13 13:54:08 -070026 this, &BasicRegatheringController::OnIceTransportStateChanged);
27 ice_transport->SignalWritableState.connect(
28 this, &BasicRegatheringController::OnIceTransportWritableState);
29 ice_transport->SignalReceivingState.connect(
30 this, &BasicRegatheringController::OnIceTransportReceivingState);
31 ice_transport->SignalNetworkRouteChanged.connect(
32 this, &BasicRegatheringController::OnIceTransportNetworkRouteChanged);
33}
34
Tomas Gunnarsson4b5d3232020-11-23 09:32:59 +010035BasicRegatheringController::~BasicRegatheringController() {
36 RTC_DCHECK_RUN_ON(thread_);
37}
Qingsi Wang1b368942018-06-13 13:54:08 -070038
39void BasicRegatheringController::Start() {
Tomas Gunnarsson4b5d3232020-11-23 09:32:59 +010040 RTC_DCHECK_RUN_ON(thread_);
Qingsi Wang1b368942018-06-13 13:54:08 -070041 ScheduleRecurringRegatheringOnFailedNetworks();
Qingsi Wang1b368942018-06-13 13:54:08 -070042}
43
44void BasicRegatheringController::SetConfig(const Config& config) {
Tomas Gunnarsson4b5d3232020-11-23 09:32:59 +010045 RTC_DCHECK_RUN_ON(thread_);
46 bool need_reschedule_on_failed_networks =
47 pending_regathering_ && (config_.regather_on_failed_networks_interval !=
48 config.regather_on_failed_networks_interval);
Qingsi Wang1b368942018-06-13 13:54:08 -070049 config_ = config;
Tomas Gunnarsson4b5d3232020-11-23 09:32:59 +010050 if (need_reschedule_on_failed_networks) {
Qingsi Wang1b368942018-06-13 13:54:08 -070051 ScheduleRecurringRegatheringOnFailedNetworks();
52 }
53}
54
Qingsi Wang1b368942018-06-13 13:54:08 -070055void BasicRegatheringController::
56 ScheduleRecurringRegatheringOnFailedNetworks() {
Tomas Gunnarsson4b5d3232020-11-23 09:32:59 +010057 RTC_DCHECK_RUN_ON(thread_);
Qingsi Wang1b368942018-06-13 13:54:08 -070058 RTC_DCHECK(config_.regather_on_failed_networks_interval >= 0);
Tomas Gunnarsson4b5d3232020-11-23 09:32:59 +010059 // Reset pending_regathering_ to cancel any potentially pending tasks.
60 pending_regathering_.reset(new ScopedTaskSafety());
61
62 thread_->PostDelayedTask(
63 ToQueuedTask(*pending_regathering_.get(),
64 [this]() {
65 RTC_DCHECK_RUN_ON(thread_);
66 // Only regather when the current session is in the CLEARED
67 // state (i.e., not running or stopped). It is only
68 // possible to enter this state when we gather continually,
69 // so there is an implicit check on continual gathering
70 // here.
71 if (allocator_session_ &&
72 allocator_session_->IsCleared()) {
73 allocator_session_->RegatherOnFailedNetworks();
74 }
75 ScheduleRecurringRegatheringOnFailedNetworks();
76 }),
Qingsi Wang1b368942018-06-13 13:54:08 -070077 config_.regather_on_failed_networks_interval);
78}
79
Qingsi Wang1b368942018-06-13 13:54:08 -070080} // namespace webrtc