summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/timer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel/timer.cpp')
-rw-r--r--src/core/hle/kernel/timer.cpp12
1 files changed, 3 insertions, 9 deletions
diff --git a/src/core/hle/kernel/timer.cpp b/src/core/hle/kernel/timer.cpp
index 3b0452d4d..2d4fa4c01 100644
--- a/src/core/hle/kernel/timer.cpp
+++ b/src/core/hle/kernel/timer.cpp
@@ -13,7 +13,7 @@
13 13
14namespace Kernel { 14namespace Kernel {
15 15
16class Timer : public Object { 16class Timer : public WaitObject {
17public: 17public:
18 std::string GetTypeName() const override { return "Timer"; } 18 std::string GetTypeName() const override { return "Timer"; }
19 std::string GetName() const override { return name; } 19 std::string GetName() const override { return name; }
@@ -24,7 +24,6 @@ public:
24 ResetType reset_type; ///< The ResetType of this timer 24 ResetType reset_type; ///< The ResetType of this timer
25 25
26 bool signaled; ///< Whether the timer has been signaled or not 26 bool signaled; ///< Whether the timer has been signaled or not
27 std::set<Handle> waiting_threads; ///< Threads that are waiting for the timer
28 std::string name; ///< Name of timer (optional) 27 std::string name; ///< Name of timer (optional)
29 28
30 u64 initial_delay; ///< The delay until the timer fires for the first time 29 u64 initial_delay; ///< The delay until the timer fires for the first time
@@ -33,7 +32,7 @@ public:
33 ResultVal<bool> WaitSynchronization() override { 32 ResultVal<bool> WaitSynchronization() override {
34 bool wait = !signaled; 33 bool wait = !signaled;
35 if (wait) { 34 if (wait) {
36 waiting_threads.insert(GetCurrentThread()->GetHandle()); 35 AddWaitingThread(GetCurrentThread());
37 Kernel::WaitCurrentThread(WAITTYPE_TIMER, this); 36 Kernel::WaitCurrentThread(WAITTYPE_TIMER, this);
38 } 37 }
39 return MakeResult<bool>(wait); 38 return MakeResult<bool>(wait);
@@ -92,12 +91,7 @@ static void TimerCallback(u64 timer_handle, int cycles_late) {
92 timer->signaled = true; 91 timer->signaled = true;
93 92
94 // Resume all waiting threads 93 // Resume all waiting threads
95 for (Handle thread_handle : timer->waiting_threads) { 94 timer->ResumeAllWaitingThreads();
96 if (SharedPtr<Thread> thread = Kernel::g_handle_table.Get<Thread>(thread_handle))
97 thread->ResumeFromWait();
98 }
99
100 timer->waiting_threads.clear();
101 95
102 if (timer->reset_type == RESETTYPE_ONESHOT) 96 if (timer->reset_type == RESETTYPE_ONESHOT)
103 timer->signaled = false; 97 timer->signaled = false;