diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/CMakeLists.txt | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/event.cpp | 53 | ||||
| -rw-r--r-- | src/core/hle/kernel/readable_event.cpp | 48 | ||||
| -rw-r--r-- | src/core/hle/kernel/readable_event.h | 56 | ||||
| -rw-r--r-- | src/core/hle/kernel/writable_event.cpp | 81 | ||||
| -rw-r--r-- | src/core/hle/kernel/writable_event.h (renamed from src/core/hle/kernel/event.h) | 27 |
6 files changed, 210 insertions, 61 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index e1f21a764..73aec8ab0 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt | |||
| @@ -97,8 +97,6 @@ add_library(core STATIC | |||
| 97 | hle/kernel/client_session.cpp | 97 | hle/kernel/client_session.cpp |
| 98 | hle/kernel/client_session.h | 98 | hle/kernel/client_session.h |
| 99 | hle/kernel/errors.h | 99 | hle/kernel/errors.h |
| 100 | hle/kernel/event.cpp | ||
| 101 | hle/kernel/event.h | ||
| 102 | hle/kernel/handle_table.cpp | 100 | hle/kernel/handle_table.cpp |
| 103 | hle/kernel/handle_table.h | 101 | hle/kernel/handle_table.h |
| 104 | hle/kernel/hle_ipc.cpp | 102 | hle/kernel/hle_ipc.cpp |
| @@ -111,6 +109,8 @@ add_library(core STATIC | |||
| 111 | hle/kernel/object.h | 109 | hle/kernel/object.h |
| 112 | hle/kernel/process.cpp | 110 | hle/kernel/process.cpp |
| 113 | hle/kernel/process.h | 111 | hle/kernel/process.h |
| 112 | hle/kernel/readable_event.cpp | ||
| 113 | hle/kernel/readable_event.h | ||
| 114 | hle/kernel/resource_limit.cpp | 114 | hle/kernel/resource_limit.cpp |
| 115 | hle/kernel/resource_limit.h | 115 | hle/kernel/resource_limit.h |
| 116 | hle/kernel/scheduler.cpp | 116 | hle/kernel/scheduler.cpp |
| @@ -133,6 +133,8 @@ add_library(core STATIC | |||
| 133 | hle/kernel/vm_manager.h | 133 | hle/kernel/vm_manager.h |
| 134 | hle/kernel/wait_object.cpp | 134 | hle/kernel/wait_object.cpp |
| 135 | hle/kernel/wait_object.h | 135 | hle/kernel/wait_object.h |
| 136 | hle/kernel/writable_event.cpp | ||
| 137 | hle/kernel/writable_event.h | ||
| 136 | hle/lock.cpp | 138 | hle/lock.cpp |
| 137 | hle/lock.h | 139 | hle/lock.h |
| 138 | hle/result.h | 140 | hle/result.h |
diff --git a/src/core/hle/kernel/event.cpp b/src/core/hle/kernel/event.cpp deleted file mode 100644 index 8967e602e..000000000 --- a/src/core/hle/kernel/event.cpp +++ /dev/null | |||
| @@ -1,53 +0,0 @@ | |||
| 1 | // Copyright 2014 Citra Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include <algorithm> | ||
| 6 | #include "common/assert.h" | ||
| 7 | #include "core/hle/kernel/event.h" | ||
| 8 | #include "core/hle/kernel/object.h" | ||
| 9 | #include "core/hle/kernel/thread.h" | ||
| 10 | |||
| 11 | namespace Kernel { | ||
| 12 | |||
| 13 | Event::Event(KernelCore& kernel) : WaitObject{kernel} {} | ||
| 14 | Event::~Event() = default; | ||
| 15 | |||
| 16 | SharedPtr<Event> Event::Create(KernelCore& kernel, ResetType reset_type, std::string name) { | ||
| 17 | SharedPtr<Event> evt(new Event(kernel)); | ||
| 18 | |||
| 19 | evt->signaled = false; | ||
| 20 | evt->reset_type = reset_type; | ||
| 21 | evt->name = std::move(name); | ||
| 22 | |||
| 23 | return evt; | ||
| 24 | } | ||
| 25 | |||
| 26 | bool Event::ShouldWait(Thread* thread) const { | ||
| 27 | return !signaled; | ||
| 28 | } | ||
| 29 | |||
| 30 | void Event::Acquire(Thread* thread) { | ||
| 31 | ASSERT_MSG(!ShouldWait(thread), "object unavailable!"); | ||
| 32 | |||
| 33 | if (reset_type == ResetType::OneShot) | ||
| 34 | signaled = false; | ||
| 35 | } | ||
| 36 | |||
| 37 | void Event::Signal() { | ||
| 38 | signaled = true; | ||
| 39 | WakeupAllWaitingThreads(); | ||
| 40 | } | ||
| 41 | |||
| 42 | void Event::Clear() { | ||
| 43 | signaled = false; | ||
| 44 | } | ||
| 45 | |||
| 46 | void Event::WakeupAllWaitingThreads() { | ||
| 47 | WaitObject::WakeupAllWaitingThreads(); | ||
| 48 | |||
| 49 | if (reset_type == ResetType::Pulse) | ||
| 50 | signaled = false; | ||
| 51 | } | ||
| 52 | |||
| 53 | } // namespace Kernel | ||
diff --git a/src/core/hle/kernel/readable_event.cpp b/src/core/hle/kernel/readable_event.cpp new file mode 100644 index 000000000..164cffbdb --- /dev/null +++ b/src/core/hle/kernel/readable_event.cpp | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | // Copyright 2014 Citra Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include <algorithm> | ||
| 6 | #include "common/assert.h" | ||
| 7 | #include "core/hle/kernel/object.h" | ||
| 8 | #include "core/hle/kernel/readable_event.h" | ||
| 9 | #include "core/hle/kernel/thread.h" | ||
| 10 | #include "core/hle/kernel/writable_event.h" | ||
| 11 | |||
| 12 | namespace Kernel { | ||
| 13 | |||
| 14 | ReadableEvent::ReadableEvent(KernelCore& kernel) : WaitObject{kernel} {} | ||
| 15 | ReadableEvent::~ReadableEvent() = default; | ||
| 16 | |||
| 17 | bool ReadableEvent::ShouldWait(Thread* thread) const { | ||
| 18 | return !writable_event->IsSignaled(); | ||
| 19 | } | ||
| 20 | |||
| 21 | void ReadableEvent::Acquire(Thread* thread) { | ||
| 22 | ASSERT_MSG(!ShouldWait(thread), "object unavailable!"); | ||
| 23 | |||
| 24 | writable_event->ResetOnAcquire(); | ||
| 25 | } | ||
| 26 | |||
| 27 | void ReadableEvent::AddWaitingThread(SharedPtr<Thread> thread) { | ||
| 28 | writable_event->AddWaitingThread(thread); | ||
| 29 | } | ||
| 30 | |||
| 31 | void ReadableEvent::RemoveWaitingThread(Thread* thread) { | ||
| 32 | writable_event->RemoveWaitingThread(thread); | ||
| 33 | } | ||
| 34 | |||
| 35 | void ReadableEvent::Signal() { | ||
| 36 | writable_event->Signal(); | ||
| 37 | } | ||
| 38 | |||
| 39 | void ReadableEvent::Clear() { | ||
| 40 | writable_event->Clear(); | ||
| 41 | } | ||
| 42 | |||
| 43 | void ReadableEvent::WakeupAllWaitingThreads() { | ||
| 44 | writable_event->WakeupAllWaitingThreads(); | ||
| 45 | writable_event->ResetOnWakeup(); | ||
| 46 | } | ||
| 47 | |||
| 48 | } // namespace Kernel | ||
diff --git a/src/core/hle/kernel/readable_event.h b/src/core/hle/kernel/readable_event.h new file mode 100644 index 000000000..020ef4ebc --- /dev/null +++ b/src/core/hle/kernel/readable_event.h | |||
| @@ -0,0 +1,56 @@ | |||
| 1 | // Copyright 2014 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 "core/hle/kernel/object.h" | ||
| 8 | #include "core/hle/kernel/wait_object.h" | ||
| 9 | |||
| 10 | namespace Kernel { | ||
| 11 | |||
| 12 | class KernelCore; | ||
| 13 | class WritableEvent; | ||
| 14 | |||
| 15 | class ReadableEvent final : public WaitObject { | ||
| 16 | friend class WritableEvent; | ||
| 17 | |||
| 18 | public: | ||
| 19 | ~ReadableEvent() override; | ||
| 20 | |||
| 21 | std::string GetTypeName() const override { | ||
| 22 | return "ReadableEvent"; | ||
| 23 | } | ||
| 24 | std::string GetName() const override { | ||
| 25 | return name; | ||
| 26 | } | ||
| 27 | |||
| 28 | static const HandleType HANDLE_TYPE = HandleType::Event; | ||
| 29 | HandleType GetHandleType() const override { | ||
| 30 | return HANDLE_TYPE; | ||
| 31 | } | ||
| 32 | |||
| 33 | bool ShouldWait(Thread* thread) const override; | ||
| 34 | void Acquire(Thread* thread) override; | ||
| 35 | |||
| 36 | void WakeupAllWaitingThreads() override; | ||
| 37 | |||
| 38 | void AddWaitingThread(SharedPtr<Thread> thread) override; | ||
| 39 | void RemoveWaitingThread(Thread* thread) override; | ||
| 40 | |||
| 41 | void Signal(); | ||
| 42 | void Clear(); | ||
| 43 | |||
| 44 | SharedPtr<WritableEvent> PromoteToWritable() const { | ||
| 45 | return writable_event; | ||
| 46 | } | ||
| 47 | |||
| 48 | private: | ||
| 49 | explicit ReadableEvent(KernelCore& kernel); | ||
| 50 | |||
| 51 | SharedPtr<WritableEvent> writable_event; ///< WritableEvent associated with this ReadableEvent | ||
| 52 | |||
| 53 | std::string name; ///< Name of event (optional) | ||
| 54 | }; | ||
| 55 | |||
| 56 | } // namespace Kernel | ||
diff --git a/src/core/hle/kernel/writable_event.cpp b/src/core/hle/kernel/writable_event.cpp new file mode 100644 index 000000000..4eb387ac0 --- /dev/null +++ b/src/core/hle/kernel/writable_event.cpp | |||
| @@ -0,0 +1,81 @@ | |||
| 1 | // Copyright 2014 Citra Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include <algorithm> | ||
| 6 | #include "common/assert.h" | ||
| 7 | #include "core/hle/kernel/kernel.h" | ||
| 8 | #include "core/hle/kernel/object.h" | ||
| 9 | #include "core/hle/kernel/readable_event.h" | ||
| 10 | #include "core/hle/kernel/thread.h" | ||
| 11 | #include "core/hle/kernel/writable_event.h" | ||
| 12 | |||
| 13 | namespace Kernel { | ||
| 14 | |||
| 15 | WritableEvent::WritableEvent(KernelCore& kernel) : WaitObject{kernel} {} | ||
| 16 | WritableEvent::~WritableEvent() = default; | ||
| 17 | |||
| 18 | std::tuple<SharedPtr<WritableEvent>, SharedPtr<ReadableEvent>> WritableEvent::CreateEventPair( | ||
| 19 | KernelCore& kernel, ResetType reset_type, std::string name) { | ||
| 20 | SharedPtr<WritableEvent> writable_event(new WritableEvent(kernel)); | ||
| 21 | SharedPtr<ReadableEvent> readable_event(new ReadableEvent(kernel)); | ||
| 22 | |||
| 23 | writable_event->name = name + ":Writable"; | ||
| 24 | writable_event->signaled = false; | ||
| 25 | writable_event->reset_type = reset_type; | ||
| 26 | readable_event->name = name + ":Readable"; | ||
| 27 | readable_event->writable_event = writable_event; | ||
| 28 | |||
| 29 | return std::make_tuple(std::move(writable_event), std::move(readable_event)); | ||
| 30 | } | ||
| 31 | |||
| 32 | SharedPtr<WritableEvent> WritableEvent::CreateRegisteredEventPair(KernelCore& kernel, | ||
| 33 | ResetType reset_type, | ||
| 34 | std::string name) { | ||
| 35 | auto [writable_event, readable_event] = CreateEventPair(kernel, reset_type, name); | ||
| 36 | kernel.AddNamedEvent(name, std::move(readable_event)); | ||
| 37 | return std::move(writable_event); | ||
| 38 | } | ||
| 39 | |||
| 40 | bool WritableEvent::ShouldWait(Thread* thread) const { | ||
| 41 | return !signaled; | ||
| 42 | } | ||
| 43 | |||
| 44 | void WritableEvent::Acquire(Thread* thread) { | ||
| 45 | ASSERT_MSG(!ShouldWait(thread), "object unavailable!"); | ||
| 46 | |||
| 47 | if (reset_type == ResetType::OneShot) | ||
| 48 | signaled = false; | ||
| 49 | } | ||
| 50 | |||
| 51 | void WritableEvent::Signal() { | ||
| 52 | signaled = true; | ||
| 53 | WakeupAllWaitingThreads(); | ||
| 54 | } | ||
| 55 | |||
| 56 | void WritableEvent::Clear() { | ||
| 57 | signaled = false; | ||
| 58 | } | ||
| 59 | |||
| 60 | void WritableEvent::ResetOnAcquire() { | ||
| 61 | if (reset_type == ResetType::OneShot) | ||
| 62 | Clear(); | ||
| 63 | } | ||
| 64 | |||
| 65 | void WritableEvent::ResetOnWakeup() { | ||
| 66 | if (reset_type == ResetType::Pulse) | ||
| 67 | Clear(); | ||
| 68 | } | ||
| 69 | |||
| 70 | bool WritableEvent::IsSignaled() const { | ||
| 71 | return signaled; | ||
| 72 | } | ||
| 73 | |||
| 74 | void WritableEvent::WakeupAllWaitingThreads() { | ||
| 75 | WaitObject::WakeupAllWaitingThreads(); | ||
| 76 | |||
| 77 | if (reset_type == ResetType::Pulse) | ||
| 78 | signaled = false; | ||
| 79 | } | ||
| 80 | |||
| 81 | } // namespace Kernel | ||
diff --git a/src/core/hle/kernel/event.h b/src/core/hle/kernel/writable_event.h index 27d6126b0..c0fe42302 100644 --- a/src/core/hle/kernel/event.h +++ b/src/core/hle/kernel/writable_event.h | |||
| @@ -11,20 +11,33 @@ | |||
| 11 | namespace Kernel { | 11 | namespace Kernel { |
| 12 | 12 | ||
| 13 | class KernelCore; | 13 | class KernelCore; |
| 14 | class ReadableEvent; | ||
| 14 | 15 | ||
| 15 | class Event final : public WaitObject { | 16 | class WritableEvent final : public WaitObject { |
| 16 | public: | 17 | public: |
| 18 | ~WritableEvent() override; | ||
| 19 | |||
| 17 | /** | 20 | /** |
| 18 | * Creates an event | 21 | * Creates an event |
| 19 | * @param kernel The kernel instance to create this event under. | 22 | * @param kernel The kernel instance to create this event under. |
| 20 | * @param reset_type ResetType describing how to create event | 23 | * @param reset_type ResetType describing how to create event |
| 21 | * @param name Optional name of event | 24 | * @param name Optional name of event |
| 22 | */ | 25 | */ |
| 23 | static SharedPtr<Event> Create(KernelCore& kernel, ResetType reset_type, | 26 | static std::tuple<SharedPtr<WritableEvent>, SharedPtr<ReadableEvent>> CreateEventPair( |
| 24 | std::string name = "Unknown"); | 27 | KernelCore& kernel, ResetType reset_type, std::string name = "Unknown"); |
| 28 | |||
| 29 | /** | ||
| 30 | * Creates an event and registers it in the kernel's named event table | ||
| 31 | * @param kernel The kernel instance to create this event under. | ||
| 32 | * @param reset_type ResetType describing how to create event | ||
| 33 | * @param name name of event | ||
| 34 | */ | ||
| 35 | static SharedPtr<WritableEvent> CreateRegisteredEventPair(KernelCore& kernel, | ||
| 36 | ResetType reset_type, | ||
| 37 | std::string name); | ||
| 25 | 38 | ||
| 26 | std::string GetTypeName() const override { | 39 | std::string GetTypeName() const override { |
| 27 | return "Event"; | 40 | return "WritableEvent"; |
| 28 | } | 41 | } |
| 29 | std::string GetName() const override { | 42 | std::string GetName() const override { |
| 30 | return name; | 43 | return name; |
| @@ -46,10 +59,12 @@ public: | |||
| 46 | 59 | ||
| 47 | void Signal(); | 60 | void Signal(); |
| 48 | void Clear(); | 61 | void Clear(); |
| 62 | void ResetOnAcquire(); | ||
| 63 | void ResetOnWakeup(); | ||
| 64 | bool IsSignaled() const; | ||
| 49 | 65 | ||
| 50 | private: | 66 | private: |
| 51 | explicit Event(KernelCore& kernel); | 67 | explicit WritableEvent(KernelCore& kernel); |
| 52 | ~Event() override; | ||
| 53 | 68 | ||
| 54 | ResetType reset_type; ///< Current ResetType | 69 | ResetType reset_type; ///< Current ResetType |
| 55 | 70 | ||