summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorJMC47 <JMC4789@gmail.com>2026-03-28 16:19:28 -0400
committerGitHub <noreply@github.com>2026-03-28 16:19:28 -0400
commit67f1afeb745731b9867dd710d91121b6c10aeec0 (patch)
tree877aa9c3dba3f27abec933e4b786580769155829 /Source/Core
parent14965a5ec0fdd7d5a51317dc2fba88312f099765 (diff)
parentc658e7678b0032ec764ed961b6d716843eebae49 (diff)
Merge pull request #14517 from jordan-woyak/event-functor
CoreTiming: Change TimedCallback to a Common::MoveOnlyFunction.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/CoreTiming.cpp2
-rw-r--r--Source/Core/Core/CoreTiming.h4
-rw-r--r--Source/Core/Core/HW/SI/SI.cpp22
-rw-r--r--Source/Core/Core/HW/SI/SI.h2
4 files changed, 11 insertions, 19 deletions
diff --git a/Source/Core/Core/CoreTiming.cpp b/Source/Core/Core/CoreTiming.cpp
index 9e45a7c387..18e86f11e0 100644
--- a/Source/Core/Core/CoreTiming.cpp
+++ b/Source/Core/Core/CoreTiming.cpp
@@ -70,7 +70,7 @@ EventType* CoreTimingManager::RegisterEvent(const std::string& name, TimedCallba
"during Init to avoid breaking save states.",
name);
- auto info = m_event_types.emplace(name, EventType{callback, nullptr});
+ auto info = m_event_types.emplace(name, EventType{std::move(callback), nullptr});
EventType* event_type = &info.first->second;
event_type->name = &info.first->first;
return event_type;
diff --git a/Source/Core/Core/CoreTiming.h b/Source/Core/Core/CoreTiming.h
index 68d1fd4fd2..29d636e433 100644
--- a/Source/Core/Core/CoreTiming.h
+++ b/Source/Core/Core/CoreTiming.h
@@ -23,6 +23,7 @@
#include <vector>
#include "Common/CommonTypes.h"
+#include "Common/Functional.h"
#include "Common/HookableEvent.h"
#include "Common/SPSCQueue.h"
#include "Common/Timer.h"
@@ -47,7 +48,8 @@ struct Globals
float last_OC_factor_inverted = 0.0f;
};
-typedef void (*TimedCallback)(Core::System& system, u64 userdata, s64 cyclesLate);
+using TimedCallback =
+ Common::MoveOnlyFunction<void(Core::System& system, u64 userdata, s64 cyclesLate)>;
struct EventType
{
diff --git a/Source/Core/Core/HW/SI/SI.cpp b/Source/Core/Core/HW/SI/SI.cpp
index f451be328d..11e0c6f2e7 100644
--- a/Source/Core/Core/HW/SI/SI.cpp
+++ b/Source/Core/Core/HW/SI/SI.cpp
@@ -228,29 +228,21 @@ void SerialInterfaceManager::DoState(PointerWrap& p)
p.Do(m_si_buffer);
}
-template <int device_number>
-void SerialInterfaceManager::DeviceEventCallback(Core::System& system, u64 userdata, s64 cyclesLate)
-{
- const auto& si = system.GetSerialInterface();
- si.m_channel[device_number].device->OnEvent(userdata, cyclesLate);
-}
-
void SerialInterfaceManager::RegisterEvents()
{
auto& core_timing = m_system.GetCoreTiming();
+
m_event_type_change_device = core_timing.RegisterEvent("ChangeSIDevice", ChangeDeviceCallback);
m_event_type_tranfer_pending = core_timing.RegisterEvent("SITransferPending", GlobalRunSIBuffer);
- constexpr std::array<CoreTiming::TimedCallback, MAX_SI_CHANNELS> event_callbacks = {
- DeviceEventCallback<0>,
- DeviceEventCallback<1>,
- DeviceEventCallback<2>,
- DeviceEventCallback<3>,
- };
- for (int i = 0; i < MAX_SI_CHANNELS; ++i)
+ for (u32 i = 0; i != MAX_SI_CHANNELS; ++i)
{
+ auto& channel = m_channel[i];
m_event_types_device[i] =
- core_timing.RegisterEvent(fmt::format("SIEventChannel{}", i), event_callbacks[i]);
+ core_timing.RegisterEvent(fmt::format("SIEventChannel{}", i),
+ [&channel](Core::System&, u64 user_data, s64 cycles_late) {
+ channel.device->OnEvent(user_data, cycles_late);
+ });
}
}
diff --git a/Source/Core/Core/HW/SI/SI.h b/Source/Core/Core/HW/SI/SI.h
index 8e2e3afe3b..5229bd045f 100644
--- a/Source/Core/Core/HW/SI/SI.h
+++ b/Source/Core/Core/HW/SI/SI.h
@@ -88,8 +88,6 @@ private:
void RunSIBuffer(u64 user_data, s64 cycles_late);
static void GlobalRunSIBuffer(Core::System& system, u64 user_data, s64 cycles_late);
static void ChangeDeviceCallback(Core::System& system, u64 user_data, s64 cycles_late);
- template <int device_number>
- static void DeviceEventCallback(Core::System& system, u64 userdata, s64 cyclesLate);
// SI Channel Output
union USIChannelOut