diff options
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 17 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.h | 11 | ||||
| -rw-r--r-- | src/core/hle/kernel/readable_event.cpp | 24 | ||||
| -rw-r--r-- | src/core/hle/kernel/readable_event.h | 17 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/writable_event.cpp | 57 | ||||
| -rw-r--r-- | src/core/hle/kernel/writable_event.h | 36 |
8 files changed, 47 insertions, 125 deletions
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index 2ffdb2f5b..21fda42d6 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp | |||
| @@ -53,8 +53,10 @@ SharedPtr<WritableEvent> HLERequestContext::SleepClientThread( | |||
| 53 | auto& kernel = Core::System::GetInstance().Kernel(); | 53 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 54 | if (!writable_event || !readable_event) { | 54 | if (!writable_event || !readable_event) { |
| 55 | // Create event if not provided | 55 | // Create event if not provided |
| 56 | std::tie(writable_event, readable_event) = WritableEvent::CreateEventPair( | 56 | const auto pair = WritableEvent::CreateEventPair(kernel, Kernel::ResetType::OneShot, |
| 57 | kernel, Kernel::ResetType::OneShot, "HLE Pause Event: " + reason); | 57 | "HLE Pause Event: " + reason); |
| 58 | writable_event = pair.writable; | ||
| 59 | readable_event = pair.readable; | ||
| 58 | } | 60 | } |
| 59 | 61 | ||
| 60 | writable_event->Clear(); | 62 | writable_event->Clear(); |
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 9cd714586..21d7f3483 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -177,10 +177,6 @@ struct KernelCore::Impl { | |||
| 177 | // allowing us to simply use a pool index or similar. | 177 | // allowing us to simply use a pool index or similar. |
| 178 | Kernel::HandleTable thread_wakeup_callback_handle_table; | 178 | Kernel::HandleTable thread_wakeup_callback_handle_table; |
| 179 | 179 | ||
| 180 | /// Map of named events managed by the kernel, which are retrieved when HLE services need to | ||
| 181 | /// return an event to the system. | ||
| 182 | NamedEventTable named_events; | ||
| 183 | |||
| 184 | /// Map of named ports managed by the kernel, which can be retrieved using | 180 | /// Map of named ports managed by the kernel, which can be retrieved using |
| 185 | /// the ConnectToPort SVC. | 181 | /// the ConnectToPort SVC. |
| 186 | NamedPortTable named_ports; | 182 | NamedPortTable named_ports; |
| @@ -227,19 +223,6 @@ const Process* KernelCore::CurrentProcess() const { | |||
| 227 | return impl->current_process; | 223 | return impl->current_process; |
| 228 | } | 224 | } |
| 229 | 225 | ||
| 230 | void KernelCore::AddNamedEvent(std::string name, SharedPtr<ReadableEvent> event) { | ||
| 231 | impl->named_events.emplace(std::move(name), std::move(event)); | ||
| 232 | } | ||
| 233 | |||
| 234 | KernelCore::NamedEventTable::iterator KernelCore::FindNamedEvent(const std::string& name) { | ||
| 235 | return impl->named_events.find(name); | ||
| 236 | } | ||
| 237 | |||
| 238 | KernelCore::NamedEventTable::const_iterator KernelCore::FindNamedEvent( | ||
| 239 | const std::string& name) const { | ||
| 240 | return impl->named_events.find(name); | ||
| 241 | } | ||
| 242 | |||
| 243 | void KernelCore::AddNamedPort(std::string name, SharedPtr<ClientPort> port) { | 226 | void KernelCore::AddNamedPort(std::string name, SharedPtr<ClientPort> port) { |
| 244 | impl->named_ports.emplace(std::move(name), std::move(port)); | 227 | impl->named_ports.emplace(std::move(name), std::move(port)); |
| 245 | } | 228 | } |
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h index f12d061eb..ea00c89f5 100644 --- a/src/core/hle/kernel/kernel.h +++ b/src/core/hle/kernel/kernel.h | |||
| @@ -20,7 +20,6 @@ namespace Kernel { | |||
| 20 | class ClientPort; | 20 | class ClientPort; |
| 21 | class HandleTable; | 21 | class HandleTable; |
| 22 | class Process; | 22 | class Process; |
| 23 | class ReadableEvent; | ||
| 24 | class ResourceLimit; | 23 | class ResourceLimit; |
| 25 | class Thread; | 24 | class Thread; |
| 26 | class Timer; | 25 | class Timer; |
| @@ -28,7 +27,6 @@ class Timer; | |||
| 28 | /// Represents a single instance of the kernel. | 27 | /// Represents a single instance of the kernel. |
| 29 | class KernelCore { | 28 | class KernelCore { |
| 30 | private: | 29 | private: |
| 31 | using NamedEventTable = std::unordered_map<std::string, SharedPtr<ReadableEvent>>; | ||
| 32 | using NamedPortTable = std::unordered_map<std::string, SharedPtr<ClientPort>>; | 30 | using NamedPortTable = std::unordered_map<std::string, SharedPtr<ClientPort>>; |
| 33 | 31 | ||
| 34 | public: | 32 | public: |
| @@ -68,15 +66,6 @@ public: | |||
| 68 | /// Retrieves a const pointer to the current process. | 66 | /// Retrieves a const pointer to the current process. |
| 69 | const Process* CurrentProcess() const; | 67 | const Process* CurrentProcess() const; |
| 70 | 68 | ||
| 71 | /// Adds an event to the named event table | ||
| 72 | void AddNamedEvent(std::string name, SharedPtr<ReadableEvent> event); | ||
| 73 | |||
| 74 | /// Finds an event within the named event table wit the given name. | ||
| 75 | NamedEventTable::iterator FindNamedEvent(const std::string& name); | ||
| 76 | |||
| 77 | /// Finds an event within the named event table wit the given name. | ||
| 78 | NamedEventTable::const_iterator FindNamedEvent(const std::string& name) const; | ||
| 79 | |||
| 80 | /// Adds a port to the named port table | 69 | /// Adds a port to the named port table |
| 81 | void AddNamedPort(std::string name, SharedPtr<ClientPort> port); | 70 | void AddNamedPort(std::string name, SharedPtr<ClientPort> port); |
| 82 | 71 | ||
diff --git a/src/core/hle/kernel/readable_event.cpp b/src/core/hle/kernel/readable_event.cpp index 164cffbdb..92e16b4e6 100644 --- a/src/core/hle/kernel/readable_event.cpp +++ b/src/core/hle/kernel/readable_event.cpp | |||
| @@ -15,34 +15,30 @@ ReadableEvent::ReadableEvent(KernelCore& kernel) : WaitObject{kernel} {} | |||
| 15 | ReadableEvent::~ReadableEvent() = default; | 15 | ReadableEvent::~ReadableEvent() = default; |
| 16 | 16 | ||
| 17 | bool ReadableEvent::ShouldWait(Thread* thread) const { | 17 | bool ReadableEvent::ShouldWait(Thread* thread) const { |
| 18 | return !writable_event->IsSignaled(); | 18 | return !signaled; |
| 19 | } | 19 | } |
| 20 | 20 | ||
| 21 | void ReadableEvent::Acquire(Thread* thread) { | 21 | void ReadableEvent::Acquire(Thread* thread) { |
| 22 | ASSERT_MSG(!ShouldWait(thread), "object unavailable!"); | 22 | ASSERT_MSG(!ShouldWait(thread), "object unavailable!"); |
| 23 | 23 | ||
| 24 | writable_event->ResetOnAcquire(); | 24 | if (reset_type == ResetType::OneShot) |
| 25 | } | 25 | signaled = false; |
| 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 | } | 26 | } |
| 34 | 27 | ||
| 35 | void ReadableEvent::Signal() { | 28 | void ReadableEvent::Signal() { |
| 36 | writable_event->Signal(); | 29 | signaled = true; |
| 30 | WakeupAllWaitingThreads(); | ||
| 37 | } | 31 | } |
| 38 | 32 | ||
| 39 | void ReadableEvent::Clear() { | 33 | void ReadableEvent::Clear() { |
| 40 | writable_event->Clear(); | 34 | signaled = false; |
| 41 | } | 35 | } |
| 42 | 36 | ||
| 43 | void ReadableEvent::WakeupAllWaitingThreads() { | 37 | void ReadableEvent::WakeupAllWaitingThreads() { |
| 44 | writable_event->WakeupAllWaitingThreads(); | 38 | WaitObject::WakeupAllWaitingThreads(); |
| 45 | writable_event->ResetOnWakeup(); | 39 | |
| 40 | if (reset_type == ResetType::Pulse) | ||
| 41 | signaled = false; | ||
| 46 | } | 42 | } |
| 47 | 43 | ||
| 48 | } // namespace Kernel | 44 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/readable_event.h b/src/core/hle/kernel/readable_event.h index 020ef4ebc..b1f1f4871 100644 --- a/src/core/hle/kernel/readable_event.h +++ b/src/core/hle/kernel/readable_event.h | |||
| @@ -25,6 +25,10 @@ public: | |||
| 25 | return name; | 25 | return name; |
| 26 | } | 26 | } |
| 27 | 27 | ||
| 28 | ResetType GetResetType() const { | ||
| 29 | return reset_type; | ||
| 30 | } | ||
| 31 | |||
| 28 | static const HandleType HANDLE_TYPE = HandleType::Event; | 32 | static const HandleType HANDLE_TYPE = HandleType::Event; |
| 29 | HandleType GetHandleType() const override { | 33 | HandleType GetHandleType() const override { |
| 30 | return HANDLE_TYPE; | 34 | return HANDLE_TYPE; |
| @@ -35,20 +39,15 @@ public: | |||
| 35 | 39 | ||
| 36 | void WakeupAllWaitingThreads() override; | 40 | void WakeupAllWaitingThreads() override; |
| 37 | 41 | ||
| 38 | void AddWaitingThread(SharedPtr<Thread> thread) override; | ||
| 39 | void RemoveWaitingThread(Thread* thread) override; | ||
| 40 | |||
| 41 | void Signal(); | ||
| 42 | void Clear(); | 42 | void Clear(); |
| 43 | 43 | ||
| 44 | SharedPtr<WritableEvent> PromoteToWritable() const { | ||
| 45 | return writable_event; | ||
| 46 | } | ||
| 47 | |||
| 48 | private: | 44 | private: |
| 49 | explicit ReadableEvent(KernelCore& kernel); | 45 | explicit ReadableEvent(KernelCore& kernel); |
| 50 | 46 | ||
| 51 | SharedPtr<WritableEvent> writable_event; ///< WritableEvent associated with this ReadableEvent | 47 | void Signal(); |
| 48 | |||
| 49 | ResetType reset_type; | ||
| 50 | bool signaled; | ||
| 52 | 51 | ||
| 53 | std::string name; ///< Name of event (optional) | 52 | std::string name; ///< Name of event (optional) |
| 54 | }; | 53 | }; |
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 85a9c50fb..abc48ee54 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -1366,7 +1366,7 @@ static ResultCode ResetSignal(Handle handle) { | |||
| 1366 | 1366 | ||
| 1367 | ASSERT(event != nullptr); | 1367 | ASSERT(event != nullptr); |
| 1368 | 1368 | ||
| 1369 | event->PromoteToWritable()->Clear(); | 1369 | event->Clear(); |
| 1370 | return RESULT_SUCCESS; | 1370 | return RESULT_SUCCESS; |
| 1371 | } | 1371 | } |
| 1372 | 1372 | ||
| @@ -1531,7 +1531,7 @@ static ResultCode ClearEvent(Handle handle) { | |||
| 1531 | return ERR_INVALID_HANDLE; | 1531 | return ERR_INVALID_HANDLE; |
| 1532 | } | 1532 | } |
| 1533 | 1533 | ||
| 1534 | evt->PromoteToWritable()->Clear(); | 1534 | evt->Clear(); |
| 1535 | return RESULT_SUCCESS; | 1535 | return RESULT_SUCCESS; |
| 1536 | } | 1536 | } |
| 1537 | 1537 | ||
diff --git a/src/core/hle/kernel/writable_event.cpp b/src/core/hle/kernel/writable_event.cpp index 4eb387ac0..27d7ff734 100644 --- a/src/core/hle/kernel/writable_event.cpp +++ b/src/core/hle/kernel/writable_event.cpp | |||
| @@ -12,70 +12,37 @@ | |||
| 12 | 12 | ||
| 13 | namespace Kernel { | 13 | namespace Kernel { |
| 14 | 14 | ||
| 15 | WritableEvent::WritableEvent(KernelCore& kernel) : WaitObject{kernel} {} | 15 | WritableEvent::WritableEvent(KernelCore& kernel) : Object{kernel} {} |
| 16 | WritableEvent::~WritableEvent() = default; | 16 | WritableEvent::~WritableEvent() = default; |
| 17 | 17 | ||
| 18 | std::tuple<SharedPtr<WritableEvent>, SharedPtr<ReadableEvent>> WritableEvent::CreateEventPair( | 18 | EventPair WritableEvent::CreateEventPair(KernelCore& kernel, ResetType reset_type, |
| 19 | KernelCore& kernel, ResetType reset_type, std::string name) { | 19 | std::string name) { |
| 20 | SharedPtr<WritableEvent> writable_event(new WritableEvent(kernel)); | 20 | SharedPtr<WritableEvent> writable_event(new WritableEvent(kernel)); |
| 21 | SharedPtr<ReadableEvent> readable_event(new ReadableEvent(kernel)); | 21 | SharedPtr<ReadableEvent> readable_event(new ReadableEvent(kernel)); |
| 22 | 22 | ||
| 23 | writable_event->name = name + ":Writable"; | 23 | writable_event->name = name + ":Writable"; |
| 24 | writable_event->signaled = false; | 24 | writable_event->readable = readable_event; |
| 25 | writable_event->reset_type = reset_type; | ||
| 26 | readable_event->name = name + ":Readable"; | 25 | readable_event->name = name + ":Readable"; |
| 27 | readable_event->writable_event = writable_event; | 26 | readable_event->signaled = false; |
| 27 | readable_event->reset_type = reset_type; | ||
| 28 | 28 | ||
| 29 | return std::make_tuple(std::move(writable_event), std::move(readable_event)); | 29 | return {std::move(readable_event), std::move(writable_event)}; |
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | SharedPtr<WritableEvent> WritableEvent::CreateRegisteredEventPair(KernelCore& kernel, | 32 | ResetType WritableEvent::GetResetType() const { |
| 33 | ResetType reset_type, | 33 | return readable->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 | } | 34 | } |
| 50 | 35 | ||
| 51 | void WritableEvent::Signal() { | 36 | void WritableEvent::Signal() { |
| 52 | signaled = true; | 37 | readable->Signal(); |
| 53 | WakeupAllWaitingThreads(); | ||
| 54 | } | 38 | } |
| 55 | 39 | ||
| 56 | void WritableEvent::Clear() { | 40 | void WritableEvent::Clear() { |
| 57 | signaled = false; | 41 | readable->Clear(); |
| 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 | } | 42 | } |
| 69 | 43 | ||
| 70 | bool WritableEvent::IsSignaled() const { | 44 | bool WritableEvent::IsSignaled() const { |
| 71 | return signaled; | 45 | return readable->signaled; |
| 72 | } | ||
| 73 | |||
| 74 | void WritableEvent::WakeupAllWaitingThreads() { | ||
| 75 | WaitObject::WakeupAllWaitingThreads(); | ||
| 76 | |||
| 77 | if (reset_type == ResetType::Pulse) | ||
| 78 | signaled = false; | ||
| 79 | } | 46 | } |
| 80 | 47 | ||
| 81 | } // namespace Kernel | 48 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/writable_event.h b/src/core/hle/kernel/writable_event.h index c0fe42302..4357d1b9f 100644 --- a/src/core/hle/kernel/writable_event.h +++ b/src/core/hle/kernel/writable_event.h | |||
| @@ -12,8 +12,14 @@ namespace Kernel { | |||
| 12 | 12 | ||
| 13 | class KernelCore; | 13 | class KernelCore; |
| 14 | class ReadableEvent; | 14 | class ReadableEvent; |
| 15 | class WritableEvent; | ||
| 15 | 16 | ||
| 16 | class WritableEvent final : public WaitObject { | 17 | struct EventPair { |
| 18 | SharedPtr<ReadableEvent> readable; | ||
| 19 | SharedPtr<WritableEvent> writable; | ||
| 20 | }; | ||
| 21 | |||
| 22 | class WritableEvent final : public Object { | ||
| 17 | public: | 23 | public: |
| 18 | ~WritableEvent() override; | 24 | ~WritableEvent() override; |
| 19 | 25 | ||
| @@ -23,18 +29,8 @@ public: | |||
| 23 | * @param reset_type ResetType describing how to create event | 29 | * @param reset_type ResetType describing how to create event |
| 24 | * @param name Optional name of event | 30 | * @param name Optional name of event |
| 25 | */ | 31 | */ |
| 26 | static std::tuple<SharedPtr<WritableEvent>, SharedPtr<ReadableEvent>> CreateEventPair( | 32 | static EventPair CreateEventPair(KernelCore& kernel, ResetType reset_type, |
| 27 | KernelCore& kernel, ResetType reset_type, std::string name = "Unknown"); | 33 | 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); | ||
| 38 | 34 | ||
| 39 | std::string GetTypeName() const override { | 35 | std::string GetTypeName() const override { |
| 40 | return "WritableEvent"; | 36 | return "WritableEvent"; |
| @@ -48,27 +44,17 @@ public: | |||
| 48 | return HANDLE_TYPE; | 44 | return HANDLE_TYPE; |
| 49 | } | 45 | } |
| 50 | 46 | ||
| 51 | ResetType GetResetType() const { | 47 | ResetType GetResetType() const; |
| 52 | return reset_type; | ||
| 53 | } | ||
| 54 | |||
| 55 | bool ShouldWait(Thread* thread) const override; | ||
| 56 | void Acquire(Thread* thread) override; | ||
| 57 | |||
| 58 | void WakeupAllWaitingThreads() override; | ||
| 59 | 48 | ||
| 60 | void Signal(); | 49 | void Signal(); |
| 61 | void Clear(); | 50 | void Clear(); |
| 62 | void ResetOnAcquire(); | ||
| 63 | void ResetOnWakeup(); | ||
| 64 | bool IsSignaled() const; | 51 | bool IsSignaled() const; |
| 65 | 52 | ||
| 66 | private: | 53 | private: |
| 67 | explicit WritableEvent(KernelCore& kernel); | 54 | explicit WritableEvent(KernelCore& kernel); |
| 68 | 55 | ||
| 69 | ResetType reset_type; ///< Current ResetType | 56 | SharedPtr<ReadableEvent> readable; |
| 70 | 57 | ||
| 71 | bool signaled; ///< Whether the event has already been signaled | ||
| 72 | std::string name; ///< Name of event (optional) | 58 | std::string name; ///< Name of event (optional) |
| 73 | }; | 59 | }; |
| 74 | 60 | ||