diff options
| author | 2017-01-01 19:23:19 -0500 | |
|---|---|---|
| committer | 2017-01-05 13:06:17 -0500 | |
| commit | e52ca85711e8df54c8eafe556b6ba0ca683ddea0 (patch) | |
| tree | 5a5842cdea80d830d4295d9a96cb5ff4bfd9162d /src | |
| parent | Merge pull request #2390 from jroweboy/bintray (diff) | |
| download | yuzu-e52ca85711e8df54c8eafe556b6ba0ca683ddea0.tar.gz yuzu-e52ca85711e8df54c8eafe556b6ba0ca683ddea0.tar.xz yuzu-e52ca85711e8df54c8eafe556b6ba0ca683ddea0.zip | |
Kernel: Implemented Pulse event and timers.
Closes #1904
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/kernel/event.cpp | 15 | ||||
| -rw-r--r-- | src/core/hle/kernel/event.h | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.h | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/timer.cpp | 12 | ||||
| -rw-r--r-- | src/core/hle/kernel/timer.h | 2 |
5 files changed, 20 insertions, 13 deletions
diff --git a/src/core/hle/kernel/event.cpp b/src/core/hle/kernel/event.cpp index 3e116e3df..a515f53f9 100644 --- a/src/core/hle/kernel/event.cpp +++ b/src/core/hle/kernel/event.cpp | |||
| @@ -22,11 +22,6 @@ SharedPtr<Event> Event::Create(ResetType reset_type, std::string name) { | |||
| 22 | evt->reset_type = reset_type; | 22 | evt->reset_type = reset_type; |
| 23 | evt->name = std::move(name); | 23 | evt->name = std::move(name); |
| 24 | 24 | ||
| 25 | if (reset_type == ResetType::Pulse) { | ||
| 26 | LOG_ERROR(Kernel, "Unimplemented event reset type Pulse"); | ||
| 27 | UNIMPLEMENTED(); | ||
| 28 | } | ||
| 29 | |||
| 30 | return evt; | 25 | return evt; |
| 31 | } | 26 | } |
| 32 | 27 | ||
| @@ -37,8 +32,7 @@ bool Event::ShouldWait() { | |||
| 37 | void Event::Acquire() { | 32 | void Event::Acquire() { |
| 38 | ASSERT_MSG(!ShouldWait(), "object unavailable!"); | 33 | ASSERT_MSG(!ShouldWait(), "object unavailable!"); |
| 39 | 34 | ||
| 40 | // Release the event if it's not sticky... | 35 | if (reset_type == ResetType::OneShot) |
| 41 | if (reset_type != ResetType::Sticky) | ||
| 42 | signaled = false; | 36 | signaled = false; |
| 43 | } | 37 | } |
| 44 | 38 | ||
| @@ -51,4 +45,11 @@ void Event::Clear() { | |||
| 51 | signaled = false; | 45 | signaled = false; |
| 52 | } | 46 | } |
| 53 | 47 | ||
| 48 | void Event::WakeupAllWaitingThreads() { | ||
| 49 | WaitObject::WakeupAllWaitingThreads(); | ||
| 50 | |||
| 51 | if (reset_type == ResetType::Pulse) | ||
| 52 | signaled = false; | ||
| 53 | } | ||
| 54 | |||
| 54 | } // namespace | 55 | } // namespace |
diff --git a/src/core/hle/kernel/event.h b/src/core/hle/kernel/event.h index 8dcd23edb..28d955b1e 100644 --- a/src/core/hle/kernel/event.h +++ b/src/core/hle/kernel/event.h | |||
| @@ -38,6 +38,8 @@ public: | |||
| 38 | bool ShouldWait() override; | 38 | bool ShouldWait() override; |
| 39 | void Acquire() override; | 39 | void Acquire() override; |
| 40 | 40 | ||
| 41 | void WakeupAllWaitingThreads() override; | ||
| 42 | |||
| 41 | void Signal(); | 43 | void Signal(); |
| 42 | void Clear(); | 44 | void Clear(); |
| 43 | 45 | ||
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h index 9503e7d04..1e68f9cab 100644 --- a/src/core/hle/kernel/kernel.h +++ b/src/core/hle/kernel/kernel.h | |||
| @@ -156,7 +156,7 @@ public: | |||
| 156 | * Wake up all threads waiting on this object that can be awoken, in priority order, | 156 | * Wake up all threads waiting on this object that can be awoken, in priority order, |
| 157 | * and set the synchronization result and output of the thread. | 157 | * and set the synchronization result and output of the thread. |
| 158 | */ | 158 | */ |
| 159 | void WakeupAllWaitingThreads(); | 159 | virtual void WakeupAllWaitingThreads(); |
| 160 | 160 | ||
| 161 | /// Obtains the highest priority thread that is ready to run from this object's waiting list. | 161 | /// Obtains the highest priority thread that is ready to run from this object's waiting list. |
| 162 | SharedPtr<Thread> GetHighestPriorityReadyThread(); | 162 | SharedPtr<Thread> GetHighestPriorityReadyThread(); |
diff --git a/src/core/hle/kernel/timer.cpp b/src/core/hle/kernel/timer.cpp index b50cf520d..ec85b7ec8 100644 --- a/src/core/hle/kernel/timer.cpp +++ b/src/core/hle/kernel/timer.cpp | |||
| @@ -31,11 +31,6 @@ SharedPtr<Timer> Timer::Create(ResetType reset_type, std::string name) { | |||
| 31 | timer->interval_delay = 0; | 31 | timer->interval_delay = 0; |
| 32 | timer->callback_handle = timer_callback_handle_table.Create(timer).MoveFrom(); | 32 | timer->callback_handle = timer_callback_handle_table.Create(timer).MoveFrom(); |
| 33 | 33 | ||
| 34 | if (reset_type == ResetType::Pulse) { | ||
| 35 | LOG_ERROR(Kernel, "Unimplemented timer reset type Pulse"); | ||
| 36 | UNIMPLEMENTED(); | ||
| 37 | } | ||
| 38 | |||
| 39 | return timer; | 34 | return timer; |
| 40 | } | 35 | } |
| 41 | 36 | ||
| @@ -70,6 +65,13 @@ void Timer::Clear() { | |||
| 70 | signaled = false; | 65 | signaled = false; |
| 71 | } | 66 | } |
| 72 | 67 | ||
| 68 | void Timer::WakeupAllWaitingThreads() { | ||
| 69 | WaitObject::WakeupAllWaitingThreads(); | ||
| 70 | |||
| 71 | if (reset_type == ResetType::Pulse) | ||
| 72 | signaled = false; | ||
| 73 | } | ||
| 74 | |||
| 73 | /// The timer callback event, called when a timer is fired | 75 | /// The timer callback event, called when a timer is fired |
| 74 | static void TimerCallback(u64 timer_handle, int cycles_late) { | 76 | static void TimerCallback(u64 timer_handle, int cycles_late) { |
| 75 | SharedPtr<Timer> timer = | 77 | SharedPtr<Timer> timer = |
diff --git a/src/core/hle/kernel/timer.h b/src/core/hle/kernel/timer.h index 18ea0236b..2092165d4 100644 --- a/src/core/hle/kernel/timer.h +++ b/src/core/hle/kernel/timer.h | |||
| @@ -42,6 +42,8 @@ public: | |||
| 42 | bool ShouldWait() override; | 42 | bool ShouldWait() override; |
| 43 | void Acquire() override; | 43 | void Acquire() override; |
| 44 | 44 | ||
| 45 | void WakeupAllWaitingThreads() override; | ||
| 46 | |||
| 45 | /** | 47 | /** |
| 46 | * Starts the timer, with the specified initial delay and interval. | 48 | * Starts the timer, with the specified initial delay and interval. |
| 47 | * @param initial Delay until the timer is first fired | 49 | * @param initial Delay until the timer is first fired |