summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/audio_core/stream.cpp14
-rw-r--r--src/audio_core/stream.h6
-rw-r--r--src/core/core_timing.cpp8
-rw-r--r--src/core/core_timing.h8
-rw-r--r--src/core/hardware_interrupt_manager.cpp2
-rw-r--r--src/core/hle/kernel/kernel.cpp6
-rw-r--r--src/core/hle/kernel/server_session.cpp4
-rw-r--r--src/core/hle/kernel/time_manager.cpp3
-rw-r--r--src/core/hle/service/hid/hid.cpp12
-rw-r--r--src/core/hle/service/nvflinger/nvflinger.cpp15
-rw-r--r--src/core/memory/cheat_engine.cpp7
-rw-r--r--src/core/tools/freezer.cpp9
-rw-r--r--src/tests/core/core_timing.cpp13
13 files changed, 58 insertions, 49 deletions
diff --git a/src/audio_core/stream.cpp b/src/audio_core/stream.cpp
index aab3e979a..abd8576e2 100644
--- a/src/audio_core/stream.cpp
+++ b/src/audio_core/stream.cpp
@@ -59,11 +59,9 @@ Stream::State Stream::GetState() const {
59 return state; 59 return state;
60} 60}
61 61
62s64 Stream::GetBufferReleaseNS(const Buffer& buffer) const { 62std::chrono::nanoseconds Stream::GetBufferReleaseNS(const Buffer& buffer) const {
63 const std::size_t num_samples{buffer.GetSamples().size() / GetNumChannels()}; 63 const std::size_t num_samples{buffer.GetSamples().size() / GetNumChannels()};
64 const auto ns = 64 return std::chrono::nanoseconds((static_cast<u64>(num_samples) * 1000000000ULL) / sample_rate);
65 std::chrono::nanoseconds((static_cast<u64>(num_samples) * 1000000000ULL) / sample_rate);
66 return ns.count();
67} 65}
68 66
69static void VolumeAdjustSamples(std::vector<s16>& samples, float game_volume) { 67static void VolumeAdjustSamples(std::vector<s16>& samples, float game_volume) {
@@ -105,10 +103,10 @@ void Stream::PlayNextBuffer(s64 cycles_late) {
105 103
106 sink_stream.EnqueueSamples(GetNumChannels(), active_buffer->GetSamples()); 104 sink_stream.EnqueueSamples(GetNumChannels(), active_buffer->GetSamples());
107 105
108 core_timing.ScheduleEvent( 106 const auto time_stretch_delta = std::chrono::nanoseconds{
109 GetBufferReleaseNS(*active_buffer) - 107 Settings::values.enable_audio_stretching.GetValue() ? 0 : cycles_late};
110 (Settings::values.enable_audio_stretching.GetValue() ? 0 : cycles_late), 108 const auto future_time = GetBufferReleaseNS(*active_buffer) - time_stretch_delta;
111 release_event, {}); 109 core_timing.ScheduleEvent(future_time, release_event, {});
112} 110}
113 111
114void Stream::ReleaseActiveBuffer(s64 cycles_late) { 112void Stream::ReleaseActiveBuffer(s64 cycles_late) {
diff --git a/src/audio_core/stream.h b/src/audio_core/stream.h
index 524376257..2febd647c 100644
--- a/src/audio_core/stream.h
+++ b/src/audio_core/stream.h
@@ -4,6 +4,7 @@
4 4
5#pragma once 5#pragma once
6 6
7#include <chrono>
7#include <functional> 8#include <functional>
8#include <memory> 9#include <memory>
9#include <string> 10#include <string>
@@ -96,10 +97,7 @@ private:
96 void ReleaseActiveBuffer(s64 cycles_late = 0); 97 void ReleaseActiveBuffer(s64 cycles_late = 0);
97 98
98 /// Gets the number of core cycles when the specified buffer will be released 99 /// Gets the number of core cycles when the specified buffer will be released
99 s64 GetBufferReleaseNS(const Buffer& buffer) const; 100 std::chrono::nanoseconds GetBufferReleaseNS(const Buffer& buffer) const;
100
101 /// Gets the number of core cycles when the specified buffer will be released
102 s64 GetBufferReleaseNSHostTiming(const Buffer& buffer) const;
103 101
104 u32 sample_rate; ///< Sample rate of the stream 102 u32 sample_rate; ///< Sample rate of the stream
105 Format format; ///< Format of the stream 103 Format format; ///< Format of the stream
diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp
index a63e60461..a5d084e08 100644
--- a/src/core/core_timing.cpp
+++ b/src/core/core_timing.cpp
@@ -53,7 +53,7 @@ void CoreTiming::ThreadEntry(CoreTiming& instance) {
53 instance.ThreadLoop(); 53 instance.ThreadLoop();
54} 54}
55 55
56void CoreTiming::Initialize(std::function<void(void)>&& on_thread_init_) { 56void CoreTiming::Initialize(std::function<void()>&& on_thread_init_) {
57 on_thread_init = std::move(on_thread_init_); 57 on_thread_init = std::move(on_thread_init_);
58 event_fifo_id = 0; 58 event_fifo_id = 0;
59 shutting_down = false; 59 shutting_down = false;
@@ -106,11 +106,11 @@ bool CoreTiming::HasPendingEvents() const {
106 return !(wait_set && event_queue.empty()); 106 return !(wait_set && event_queue.empty());
107} 107}
108 108
109void CoreTiming::ScheduleEvent(s64 ns_into_future, const std::shared_ptr<EventType>& event_type, 109void CoreTiming::ScheduleEvent(std::chrono::nanoseconds ns_into_future,
110 u64 userdata) { 110 const std::shared_ptr<EventType>& event_type, u64 userdata) {
111 { 111 {
112 std::scoped_lock scope{basic_lock}; 112 std::scoped_lock scope{basic_lock};
113 const u64 timeout = static_cast<u64>(GetGlobalTimeNs().count() + ns_into_future); 113 const u64 timeout = static_cast<u64>((GetGlobalTimeNs() + ns_into_future).count());
114 114
115 event_queue.emplace_back(Event{timeout, event_fifo_id++, userdata, event_type}); 115 event_queue.emplace_back(Event{timeout, event_fifo_id++, userdata, event_type});
116 116
diff --git a/src/core/core_timing.h b/src/core/core_timing.h
index 72faaab64..9b9f18daf 100644
--- a/src/core/core_timing.h
+++ b/src/core/core_timing.h
@@ -62,7 +62,7 @@ public:
62 62
63 /// CoreTiming begins at the boundary of timing slice -1. An initial call to Advance() is 63 /// CoreTiming begins at the boundary of timing slice -1. An initial call to Advance() is
64 /// required to end slice - 1 and start slice 0 before the first cycle of code is executed. 64 /// required to end slice - 1 and start slice 0 before the first cycle of code is executed.
65 void Initialize(std::function<void(void)>&& on_thread_init_); 65 void Initialize(std::function<void()>&& on_thread_init_);
66 66
67 /// Tears down all timing related functionality. 67 /// Tears down all timing related functionality.
68 void Shutdown(); 68 void Shutdown();
@@ -95,8 +95,8 @@ public:
95 bool HasPendingEvents() const; 95 bool HasPendingEvents() const;
96 96
97 /// Schedules an event in core timing 97 /// Schedules an event in core timing
98 void ScheduleEvent(s64 ns_into_future, const std::shared_ptr<EventType>& event_type, 98 void ScheduleEvent(std::chrono::nanoseconds ns_into_future,
99 u64 userdata = 0); 99 const std::shared_ptr<EventType>& event_type, u64 userdata = 0);
100 100
101 void UnscheduleEvent(const std::shared_ptr<EventType>& event_type, u64 userdata); 101 void UnscheduleEvent(const std::shared_ptr<EventType>& event_type, u64 userdata);
102 102
@@ -161,7 +161,7 @@ private:
161 std::atomic<bool> wait_set{}; 161 std::atomic<bool> wait_set{};
162 std::atomic<bool> shutting_down{}; 162 std::atomic<bool> shutting_down{};
163 std::atomic<bool> has_started{}; 163 std::atomic<bool> has_started{};
164 std::function<void(void)> on_thread_init{}; 164 std::function<void()> on_thread_init{};
165 165
166 bool is_multicore{}; 166 bool is_multicore{};
167 167
diff --git a/src/core/hardware_interrupt_manager.cpp b/src/core/hardware_interrupt_manager.cpp
index c629d9fa1..e7fd71e2e 100644
--- a/src/core/hardware_interrupt_manager.cpp
+++ b/src/core/hardware_interrupt_manager.cpp
@@ -23,7 +23,7 @@ InterruptManager::~InterruptManager() = default;
23 23
24void InterruptManager::GPUInterruptSyncpt(const u32 syncpoint_id, const u32 value) { 24void InterruptManager::GPUInterruptSyncpt(const u32 syncpoint_id, const u32 value) {
25 const u64 msg = (static_cast<u64>(syncpoint_id) << 32ULL) | value; 25 const u64 msg = (static_cast<u64>(syncpoint_id) << 32ULL) | value;
26 system.CoreTiming().ScheduleEvent(10, gpu_interrupt_event, msg); 26 system.CoreTiming().ScheduleEvent(std::chrono::nanoseconds{10}, gpu_interrupt_event, msg);
27} 27}
28 28
29} // namespace Core::Hardware 29} // namespace Core::Hardware
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index 1f2af7a1b..35fb270b8 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -149,11 +149,13 @@ struct KernelCore::Impl {
149 SchedulerLock lock(kernel); 149 SchedulerLock lock(kernel);
150 global_scheduler.PreemptThreads(); 150 global_scheduler.PreemptThreads();
151 } 151 }
152 s64 time_interval = Core::Timing::msToCycles(std::chrono::milliseconds(10)); 152 const auto time_interval = std::chrono::nanoseconds{
153 Core::Timing::msToCycles(std::chrono::milliseconds(10))};
153 system.CoreTiming().ScheduleEvent(time_interval, preemption_event); 154 system.CoreTiming().ScheduleEvent(time_interval, preemption_event);
154 }); 155 });
155 156
156 s64 time_interval = Core::Timing::msToCycles(std::chrono::milliseconds(10)); 157 const auto time_interval =
158 std::chrono::nanoseconds{Core::Timing::msToCycles(std::chrono::milliseconds(10))};
157 system.CoreTiming().ScheduleEvent(time_interval, preemption_event); 159 system.CoreTiming().ScheduleEvent(time_interval, preemption_event);
158 } 160 }
159 161
diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp
index 7b23a6889..8c32f28b5 100644
--- a/src/core/hle/kernel/server_session.cpp
+++ b/src/core/hle/kernel/server_session.cpp
@@ -184,8 +184,8 @@ ResultCode ServerSession::CompleteSyncRequest() {
184 184
185ResultCode ServerSession::HandleSyncRequest(std::shared_ptr<Thread> thread, 185ResultCode ServerSession::HandleSyncRequest(std::shared_ptr<Thread> thread,
186 Core::Memory::Memory& memory) { 186 Core::Memory::Memory& memory) {
187 ResultCode result = QueueSyncRequest(std::move(thread), memory); 187 const ResultCode result = QueueSyncRequest(std::move(thread), memory);
188 const u64 delay = kernel.IsMulticore() ? 0U : 20000U; 188 const auto delay = std::chrono::nanoseconds{kernel.IsMulticore() ? 0 : 20000};
189 Core::System::GetInstance().CoreTiming().ScheduleEvent(delay, request_event, {}); 189 Core::System::GetInstance().CoreTiming().ScheduleEvent(delay, request_event, {});
190 return result; 190 return result;
191} 191}
diff --git a/src/core/hle/kernel/time_manager.cpp b/src/core/hle/kernel/time_manager.cpp
index 941305e8e..ebb1e5568 100644
--- a/src/core/hle/kernel/time_manager.cpp
+++ b/src/core/hle/kernel/time_manager.cpp
@@ -34,7 +34,8 @@ void TimeManager::ScheduleTimeEvent(Handle& event_handle, Thread* timetask, s64
34 ASSERT(timetask); 34 ASSERT(timetask);
35 ASSERT(timetask->GetStatus() != ThreadStatus::Ready); 35 ASSERT(timetask->GetStatus() != ThreadStatus::Ready);
36 ASSERT(timetask->GetStatus() != ThreadStatus::WaitMutex); 36 ASSERT(timetask->GetStatus() != ThreadStatus::WaitMutex);
37 system.CoreTiming().ScheduleEvent(nanoseconds, time_manager_event_type, event_handle); 37 system.CoreTiming().ScheduleEvent(std::chrono::nanoseconds{nanoseconds},
38 time_manager_event_type, event_handle);
38 } else { 39 } else {
39 event_handle = InvalidHandle; 40 event_handle = InvalidHandle;
40 } 41 }
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index e9020e0dc..62c942eac 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -39,9 +39,10 @@ namespace Service::HID {
39 39
40// Updating period for each HID device. 40// Updating period for each HID device.
41// TODO(ogniK): Find actual polling rate of hid 41// TODO(ogniK): Find actual polling rate of hid
42constexpr s64 pad_update_ticks = static_cast<s64>(1000000000 / 66); 42constexpr auto pad_update_ns = std::chrono::nanoseconds{1000000000 / 66};
43[[maybe_unused]] constexpr s64 accelerometer_update_ticks = static_cast<s64>(1000000000 / 100); 43[[maybe_unused]] constexpr auto accelerometer_update_ns =
44[[maybe_unused]] constexpr s64 gyroscope_update_ticks = static_cast<s64>(1000000000 / 100); 44 std::chrono::nanoseconds{1000000000 / 100};
45[[maybe_unused]] constexpr auto gyroscope_update_ticks = std::chrono::nanoseconds{1000000000 / 100};
45constexpr std::size_t SHARED_MEMORY_SIZE = 0x40000; 46constexpr std::size_t SHARED_MEMORY_SIZE = 0x40000;
46 47
47IAppletResource::IAppletResource(Core::System& system) 48IAppletResource::IAppletResource(Core::System& system)
@@ -82,7 +83,7 @@ IAppletResource::IAppletResource(Core::System& system)
82 83
83 // TODO(shinyquagsire23): Other update callbacks? (accel, gyro?) 84 // TODO(shinyquagsire23): Other update callbacks? (accel, gyro?)
84 85
85 system.CoreTiming().ScheduleEvent(pad_update_ticks, pad_update_event); 86 system.CoreTiming().ScheduleEvent(pad_update_ns, pad_update_event);
86 87
87 ReloadInputDevices(); 88 ReloadInputDevices();
88} 89}
@@ -118,7 +119,8 @@ void IAppletResource::UpdateControllers(u64 userdata, s64 ns_late) {
118 controller->OnUpdate(core_timing, shared_mem->GetPointer(), SHARED_MEMORY_SIZE); 119 controller->OnUpdate(core_timing, shared_mem->GetPointer(), SHARED_MEMORY_SIZE);
119 } 120 }
120 121
121 core_timing.ScheduleEvent(pad_update_ticks - ns_late, pad_update_event); 122 const auto future_ns = pad_update_ns - std::chrono::nanoseconds{ns_late};
123 core_timing.ScheduleEvent(future_ns, pad_update_event);
122} 124}
123 125
124class IActiveVibrationDeviceList final : public ServiceFramework<IActiveVibrationDeviceList> { 126class IActiveVibrationDeviceList final : public ServiceFramework<IActiveVibrationDeviceList> {
diff --git a/src/core/hle/service/nvflinger/nvflinger.cpp b/src/core/hle/service/nvflinger/nvflinger.cpp
index 2f44d3779..76672264d 100644
--- a/src/core/hle/service/nvflinger/nvflinger.cpp
+++ b/src/core/hle/service/nvflinger/nvflinger.cpp
@@ -28,8 +28,7 @@
28 28
29namespace Service::NVFlinger { 29namespace Service::NVFlinger {
30 30
31constexpr s64 frame_ticks = static_cast<s64>(1000000000 / 60); 31constexpr auto frame_ns = std::chrono::nanoseconds{1000000000 / 60};
32constexpr s64 frame_ticks_30fps = static_cast<s64>(1000000000 / 30);
33 32
34void NVFlinger::VSyncThread(NVFlinger& nv_flinger) { 33void NVFlinger::VSyncThread(NVFlinger& nv_flinger) {
35 nv_flinger.SplitVSync(); 34 nv_flinger.SplitVSync();
@@ -71,16 +70,20 @@ NVFlinger::NVFlinger(Core::System& system) : system(system) {
71 Core::Timing::CreateEvent("ScreenComposition", [this](u64 userdata, s64 ns_late) { 70 Core::Timing::CreateEvent("ScreenComposition", [this](u64 userdata, s64 ns_late) {
72 Lock(); 71 Lock();
73 Compose(); 72 Compose();
74 const auto ticks = GetNextTicks(); 73
75 this->system.CoreTiming().ScheduleEvent(std::max<s64>(0LL, ticks - ns_late), 74 const auto ticks = std::chrono::nanoseconds{GetNextTicks()};
76 composition_event); 75 const auto ticks_delta = ticks - std::chrono::nanoseconds{ns_late};
76 const auto future_ns = std::max(std::chrono::nanoseconds::zero(), ticks_delta);
77
78 this->system.CoreTiming().ScheduleEvent(future_ns, composition_event);
77 }); 79 });
80
78 if (system.IsMulticore()) { 81 if (system.IsMulticore()) {
79 is_running = true; 82 is_running = true;
80 wait_event = std::make_unique<Common::Event>(); 83 wait_event = std::make_unique<Common::Event>();
81 vsync_thread = std::make_unique<std::thread>(VSyncThread, std::ref(*this)); 84 vsync_thread = std::make_unique<std::thread>(VSyncThread, std::ref(*this));
82 } else { 85 } else {
83 system.CoreTiming().ScheduleEvent(frame_ticks, composition_event); 86 system.CoreTiming().ScheduleEvent(frame_ns, composition_event);
84 } 87 }
85} 88}
86 89
diff --git a/src/core/memory/cheat_engine.cpp b/src/core/memory/cheat_engine.cpp
index 53d27859b..09bf8c5cf 100644
--- a/src/core/memory/cheat_engine.cpp
+++ b/src/core/memory/cheat_engine.cpp
@@ -20,7 +20,7 @@
20 20
21namespace Core::Memory { 21namespace Core::Memory {
22 22
23constexpr s64 CHEAT_ENGINE_TICKS = static_cast<s64>(1000000000 / 12); 23constexpr auto CHEAT_ENGINE_NS = std::chrono::nanoseconds{1000000000 / 12};
24constexpr u32 KEYPAD_BITMASK = 0x3FFFFFF; 24constexpr u32 KEYPAD_BITMASK = 0x3FFFFFF;
25 25
26StandardVmCallbacks::StandardVmCallbacks(Core::System& system, const CheatProcessMetadata& metadata) 26StandardVmCallbacks::StandardVmCallbacks(Core::System& system, const CheatProcessMetadata& metadata)
@@ -191,7 +191,7 @@ void CheatEngine::Initialize() {
191 event = Core::Timing::CreateEvent( 191 event = Core::Timing::CreateEvent(
192 "CheatEngine::FrameCallback::" + Common::HexToString(metadata.main_nso_build_id), 192 "CheatEngine::FrameCallback::" + Common::HexToString(metadata.main_nso_build_id),
193 [this](u64 userdata, s64 ns_late) { FrameCallback(userdata, ns_late); }); 193 [this](u64 userdata, s64 ns_late) { FrameCallback(userdata, ns_late); });
194 core_timing.ScheduleEvent(CHEAT_ENGINE_TICKS, event); 194 core_timing.ScheduleEvent(CHEAT_ENGINE_NS, event);
195 195
196 metadata.process_id = system.CurrentProcess()->GetProcessID(); 196 metadata.process_id = system.CurrentProcess()->GetProcessID();
197 metadata.title_id = system.CurrentProcess()->GetTitleID(); 197 metadata.title_id = system.CurrentProcess()->GetTitleID();
@@ -230,7 +230,8 @@ void CheatEngine::FrameCallback(u64 userdata, s64 ns_late) {
230 230
231 vm.Execute(metadata); 231 vm.Execute(metadata);
232 232
233 core_timing.ScheduleEvent(CHEAT_ENGINE_TICKS - ns_late, event); 233 const auto future_ns = CHEAT_ENGINE_NS - std::chrono::nanoseconds{ns_late};
234 core_timing.ScheduleEvent(future_ns, event);
234} 235}
235 236
236} // namespace Core::Memory 237} // namespace Core::Memory
diff --git a/src/core/tools/freezer.cpp b/src/core/tools/freezer.cpp
index 8b0c50d11..5dc52d1c1 100644
--- a/src/core/tools/freezer.cpp
+++ b/src/core/tools/freezer.cpp
@@ -14,7 +14,7 @@
14namespace Tools { 14namespace Tools {
15namespace { 15namespace {
16 16
17constexpr s64 MEMORY_FREEZER_TICKS = static_cast<s64>(1000000000 / 60); 17constexpr auto memory_freezer_ns = std::chrono::nanoseconds{1000000000 / 60};
18 18
19u64 MemoryReadWidth(Core::Memory::Memory& memory, u32 width, VAddr addr) { 19u64 MemoryReadWidth(Core::Memory::Memory& memory, u32 width, VAddr addr) {
20 switch (width) { 20 switch (width) {
@@ -58,7 +58,7 @@ Freezer::Freezer(Core::Timing::CoreTiming& core_timing_, Core::Memory::Memory& m
58 event = Core::Timing::CreateEvent( 58 event = Core::Timing::CreateEvent(
59 "MemoryFreezer::FrameCallback", 59 "MemoryFreezer::FrameCallback",
60 [this](u64 userdata, s64 ns_late) { FrameCallback(userdata, ns_late); }); 60 [this](u64 userdata, s64 ns_late) { FrameCallback(userdata, ns_late); });
61 core_timing.ScheduleEvent(MEMORY_FREEZER_TICKS, event); 61 core_timing.ScheduleEvent(memory_freezer_ns, event);
62} 62}
63 63
64Freezer::~Freezer() { 64Freezer::~Freezer() {
@@ -68,7 +68,7 @@ Freezer::~Freezer() {
68void Freezer::SetActive(bool active) { 68void Freezer::SetActive(bool active) {
69 if (!this->active.exchange(active)) { 69 if (!this->active.exchange(active)) {
70 FillEntryReads(); 70 FillEntryReads();
71 core_timing.ScheduleEvent(MEMORY_FREEZER_TICKS, event); 71 core_timing.ScheduleEvent(memory_freezer_ns, event);
72 LOG_DEBUG(Common_Memory, "Memory freezer activated!"); 72 LOG_DEBUG(Common_Memory, "Memory freezer activated!");
73 } else { 73 } else {
74 LOG_DEBUG(Common_Memory, "Memory freezer deactivated!"); 74 LOG_DEBUG(Common_Memory, "Memory freezer deactivated!");
@@ -173,7 +173,8 @@ void Freezer::FrameCallback(u64 userdata, s64 ns_late) {
173 MemoryWriteWidth(memory, entry.width, entry.address, entry.value); 173 MemoryWriteWidth(memory, entry.width, entry.address, entry.value);
174 } 174 }
175 175
176 core_timing.ScheduleEvent(MEMORY_FREEZER_TICKS - ns_late, event); 176 const auto future_ns = memory_freezer_ns - std::chrono::nanoseconds{ns_late};
177 core_timing.ScheduleEvent(future_ns, event);
177} 178}
178 179
179void Freezer::FillEntryReads() { 180void Freezer::FillEntryReads() {
diff --git a/src/tests/core/core_timing.cpp b/src/tests/core/core_timing.cpp
index e66db1940..4ede1bc2e 100644
--- a/src/tests/core/core_timing.cpp
+++ b/src/tests/core/core_timing.cpp
@@ -116,13 +116,16 @@ TEST_CASE("CoreTiming[BasicOrderNoPausing]", "[core]") {
116 116
117 expected_callback = 0; 117 expected_callback = 0;
118 118
119 u64 start = core_timing.GetGlobalTimeNs().count(); 119 const u64 start = core_timing.GetGlobalTimeNs().count();
120 u64 one_micro = 1000U; 120 const u64 one_micro = 1000U;
121
121 for (std::size_t i = 0; i < events.size(); i++) { 122 for (std::size_t i = 0; i < events.size(); i++) {
122 u64 order = calls_order[i]; 123 const u64 order = calls_order[i];
123 core_timing.ScheduleEvent(i * one_micro + 100U, events[order], CB_IDS[order]); 124 const auto future_ns = std::chrono::nanoseconds{static_cast<s64>(i * one_micro + 100)};
125 core_timing.ScheduleEvent(future_ns, events[order], CB_IDS[order]);
124 } 126 }
125 u64 end = core_timing.GetGlobalTimeNs().count(); 127
128 const u64 end = core_timing.GetGlobalTimeNs().count();
126 const double scheduling_time = static_cast<double>(end - start); 129 const double scheduling_time = static_cast<double>(end - start);
127 const double timer_time = static_cast<double>(TestTimerSpeed(core_timing)); 130 const double timer_time = static_cast<double>(TestTimerSpeed(core_timing));
128 131