summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/CMakeLists.txt2
-rw-r--r--src/core/hle/kernel/kernel.cpp42
-rw-r--r--src/core/hle/kernel/kernel.h11
-rw-r--r--src/core/hle/kernel/object.cpp1
-rw-r--r--src/core/hle/kernel/object.h1
-rw-r--r--src/core/hle/kernel/timer.cpp84
-rw-r--r--src/core/hle/kernel/timer.h88
-rw-r--r--src/yuzu/debugger/wait_tree.cpp20
-rw-r--r--src/yuzu/debugger/wait_tree.h10
9 files changed, 0 insertions, 259 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 965c28787..f61bcd40d 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -140,8 +140,6 @@ add_library(core STATIC
140 hle/kernel/svc_wrap.h 140 hle/kernel/svc_wrap.h
141 hle/kernel/thread.cpp 141 hle/kernel/thread.cpp
142 hle/kernel/thread.h 142 hle/kernel/thread.h
143 hle/kernel/timer.cpp
144 hle/kernel/timer.h
145 hle/kernel/vm_manager.cpp 143 hle/kernel/vm_manager.cpp
146 hle/kernel/vm_manager.h 144 hle/kernel/vm_manager.h
147 hle/kernel/wait_object.cpp 145 hle/kernel/wait_object.cpp
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index 67674cd47..7a524ce5a 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -18,7 +18,6 @@
18#include "core/hle/kernel/process.h" 18#include "core/hle/kernel/process.h"
19#include "core/hle/kernel/resource_limit.h" 19#include "core/hle/kernel/resource_limit.h"
20#include "core/hle/kernel/thread.h" 20#include "core/hle/kernel/thread.h"
21#include "core/hle/kernel/timer.h"
22#include "core/hle/lock.h" 21#include "core/hle/lock.h"
23#include "core/hle/result.h" 22#include "core/hle/result.h"
24 23
@@ -86,27 +85,12 @@ static void ThreadWakeupCallback(u64 thread_handle, [[maybe_unused]] int cycles_
86 } 85 }
87} 86}
88 87
89/// The timer callback event, called when a timer is fired
90static void TimerCallback(u64 timer_handle, int cycles_late) {
91 const auto proper_handle = static_cast<Handle>(timer_handle);
92 const auto& system = Core::System::GetInstance();
93 SharedPtr<Timer> timer = system.Kernel().RetrieveTimerFromCallbackHandleTable(proper_handle);
94
95 if (timer == nullptr) {
96 LOG_CRITICAL(Kernel, "Callback fired for invalid timer {:016X}", timer_handle);
97 return;
98 }
99
100 timer->Signal(cycles_late);
101}
102
103struct KernelCore::Impl { 88struct KernelCore::Impl {
104 void Initialize(KernelCore& kernel) { 89 void Initialize(KernelCore& kernel) {
105 Shutdown(); 90 Shutdown();
106 91
107 InitializeSystemResourceLimit(kernel); 92 InitializeSystemResourceLimit(kernel);
108 InitializeThreads(); 93 InitializeThreads();
109 InitializeTimers();
110 } 94 }
111 95
112 void Shutdown() { 96 void Shutdown() {
@@ -122,9 +106,6 @@ struct KernelCore::Impl {
122 thread_wakeup_callback_handle_table.Clear(); 106 thread_wakeup_callback_handle_table.Clear();
123 thread_wakeup_event_type = nullptr; 107 thread_wakeup_event_type = nullptr;
124 108
125 timer_callback_handle_table.Clear();
126 timer_callback_event_type = nullptr;
127
128 named_ports.clear(); 109 named_ports.clear();
129 } 110 }
130 111
@@ -146,11 +127,6 @@ struct KernelCore::Impl {
146 CoreTiming::RegisterEvent("ThreadWakeupCallback", ThreadWakeupCallback); 127 CoreTiming::RegisterEvent("ThreadWakeupCallback", ThreadWakeupCallback);
147 } 128 }
148 129
149 void InitializeTimers() {
150 timer_callback_handle_table.Clear();
151 timer_callback_event_type = CoreTiming::RegisterEvent("TimerCallback", TimerCallback);
152 }
153
154 std::atomic<u32> next_object_id{0}; 130 std::atomic<u32> next_object_id{0};
155 std::atomic<u64> next_process_id{Process::ProcessIDMin}; 131 std::atomic<u64> next_process_id{Process::ProcessIDMin};
156 std::atomic<u64> next_thread_id{1}; 132 std::atomic<u64> next_thread_id{1};
@@ -161,12 +137,6 @@ struct KernelCore::Impl {
161 137
162 SharedPtr<ResourceLimit> system_resource_limit; 138 SharedPtr<ResourceLimit> system_resource_limit;
163 139
164 /// The event type of the generic timer callback event
165 CoreTiming::EventType* timer_callback_event_type = nullptr;
166 // TODO(yuriks): This can be removed if Timer objects are explicitly pooled in the future,
167 // allowing us to simply use a pool index or similar.
168 Kernel::HandleTable timer_callback_handle_table;
169
170 CoreTiming::EventType* thread_wakeup_event_type = nullptr; 140 CoreTiming::EventType* thread_wakeup_event_type = nullptr;
171 // TODO(yuriks): This can be removed if Thread objects are explicitly pooled in the future, 141 // TODO(yuriks): This can be removed if Thread objects are explicitly pooled in the future,
172 // allowing us to simply use a pool index or similar. 142 // allowing us to simply use a pool index or similar.
@@ -198,10 +168,6 @@ SharedPtr<Thread> KernelCore::RetrieveThreadFromWakeupCallbackHandleTable(Handle
198 return impl->thread_wakeup_callback_handle_table.Get<Thread>(handle); 168 return impl->thread_wakeup_callback_handle_table.Get<Thread>(handle);
199} 169}
200 170
201SharedPtr<Timer> KernelCore::RetrieveTimerFromCallbackHandleTable(Handle handle) const {
202 return impl->timer_callback_handle_table.Get<Timer>(handle);
203}
204
205void KernelCore::AppendNewProcess(SharedPtr<Process> process) { 171void KernelCore::AppendNewProcess(SharedPtr<Process> process) {
206 impl->process_list.push_back(std::move(process)); 172 impl->process_list.push_back(std::move(process));
207} 173}
@@ -247,18 +213,10 @@ u64 KernelCore::CreateNewProcessID() {
247 return impl->next_process_id++; 213 return impl->next_process_id++;
248} 214}
249 215
250ResultVal<Handle> KernelCore::CreateTimerCallbackHandle(const SharedPtr<Timer>& timer) {
251 return impl->timer_callback_handle_table.Create(timer);
252}
253
254CoreTiming::EventType* KernelCore::ThreadWakeupCallbackEventType() const { 216CoreTiming::EventType* KernelCore::ThreadWakeupCallbackEventType() const {
255 return impl->thread_wakeup_event_type; 217 return impl->thread_wakeup_event_type;
256} 218}
257 219
258CoreTiming::EventType* KernelCore::TimerCallbackEventType() const {
259 return impl->timer_callback_event_type;
260}
261
262Kernel::HandleTable& KernelCore::ThreadWakeupCallbackHandleTable() { 220Kernel::HandleTable& KernelCore::ThreadWakeupCallbackHandleTable() {
263 return impl->thread_wakeup_callback_handle_table; 221 return impl->thread_wakeup_callback_handle_table;
264} 222}
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h
index 58c9d108b..c643a6401 100644
--- a/src/core/hle/kernel/kernel.h
+++ b/src/core/hle/kernel/kernel.h
@@ -22,7 +22,6 @@ class HandleTable;
22class Process; 22class Process;
23class ResourceLimit; 23class ResourceLimit;
24class Thread; 24class Thread;
25class Timer;
26 25
27/// Represents a single instance of the kernel. 26/// Represents a single instance of the kernel.
28class KernelCore { 27class KernelCore {
@@ -51,9 +50,6 @@ public:
51 /// Retrieves a shared pointer to a Thread instance within the thread wakeup handle table. 50 /// Retrieves a shared pointer to a Thread instance within the thread wakeup handle table.
52 SharedPtr<Thread> RetrieveThreadFromWakeupCallbackHandleTable(Handle handle) const; 51 SharedPtr<Thread> RetrieveThreadFromWakeupCallbackHandleTable(Handle handle) const;
53 52
54 /// Retrieves a shared pointer to a Timer instance within the timer callback handle table.
55 SharedPtr<Timer> RetrieveTimerFromCallbackHandleTable(Handle handle) const;
56
57 /// Adds the given shared pointer to an internal list of active processes. 53 /// Adds the given shared pointer to an internal list of active processes.
58 void AppendNewProcess(SharedPtr<Process> process); 54 void AppendNewProcess(SharedPtr<Process> process);
59 55
@@ -82,7 +78,6 @@ private:
82 friend class Object; 78 friend class Object;
83 friend class Process; 79 friend class Process;
84 friend class Thread; 80 friend class Thread;
85 friend class Timer;
86 81
87 /// Creates a new object ID, incrementing the internal object ID counter. 82 /// Creates a new object ID, incrementing the internal object ID counter.
88 u32 CreateNewObjectID(); 83 u32 CreateNewObjectID();
@@ -93,15 +88,9 @@ private:
93 /// Creates a new thread ID, incrementing the internal thread ID counter. 88 /// Creates a new thread ID, incrementing the internal thread ID counter.
94 u64 CreateNewThreadID(); 89 u64 CreateNewThreadID();
95 90
96 /// Creates a timer callback handle for the given timer.
97 ResultVal<Handle> CreateTimerCallbackHandle(const SharedPtr<Timer>& timer);
98
99 /// Retrieves the event type used for thread wakeup callbacks. 91 /// Retrieves the event type used for thread wakeup callbacks.
100 CoreTiming::EventType* ThreadWakeupCallbackEventType() const; 92 CoreTiming::EventType* ThreadWakeupCallbackEventType() const;
101 93
102 /// Retrieves the event type used for timer callbacks.
103 CoreTiming::EventType* TimerCallbackEventType() const;
104
105 /// Provides a reference to the thread wakeup callback handle table. 94 /// Provides a reference to the thread wakeup callback handle table.
106 Kernel::HandleTable& ThreadWakeupCallbackHandleTable(); 95 Kernel::HandleTable& ThreadWakeupCallbackHandleTable();
107 96
diff --git a/src/core/hle/kernel/object.cpp b/src/core/hle/kernel/object.cpp
index 806078638..8870463d0 100644
--- a/src/core/hle/kernel/object.cpp
+++ b/src/core/hle/kernel/object.cpp
@@ -16,7 +16,6 @@ bool Object::IsWaitable() const {
16 case HandleType::ReadableEvent: 16 case HandleType::ReadableEvent:
17 case HandleType::Thread: 17 case HandleType::Thread:
18 case HandleType::Process: 18 case HandleType::Process:
19 case HandleType::Timer:
20 case HandleType::ServerPort: 19 case HandleType::ServerPort:
21 case HandleType::ServerSession: 20 case HandleType::ServerSession:
22 return true; 21 return true;
diff --git a/src/core/hle/kernel/object.h b/src/core/hle/kernel/object.h
index 1541b6e3c..4c2505908 100644
--- a/src/core/hle/kernel/object.h
+++ b/src/core/hle/kernel/object.h
@@ -25,7 +25,6 @@ enum class HandleType : u32 {
25 Thread, 25 Thread,
26 Process, 26 Process,
27 AddressArbiter, 27 AddressArbiter,
28 Timer,
29 ResourceLimit, 28 ResourceLimit,
30 ClientPort, 29 ClientPort,
31 ServerPort, 30 ServerPort,
diff --git a/src/core/hle/kernel/timer.cpp b/src/core/hle/kernel/timer.cpp
deleted file mode 100644
index 3afe60469..000000000
--- a/src/core/hle/kernel/timer.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
1// Copyright 2015 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include "common/assert.h"
6#include "common/logging/log.h"
7#include "core/core.h"
8#include "core/core_timing.h"
9#include "core/core_timing_util.h"
10#include "core/hle/kernel/handle_table.h"
11#include "core/hle/kernel/kernel.h"
12#include "core/hle/kernel/object.h"
13#include "core/hle/kernel/thread.h"
14#include "core/hle/kernel/timer.h"
15
16namespace Kernel {
17
18Timer::Timer(KernelCore& kernel) : WaitObject{kernel} {}
19Timer::~Timer() = default;
20
21SharedPtr<Timer> Timer::Create(KernelCore& kernel, ResetType reset_type, std::string name) {
22 SharedPtr<Timer> timer(new Timer(kernel));
23
24 timer->reset_type = reset_type;
25 timer->signaled = false;
26 timer->name = std::move(name);
27 timer->initial_delay = 0;
28 timer->interval_delay = 0;
29 timer->callback_handle = kernel.CreateTimerCallbackHandle(timer).Unwrap();
30
31 return timer;
32}
33
34bool Timer::ShouldWait(Thread* thread) const {
35 return !signaled;
36}
37
38void Timer::Acquire(Thread* thread) {
39 ASSERT_MSG(!ShouldWait(thread), "object unavailable!");
40
41 if (reset_type == ResetType::OneShot)
42 signaled = false;
43}
44
45void Timer::Set(s64 initial, s64 interval) {
46 // Ensure we get rid of any previous scheduled event
47 Cancel();
48
49 initial_delay = initial;
50 interval_delay = interval;
51
52 if (initial == 0) {
53 // Immediately invoke the callback
54 Signal(0);
55 } else {
56 CoreTiming::ScheduleEvent(CoreTiming::nsToCycles(initial), kernel.TimerCallbackEventType(),
57 callback_handle);
58 }
59}
60
61void Timer::Cancel() {
62 CoreTiming::UnscheduleEvent(kernel.TimerCallbackEventType(), callback_handle);
63}
64
65void Timer::Clear() {
66 signaled = false;
67}
68
69void Timer::Signal(int cycles_late) {
70 LOG_TRACE(Kernel, "Timer {} fired", GetObjectId());
71
72 signaled = true;
73
74 // Resume all waiting threads
75 WakeupAllWaitingThreads();
76
77 if (interval_delay != 0) {
78 // Reschedule the timer with the interval delay
79 CoreTiming::ScheduleEvent(CoreTiming::nsToCycles(interval_delay) - cycles_late,
80 kernel.TimerCallbackEventType(), callback_handle);
81 }
82}
83
84} // namespace Kernel
diff --git a/src/core/hle/kernel/timer.h b/src/core/hle/kernel/timer.h
deleted file mode 100644
index ce3e74426..000000000
--- a/src/core/hle/kernel/timer.h
+++ /dev/null
@@ -1,88 +0,0 @@
1// Copyright 2015 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include "common/common_types.h"
8#include "core/hle/kernel/object.h"
9#include "core/hle/kernel/wait_object.h"
10
11namespace Kernel {
12
13class KernelCore;
14
15class Timer final : public WaitObject {
16public:
17 /**
18 * Creates a timer
19 * @param kernel The kernel instance to create the timer callback handle for.
20 * @param reset_type ResetType describing how to create the timer
21 * @param name Optional name of timer
22 * @return The created Timer
23 */
24 static SharedPtr<Timer> Create(KernelCore& kernel, ResetType reset_type,
25 std::string name = "Unknown");
26
27 std::string GetTypeName() const override {
28 return "Timer";
29 }
30 std::string GetName() const override {
31 return name;
32 }
33
34 static const HandleType HANDLE_TYPE = HandleType::Timer;
35 HandleType GetHandleType() const override {
36 return HANDLE_TYPE;
37 }
38
39 ResetType GetResetType() const {
40 return reset_type;
41 }
42
43 u64 GetInitialDelay() const {
44 return initial_delay;
45 }
46
47 u64 GetIntervalDelay() const {
48 return interval_delay;
49 }
50
51 bool ShouldWait(Thread* thread) const override;
52 void Acquire(Thread* thread) override;
53
54 /**
55 * Starts the timer, with the specified initial delay and interval.
56 * @param initial Delay until the timer is first fired
57 * @param interval Delay until the timer is fired after the first time
58 */
59 void Set(s64 initial, s64 interval);
60
61 void Cancel();
62 void Clear();
63
64 /**
65 * Signals the timer, waking up any waiting threads and rescheduling it
66 * for the next interval.
67 * This method should not be called from outside the timer callback handler,
68 * lest multiple callback events get scheduled.
69 */
70 void Signal(int cycles_late);
71
72private:
73 explicit Timer(KernelCore& kernel);
74 ~Timer() override;
75
76 ResetType reset_type; ///< The ResetType of this timer
77
78 u64 initial_delay; ///< The delay until the timer fires for the first time
79 u64 interval_delay; ///< The delay until the timer fires after the first time
80
81 bool signaled; ///< Whether the timer has been signaled or not
82 std::string name; ///< Name of timer (optional)
83
84 /// Handle used as userdata to reference this object when inserting into the CoreTiming queue.
85 Handle callback_handle;
86};
87
88} // namespace Kernel
diff --git a/src/yuzu/debugger/wait_tree.cpp b/src/yuzu/debugger/wait_tree.cpp
index 0c0864742..f50225d5f 100644
--- a/src/yuzu/debugger/wait_tree.cpp
+++ b/src/yuzu/debugger/wait_tree.cpp
@@ -13,7 +13,6 @@
13#include "core/hle/kernel/readable_event.h" 13#include "core/hle/kernel/readable_event.h"
14#include "core/hle/kernel/scheduler.h" 14#include "core/hle/kernel/scheduler.h"
15#include "core/hle/kernel/thread.h" 15#include "core/hle/kernel/thread.h"
16#include "core/hle/kernel/timer.h"
17#include "core/hle/kernel/wait_object.h" 16#include "core/hle/kernel/wait_object.h"
18#include "core/memory.h" 17#include "core/memory.h"
19 18
@@ -155,8 +154,6 @@ std::unique_ptr<WaitTreeWaitObject> WaitTreeWaitObject::make(const Kernel::WaitO
155 switch (object.GetHandleType()) { 154 switch (object.GetHandleType()) {
156 case Kernel::HandleType::ReadableEvent: 155 case Kernel::HandleType::ReadableEvent:
157 return std::make_unique<WaitTreeEvent>(static_cast<const Kernel::ReadableEvent&>(object)); 156 return std::make_unique<WaitTreeEvent>(static_cast<const Kernel::ReadableEvent&>(object));
158 case Kernel::HandleType::Timer:
159 return std::make_unique<WaitTreeTimer>(static_cast<const Kernel::Timer&>(object));
160 case Kernel::HandleType::Thread: 157 case Kernel::HandleType::Thread:
161 return std::make_unique<WaitTreeThread>(static_cast<const Kernel::Thread&>(object)); 158 return std::make_unique<WaitTreeThread>(static_cast<const Kernel::Thread&>(object));
162 default: 159 default:
@@ -348,23 +345,6 @@ std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeEvent::GetChildren() const {
348 return list; 345 return list;
349} 346}
350 347
351WaitTreeTimer::WaitTreeTimer(const Kernel::Timer& object) : WaitTreeWaitObject(object) {}
352WaitTreeTimer::~WaitTreeTimer() = default;
353
354std::vector<std::unique_ptr<WaitTreeItem>> WaitTreeTimer::GetChildren() const {
355 std::vector<std::unique_ptr<WaitTreeItem>> list(WaitTreeWaitObject::GetChildren());
356
357 const auto& timer = static_cast<const Kernel::Timer&>(object);
358
359 list.push_back(std::make_unique<WaitTreeText>(
360 tr("reset type = %1").arg(GetResetTypeQString(timer.GetResetType()))));
361 list.push_back(
362 std::make_unique<WaitTreeText>(tr("initial delay = %1").arg(timer.GetInitialDelay())));
363 list.push_back(
364 std::make_unique<WaitTreeText>(tr("interval delay = %1").arg(timer.GetIntervalDelay())));
365 return list;
366}
367
368WaitTreeThreadList::WaitTreeThreadList(const std::vector<Kernel::SharedPtr<Kernel::Thread>>& list) 348WaitTreeThreadList::WaitTreeThreadList(const std::vector<Kernel::SharedPtr<Kernel::Thread>>& list)
369 : thread_list(list) {} 349 : thread_list(list) {}
370WaitTreeThreadList::~WaitTreeThreadList() = default; 350WaitTreeThreadList::~WaitTreeThreadList() = default;
diff --git a/src/yuzu/debugger/wait_tree.h b/src/yuzu/debugger/wait_tree.h
index e639ef412..365c3dbfe 100644
--- a/src/yuzu/debugger/wait_tree.h
+++ b/src/yuzu/debugger/wait_tree.h
@@ -20,7 +20,6 @@ namespace Kernel {
20class ReadableEvent; 20class ReadableEvent;
21class WaitObject; 21class WaitObject;
22class Thread; 22class Thread;
23class Timer;
24} // namespace Kernel 23} // namespace Kernel
25 24
26class WaitTreeThread; 25class WaitTreeThread;
@@ -150,15 +149,6 @@ public:
150 std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override; 149 std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
151}; 150};
152 151
153class WaitTreeTimer : public WaitTreeWaitObject {
154 Q_OBJECT
155public:
156 explicit WaitTreeTimer(const Kernel::Timer& object);
157 ~WaitTreeTimer() override;
158
159 std::vector<std::unique_ptr<WaitTreeItem>> GetChildren() const override;
160};
161
162class WaitTreeThreadList : public WaitTreeExpandableItem { 152class WaitTreeThreadList : public WaitTreeExpandableItem {
163 Q_OBJECT 153 Q_OBJECT
164public: 154public: