| /* | |
| * 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 <algorithm> | |
| #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 |