committed by
GitHub
9 changed files with 0 additions and 259 deletions
-
2src/core/CMakeLists.txt
-
42src/core/hle/kernel/kernel.cpp
-
11src/core/hle/kernel/kernel.h
-
1src/core/hle/kernel/object.cpp
-
1src/core/hle/kernel/object.h
-
84src/core/hle/kernel/timer.cpp
-
88src/core/hle/kernel/timer.h
-
20src/yuzu/debugger/wait_tree.cpp
-
10src/yuzu/debugger/wait_tree.h
@ -1,84 +0,0 @@ |
|||
// Copyright 2015 Citra Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include "common/assert.h"
|
|||
#include "common/logging/log.h"
|
|||
#include "core/core.h"
|
|||
#include "core/core_timing.h"
|
|||
#include "core/core_timing_util.h"
|
|||
#include "core/hle/kernel/handle_table.h"
|
|||
#include "core/hle/kernel/kernel.h"
|
|||
#include "core/hle/kernel/object.h"
|
|||
#include "core/hle/kernel/thread.h"
|
|||
#include "core/hle/kernel/timer.h"
|
|||
|
|||
namespace Kernel { |
|||
|
|||
Timer::Timer(KernelCore& kernel) : WaitObject{kernel} {} |
|||
Timer::~Timer() = default; |
|||
|
|||
SharedPtr<Timer> Timer::Create(KernelCore& kernel, ResetType reset_type, std::string name) { |
|||
SharedPtr<Timer> timer(new Timer(kernel)); |
|||
|
|||
timer->reset_type = reset_type; |
|||
timer->signaled = false; |
|||
timer->name = std::move(name); |
|||
timer->initial_delay = 0; |
|||
timer->interval_delay = 0; |
|||
timer->callback_handle = kernel.CreateTimerCallbackHandle(timer).Unwrap(); |
|||
|
|||
return timer; |
|||
} |
|||
|
|||
bool Timer::ShouldWait(Thread* thread) const { |
|||
return !signaled; |
|||
} |
|||
|
|||
void Timer::Acquire(Thread* thread) { |
|||
ASSERT_MSG(!ShouldWait(thread), "object unavailable!"); |
|||
|
|||
if (reset_type == ResetType::OneShot) |
|||
signaled = false; |
|||
} |
|||
|
|||
void Timer::Set(s64 initial, s64 interval) { |
|||
// Ensure we get rid of any previous scheduled event
|
|||
Cancel(); |
|||
|
|||
initial_delay = initial; |
|||
interval_delay = interval; |
|||
|
|||
if (initial == 0) { |
|||
// Immediately invoke the callback
|
|||
Signal(0); |
|||
} else { |
|||
CoreTiming::ScheduleEvent(CoreTiming::nsToCycles(initial), kernel.TimerCallbackEventType(), |
|||
callback_handle); |
|||
} |
|||
} |
|||
|
|||
void Timer::Cancel() { |
|||
CoreTiming::UnscheduleEvent(kernel.TimerCallbackEventType(), callback_handle); |
|||
} |
|||
|
|||
void Timer::Clear() { |
|||
signaled = false; |
|||
} |
|||
|
|||
void Timer::Signal(int cycles_late) { |
|||
LOG_TRACE(Kernel, "Timer {} fired", GetObjectId()); |
|||
|
|||
signaled = true; |
|||
|
|||
// Resume all waiting threads
|
|||
WakeupAllWaitingThreads(); |
|||
|
|||
if (interval_delay != 0) { |
|||
// Reschedule the timer with the interval delay
|
|||
CoreTiming::ScheduleEvent(CoreTiming::nsToCycles(interval_delay) - cycles_late, |
|||
kernel.TimerCallbackEventType(), callback_handle); |
|||
} |
|||
} |
|||
|
|||
} // namespace Kernel
|
|||
@ -1,88 +0,0 @@ |
|||
// Copyright 2015 Citra Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include "common/common_types.h" |
|||
#include "core/hle/kernel/object.h" |
|||
#include "core/hle/kernel/wait_object.h" |
|||
|
|||
namespace Kernel { |
|||
|
|||
class KernelCore; |
|||
|
|||
class Timer final : public WaitObject { |
|||
public: |
|||
/** |
|||
* Creates a timer |
|||
* @param kernel The kernel instance to create the timer callback handle for. |
|||
* @param reset_type ResetType describing how to create the timer |
|||
* @param name Optional name of timer |
|||
* @return The created Timer |
|||
*/ |
|||
static SharedPtr<Timer> Create(KernelCore& kernel, ResetType reset_type, |
|||
std::string name = "Unknown"); |
|||
|
|||
std::string GetTypeName() const override { |
|||
return "Timer"; |
|||
} |
|||
std::string GetName() const override { |
|||
return name; |
|||
} |
|||
|
|||
static const HandleType HANDLE_TYPE = HandleType::Timer; |
|||
HandleType GetHandleType() const override { |
|||
return HANDLE_TYPE; |
|||
} |
|||
|
|||
ResetType GetResetType() const { |
|||
return reset_type; |
|||
} |
|||
|
|||
u64 GetInitialDelay() const { |
|||
return initial_delay; |
|||
} |
|||
|
|||
u64 GetIntervalDelay() const { |
|||
return interval_delay; |
|||
} |
|||
|
|||
bool ShouldWait(Thread* thread) const override; |
|||
void Acquire(Thread* thread) override; |
|||
|
|||
/** |
|||
* Starts the timer, with the specified initial delay and interval. |
|||
* @param initial Delay until the timer is first fired |
|||
* @param interval Delay until the timer is fired after the first time |
|||
*/ |
|||
void Set(s64 initial, s64 interval); |
|||
|
|||
void Cancel(); |
|||
void Clear(); |
|||
|
|||
/** |
|||
* Signals the timer, waking up any waiting threads and rescheduling it |
|||
* for the next interval. |
|||
* This method should not be called from outside the timer callback handler, |
|||
* lest multiple callback events get scheduled. |
|||
*/ |
|||
void Signal(int cycles_late); |
|||
|
|||
private: |
|||
explicit Timer(KernelCore& kernel); |
|||
~Timer() override; |
|||
|
|||
ResetType reset_type; ///< The ResetType of this timer |
|||
|
|||
u64 initial_delay; ///< The delay until the timer fires for the first time |
|||
u64 interval_delay; ///< The delay until the timer fires after the first time |
|||
|
|||
bool signaled; ///< Whether the timer has been signaled or not |
|||
std::string name; ///< Name of timer (optional) |
|||
|
|||
/// Handle used as userdata to reference this object when inserting into the CoreTiming queue. |
|||
Handle callback_handle; |
|||
}; |
|||
|
|||
} // namespace Kernel |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue