summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/timer.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2015-01-21 21:09:47 -0500
committerGravatar bunnei2015-01-21 21:09:47 -0500
commit24a63662ba6c7816001bba399e85d8c131a89489 (patch)
treea9959e69723b4f19550834171c962ec06c9e34b7 /src/core/hle/kernel/timer.cpp
parentMerge pull request #491 from archshift/hidspvr (diff)
parentWaitSynchronization: Added a result code for invalid result, fixed bug. (diff)
downloadyuzu-24a63662ba6c7816001bba399e85d8c131a89489.tar.gz
yuzu-24a63662ba6c7816001bba399e85d8c131a89489.tar.xz
yuzu-24a63662ba6c7816001bba399e85d8c131a89489.zip
Merge pull request #495 from bunnei/fix-waitsynch
Fix WaitSynchronization
Diffstat (limited to 'src/core/hle/kernel/timer.cpp')
-rw-r--r--src/core/hle/kernel/timer.cpp23
1 files changed, 8 insertions, 15 deletions
diff --git a/src/core/hle/kernel/timer.cpp b/src/core/hle/kernel/timer.cpp
index 3b0452d4d..ec0b2c323 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,19 +24,17 @@ 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
31 u64 interval_delay; ///< The delay until the timer fires after the first time 30 u64 interval_delay; ///< The delay until the timer fires after the first time
32 31
33 ResultVal<bool> WaitSynchronization() override { 32 bool ShouldWait() override {
34 bool wait = !signaled; 33 return !signaled;
35 if (wait) { 34 }
36 waiting_threads.insert(GetCurrentThread()->GetHandle()); 35
37 Kernel::WaitCurrentThread(WAITTYPE_TIMER, this); 36 void Acquire() override {
38 } 37 _assert_msg_(Kernel, !ShouldWait(), "object unavailable!");
39 return MakeResult<bool>(wait);
40 } 38 }
41}; 39};
42 40
@@ -92,12 +90,7 @@ static void TimerCallback(u64 timer_handle, int cycles_late) {
92 timer->signaled = true; 90 timer->signaled = true;
93 91
94 // Resume all waiting threads 92 // Resume all waiting threads
95 for (Handle thread_handle : timer->waiting_threads) { 93 timer->WakeupAllWaitingThreads();
96 if (SharedPtr<Thread> thread = Kernel::g_handle_table.Get<Thread>(thread_handle))
97 thread->ResumeFromWait();
98 }
99
100 timer->waiting_threads.clear();
101 94
102 if (timer->reset_type == RESETTYPE_ONESHOT) 95 if (timer->reset_type == RESETTYPE_ONESHOT)
103 timer->signaled = false; 96 timer->signaled = false;