blob: 572c2a616f08570100bc7a0bc5ec7256493c0693 [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
Danil Chapovalov7b190362022-07-07 14:13:02 +020013#include "api/task_queue/pending_task_safety_flag.h"
14#include "api/units/time_delta.h"
Qingsi Wang1b368942018-06-13 13:54:08 -070015
16namespace webrtc {
17
Qingsi Wang1b368942018-06-13 13:54:08 -070018BasicRegatheringController::BasicRegatheringController(
19 const Config& config,
20 cricket::IceTransportInternal* ice_transport,
21 rtc::Thread* thread)
Steve Antonf4172382020-01-27 15:45:02 -080022 : config_(config), ice_transport_(ice_transport), thread_(thread) {
Niels Möller83830f32022-05-20 09:12:57 +020023 RTC_DCHECK(thread_);
Tomas Gunnarsson4b5d3232020-11-23 09:32:59 +010024 RTC_DCHECK_RUN_ON(thread_);
Qingsi Wang1b368942018-06-13 13:54:08 -070025 RTC_DCHECK(ice_transport_);
Alex Loiko9289eda2018-11-23 16:18:59 +000026 ice_transport_->SignalStateChanged.connect(
Qingsi Wang1b368942018-06-13 13:54:08 -070027 this, &BasicRegatheringController::OnIceTransportStateChanged);
28 ice_transport->SignalWritableState.connect(
29 this, &BasicRegatheringController::OnIceTransportWritableState);
30 ice_transport->SignalReceivingState.connect(
31 this, &BasicRegatheringController::OnIceTransportReceivingState);
32 ice_transport->SignalNetworkRouteChanged.connect(
33 this, &BasicRegatheringController::OnIceTransportNetworkRouteChanged);
34}
35
Tomas Gunnarsson4b5d3232020-11-23 09:32:59 +010036BasicRegatheringController::~BasicRegatheringController() {
37 RTC_DCHECK_RUN_ON(thread_);
38}
Qingsi Wang1b368942018-06-13 13:54:08 -070039
40void BasicRegatheringController::Start() {
Tomas Gunnarsson4b5d3232020-11-23 09:32:59 +010041 RTC_DCHECK_RUN_ON(thread_);
Qingsi Wang1b368942018-06-13 13:54:08 -070042 ScheduleRecurringRegatheringOnFailedNetworks();
Qingsi Wang1b368942018-06-13 13:54:08 -070043}
44
45void BasicRegatheringController::SetConfig(const Config& config) {
Tomas Gunnarsson4b5d3232020-11-23 09:32:59 +010046 RTC_DCHECK_RUN_ON(thread_);
47 bool need_reschedule_on_failed_networks =
48 pending_regathering_ && (config_.regather_on_failed_networks_interval !=
49 config.regather_on_failed_networks_interval);
Qingsi Wang1b368942018-06-13 13:54:08 -070050 config_ = config;
Tomas Gunnarsson4b5d3232020-11-23 09:32:59 +010051 if (need_reschedule_on_failed_networks) {
Qingsi Wang1b368942018-06-13 13:54:08 -070052 ScheduleRecurringRegatheringOnFailedNetworks();
53 }
54}
55
Qingsi Wang1b368942018-06-13 13:54:08 -070056void BasicRegatheringController::
57 ScheduleRecurringRegatheringOnFailedNetworks() {
Tomas Gunnarsson4b5d3232020-11-23 09:32:59 +010058 RTC_DCHECK_RUN_ON(thread_);
Qingsi Wang1b368942018-06-13 13:54:08 -070059 RTC_DCHECK(config_.regather_on_failed_networks_interval >= 0);
Tomas Gunnarsson4b5d3232020-11-23 09:32:59 +010060 // Reset pending_regathering_ to cancel any potentially pending tasks.
61 pending_regathering_.reset(new ScopedTaskSafety());
62
63 thread_->PostDelayedTask(
Danil Chapovalov7b190362022-07-07 14:13:02 +020064 SafeTask(pending_regathering_->flag(),
65 [this]() {
66 RTC_DCHECK_RUN_ON(thread_);
67 // Only regather when the current session is in the CLEARED
68 // state (i.e., not running or stopped). It is only
69 // possible to enter this state when we gather continually,
70 // so there is an implicit check on continual gathering
71 // here.
72 if (allocator_session_ && allocator_session_->IsCleared()) {
73 allocator_session_->RegatherOnFailedNetworks();
74 }
75 ScheduleRecurringRegatheringOnFailedNetworks();
76 }),
77 TimeDelta::Millis(config_.regather_on_failed_networks_interval));
Qingsi Wang1b368942018-06-13 13:54:08 -070078}
79
Qingsi Wang1b368942018-06-13 13:54:08 -070080} // namespace webrtc