blob: e563d892e685e87d65587757073a4db196843397 [file] [log] [blame] [edit]
/*
* 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