// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include "core/hle/kernel/k_hardware_timer_base.h" namespace Core::Timing { struct EventType; } // namespace Core::Timing namespace Kernel { class KHardwareTimer : /* public KInterruptTask, */ public KHardwareTimerBase { public: explicit KHardwareTimer(KernelCore& kernel) : KHardwareTimerBase{kernel} {} // Public API. void Initialize(); void Finalize(); s64 GetTick() const; void RegisterAbsoluteTask(KTimerTask* task, s64 task_time) { KScopedDisableDispatch dd{m_kernel}; KScopedSpinLock lk{this->GetLock()}; if (this->RegisterAbsoluteTaskImpl(task, task_time)) { if (task_time <= m_wakeup_time) { this->EnableInterrupt(task_time); } } } private: void EnableInterrupt(s64 wakeup_time); void DisableInterrupt(); bool GetInterruptEnabled(); void DoTask(); private: // Absolute time in nanoseconds s64 m_wakeup_time{std::numeric_limits::max()}; std::shared_ptr m_event_type{}; }; } // namespace Kernel