blob: 572c2a616f08570100bc7a0bc5ec7256493c0693 [file] [log] [blame]
Qingsi Wang1b368942018-06-13 20:54:081/*
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 17:11:0011#include "p2p/base/regathering_controller.h"
Artem Titovc374d112022-06-16 19:27:4512
Danil Chapovalov7b190362022-07-07 12:13:0213#include "api/task_queue/pending_task_safety_flag.h"
14#include "api/units/time_delta.h"
Qingsi Wang1b368942018-06-13 20:54:0815
16namespace webrtc {
17
Qingsi Wang1b368942018-06-13 20:54:0818BasicRegatheringController::BasicRegatheringController(
19 const Config& config,
20 cricket::IceTransportInternal* ice_transport,
21 rtc::Thread* thread)
Steve Antonf4172382020-01-27 23:45:0222 : config_(config), ice_transport_(ice_transport), thread_(thread) {
Niels Möller83830f32022-05-20 07:12:5723 RTC_DCHECK(thread_);
Tomas Gunnarsson4b5d3232020-11-23 08:32:5924 RTC_DCHECK_RUN_ON(thread_);
Qingsi Wang1b368942018-06-13 20:54:0825 RTC_DCHECK(ice_transport_);
Alex Loiko9289eda2018-11-23 16:18:5926 ice_transport_->SignalStateChanged.connect(
Qingsi Wang1b368942018-06-13 20:54:0827 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 08:32:5936BasicRegatheringController::~BasicRegatheringController() {
37 RTC_DCHECK_RUN_ON(thread_);
38}
Qingsi Wang1b368942018-06-13 20:54:0839
40void BasicRegatheringController::Start() {
Tomas Gunnarsson4b5d3232020-11-23 08:32:5941 RTC_DCHECK_RUN_ON(thread_);
Qingsi Wang1b368942018-06-13 20:54:0842 ScheduleRecurringRegatheringOnFailedNetworks();
Qingsi Wang1b368942018-06-13 20:54:0843}
44
45void BasicRegatheringController::SetConfig(const Config& config) {
Tomas Gunnarsson4b5d3232020-11-23 08:32:5946 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 20:54:0850 config_ = config;
Tomas Gunnarsson4b5d3232020-11-23 08:32:5951 if (need_reschedule_on_failed_networks) {
Qingsi Wang1b368942018-06-13 20:54:0852 ScheduleRecurringRegatheringOnFailedNetworks();
53 }
54}
55
Qingsi Wang1b368942018-06-13 20:54:0856void BasicRegatheringController::
57 ScheduleRecurringRegatheringOnFailedNetworks() {
Tomas Gunnarsson4b5d3232020-11-23 08:32:5958 RTC_DCHECK_RUN_ON(thread_);
Qingsi Wang1b368942018-06-13 20:54:0859 RTC_DCHECK(config_.regather_on_failed_networks_interval >= 0);
Tomas Gunnarsson4b5d3232020-11-23 08:32:5960 // Reset pending_regathering_ to cancel any potentially pending tasks.
61 pending_regathering_.reset(new ScopedTaskSafety());
62
63 thread_->PostDelayedTask(
Danil Chapovalov7b190362022-07-07 12:13:0264 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 20:54:0878}
79
Qingsi Wang1b368942018-06-13 20:54:0880} // namespace webrtc