/* * Copyright 2025 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "test/time_controller/simulated_time_task_queue_controller.h" #include #include "api/task_queue/task_queue_factory.h" #include "api/units/time_delta.h" #include "api/units/timestamp.h" #include "rtc_base/checks.h" #include "rtc_base/synchronization/yield_policy.h" #include "system_wrappers/include/clock.h" namespace webrtc { SimulatedTimeTaskQueueController::SimulatedTimeTaskQueueController( Timestamp start_time) : sim_clock_(start_time.us()), impl_(start_time), yield_policy_(&impl_) {} SimulatedTimeTaskQueueController::~SimulatedTimeTaskQueueController() = default; Clock* SimulatedTimeTaskQueueController::GetClock() { return &sim_clock_; } TaskQueueFactory* SimulatedTimeTaskQueueController::GetTaskQueueFactory() { return &impl_; } // This implementation is almost identical to // `GlobalSimulatdTimeController::AdvanceTime`, with the main difference that // the process-global clock is not overwritten. void SimulatedTimeTaskQueueController::AdvanceTime(TimeDelta duration) { ScopedYieldPolicy yield_policy(&impl_); Timestamp current_time = impl_.CurrentTime(); RTC_DCHECK_EQ(current_time, sim_clock_.CurrentTime()); Timestamp target_time = current_time + duration; while (current_time < target_time) { impl_.RunReadyRunners(); Timestamp next_time = std::min(impl_.NextRunTime(), target_time); impl_.AdvanceTime(next_time); auto delta = next_time - current_time; current_time = next_time; sim_clock_.AdvanceTimeMicroseconds(delta.us()); } // After time has been simulated up until `target_time` we also need to run // tasks meant to be executed at `target_time`. impl_.RunReadyRunners(); } } // namespace webrtc