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