diff options
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/handle_table.cpp | 1 | ||||
| -rw-r--r-- | src/core/hle/kernel/init/init_slab_setup.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_event.cpp | 38 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_event.h | 23 | ||||
| -rw-r--r-- | src/core/hle/kernel/object.h | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 9 |
6 files changed, 56 insertions, 19 deletions
diff --git a/src/core/hle/kernel/handle_table.cpp b/src/core/hle/kernel/handle_table.cpp index 427c6fc1b..58c49460f 100644 --- a/src/core/hle/kernel/handle_table.cpp +++ b/src/core/hle/kernel/handle_table.cpp | |||
| @@ -53,6 +53,7 @@ ResultVal<Handle> HandleTable::Create(Object* obj) { | |||
| 53 | switch (obj->GetHandleType()) { | 53 | switch (obj->GetHandleType()) { |
| 54 | case HandleType::SharedMemory: | 54 | case HandleType::SharedMemory: |
| 55 | case HandleType::Thread: | 55 | case HandleType::Thread: |
| 56 | case HandleType::Event: | ||
| 56 | case HandleType::Process: { | 57 | case HandleType::Process: { |
| 57 | Handle handle{}; | 58 | Handle handle{}; |
| 58 | Add(&handle, reinterpret_cast<KAutoObject*>(obj), {}); | 59 | Add(&handle, reinterpret_cast<KAutoObject*>(obj), {}); |
diff --git a/src/core/hle/kernel/init/init_slab_setup.cpp b/src/core/hle/kernel/init/init_slab_setup.cpp index eb9c8e2e4..b292f7db2 100644 --- a/src/core/hle/kernel/init/init_slab_setup.cpp +++ b/src/core/hle/kernel/init/init_slab_setup.cpp | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #include "core/core.h" | 9 | #include "core/core.h" |
| 10 | #include "core/hardware_properties.h" | 10 | #include "core/hardware_properties.h" |
| 11 | #include "core/hle/kernel/init/init_slab_setup.h" | 11 | #include "core/hle/kernel/init/init_slab_setup.h" |
| 12 | #include "core/hle/kernel/k_event.h" | ||
| 12 | #include "core/hle/kernel/k_memory_layout.h" | 13 | #include "core/hle/kernel/k_memory_layout.h" |
| 13 | #include "core/hle/kernel/k_memory_manager.h" | 14 | #include "core/hle/kernel/k_memory_manager.h" |
| 14 | #include "core/hle/kernel/k_shared_memory.h" | 15 | #include "core/hle/kernel/k_shared_memory.h" |
| @@ -25,6 +26,7 @@ namespace Kernel::Init { | |||
| 25 | #define FOREACH_SLAB_TYPE(HANDLER, ...) \ | 26 | #define FOREACH_SLAB_TYPE(HANDLER, ...) \ |
| 26 | HANDLER(Process, (SLAB_COUNT(Process)), ##__VA_ARGS__) \ | 27 | HANDLER(Process, (SLAB_COUNT(Process)), ##__VA_ARGS__) \ |
| 27 | HANDLER(KThread, (SLAB_COUNT(KThread)), ##__VA_ARGS__) \ | 28 | HANDLER(KThread, (SLAB_COUNT(KThread)), ##__VA_ARGS__) \ |
| 29 | HANDLER(KEvent, (SLAB_COUNT(KEvent)), ##__VA_ARGS__) \ | ||
| 28 | HANDLER(KSharedMemory, (SLAB_COUNT(KSharedMemory)), ##__VA_ARGS__) | 30 | HANDLER(KSharedMemory, (SLAB_COUNT(KSharedMemory)), ##__VA_ARGS__) |
| 29 | 31 | ||
| 30 | namespace { | 32 | namespace { |
diff --git a/src/core/hle/kernel/k_event.cpp b/src/core/hle/kernel/k_event.cpp index bb2fa4ad5..bc4a79cc8 100644 --- a/src/core/hle/kernel/k_event.cpp +++ b/src/core/hle/kernel/k_event.cpp | |||
| @@ -4,29 +4,53 @@ | |||
| 4 | 4 | ||
| 5 | #include "core/hle/kernel/k_event.h" | 5 | #include "core/hle/kernel/k_event.h" |
| 6 | #include "core/hle/kernel/k_readable_event.h" | 6 | #include "core/hle/kernel/k_readable_event.h" |
| 7 | #include "core/hle/kernel/k_resource_limit.h" | ||
| 7 | #include "core/hle/kernel/k_writable_event.h" | 8 | #include "core/hle/kernel/k_writable_event.h" |
| 9 | #include "core/hle/kernel/process.h" | ||
| 8 | 10 | ||
| 9 | namespace Kernel { | 11 | namespace Kernel { |
| 10 | 12 | ||
| 11 | KEvent::KEvent(KernelCore& kernel, std::string&& name) : Object{kernel, std::move(name)} {} | 13 | KEvent::KEvent(KernelCore& kernel) : KAutoObjectWithSlabHeapAndContainer{kernel} {} |
| 12 | 14 | ||
| 13 | KEvent::~KEvent() = default; | 15 | KEvent::~KEvent() = default; |
| 14 | 16 | ||
| 15 | std::shared_ptr<KEvent> KEvent::Create(KernelCore& kernel, std::string&& name) { | 17 | void KEvent::Initialize(std::string&& name_) { |
| 16 | return std::make_shared<KEvent>(kernel, std::move(name)); | 18 | // Increment reference count. |
| 17 | } | 19 | // Because reference count is one on creation, this will result |
| 20 | // in a reference count of two. Thus, when both readable and | ||
| 21 | // writable events are closed this object will be destroyed. | ||
| 22 | Open(); | ||
| 18 | 23 | ||
| 19 | void KEvent::Initialize() { | ||
| 20 | // Create our sub events. | 24 | // Create our sub events. |
| 21 | readable_event = std::make_shared<KReadableEvent>(kernel, GetName() + ":Readable"); | 25 | readable_event = std::make_shared<KReadableEvent>(kernel, name_ + ":Readable"); |
| 22 | writable_event = std::make_shared<KWritableEvent>(kernel, GetName() + ":Writable"); | 26 | writable_event = std::make_shared<KWritableEvent>(kernel, name_ + ":Writable"); |
| 23 | 27 | ||
| 24 | // Initialize our sub sessions. | 28 | // Initialize our sub sessions. |
| 25 | readable_event->Initialize(this); | 29 | readable_event->Initialize(this); |
| 26 | writable_event->Initialize(this); | 30 | writable_event->Initialize(this); |
| 27 | 31 | ||
| 32 | // Set our owner process. | ||
| 33 | owner = kernel.CurrentProcess(); | ||
| 34 | if (owner) { | ||
| 35 | owner->Open(); | ||
| 36 | } | ||
| 37 | |||
| 28 | // Mark initialized. | 38 | // Mark initialized. |
| 39 | name = std::move(name_); | ||
| 29 | initialized = true; | 40 | initialized = true; |
| 30 | } | 41 | } |
| 31 | 42 | ||
| 43 | void KEvent::Finalize() { | ||
| 44 | KAutoObjectWithSlabHeapAndContainer<KEvent, KAutoObjectWithList>::Finalize(); | ||
| 45 | } | ||
| 46 | |||
| 47 | void KEvent::PostDestroy(uintptr_t arg) { | ||
| 48 | // Release the event count resource the owner process holds. | ||
| 49 | Process* owner = reinterpret_cast<Process*>(arg); | ||
| 50 | if (owner) { | ||
| 51 | owner->GetResourceLimit()->Release(LimitableResource::Events, 1); | ||
| 52 | owner->Close(); | ||
| 53 | } | ||
| 54 | } | ||
| 55 | |||
| 32 | } // namespace Kernel | 56 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/k_event.h b/src/core/hle/kernel/k_event.h index ec6894b16..97ec0ea9c 100644 --- a/src/core/hle/kernel/k_event.h +++ b/src/core/hle/kernel/k_event.h | |||
| @@ -4,24 +4,34 @@ | |||
| 4 | 4 | ||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include "core/hle/kernel/object.h" | 7 | #include "core/hle/kernel/slab_helpers.h" |
| 8 | 8 | ||
| 9 | namespace Kernel { | 9 | namespace Kernel { |
| 10 | 10 | ||
| 11 | class KernelCore; | 11 | class KernelCore; |
| 12 | class KReadableEvent; | 12 | class KReadableEvent; |
| 13 | class KWritableEvent; | 13 | class KWritableEvent; |
| 14 | class Process; | ||
| 15 | |||
| 16 | class KEvent final : public KAutoObjectWithSlabHeapAndContainer<KEvent, KAutoObjectWithList> { | ||
| 17 | KERNEL_AUTOOBJECT_TRAITS(KEvent, KAutoObject); | ||
| 14 | 18 | ||
| 15 | class KEvent final : public Object { | ||
| 16 | public: | 19 | public: |
| 17 | explicit KEvent(KernelCore& kernel, std::string&& name); | 20 | explicit KEvent(KernelCore& kernel); |
| 18 | ~KEvent() override; | 21 | ~KEvent() override; |
| 19 | 22 | ||
| 20 | static std::shared_ptr<KEvent> Create(KernelCore& kernel, std::string&& name); | 23 | void Initialize(std::string&& name); |
| 24 | |||
| 25 | virtual void Finalize() override; | ||
| 21 | 26 | ||
| 22 | void Initialize(); | 27 | virtual bool IsInitialized() const override { |
| 28 | return initialized; | ||
| 29 | } | ||
| 30 | virtual uintptr_t GetPostDestroyArgument() const override { | ||
| 31 | return reinterpret_cast<uintptr_t>(owner); | ||
| 32 | } | ||
| 23 | 33 | ||
| 24 | void Finalize() override {} | 34 | static void PostDestroy(uintptr_t arg); |
| 25 | 35 | ||
| 26 | std::string GetTypeName() const override { | 36 | std::string GetTypeName() const override { |
| 27 | return "KEvent"; | 37 | return "KEvent"; |
| @@ -51,6 +61,7 @@ public: | |||
| 51 | private: | 61 | private: |
| 52 | std::shared_ptr<KReadableEvent> readable_event; | 62 | std::shared_ptr<KReadableEvent> readable_event; |
| 53 | std::shared_ptr<KWritableEvent> writable_event; | 63 | std::shared_ptr<KWritableEvent> writable_event; |
| 64 | Process* owner{}; | ||
| 54 | bool initialized{}; | 65 | bool initialized{}; |
| 55 | }; | 66 | }; |
| 56 | 67 | ||
diff --git a/src/core/hle/kernel/object.h b/src/core/hle/kernel/object.h index 5c14aa46f..03443b947 100644 --- a/src/core/hle/kernel/object.h +++ b/src/core/hle/kernel/object.h | |||
| @@ -71,6 +71,8 @@ protected: | |||
| 71 | 71 | ||
| 72 | private: | 72 | private: |
| 73 | std::atomic<u32> object_id{0}; | 73 | std::atomic<u32> object_id{0}; |
| 74 | |||
| 75 | protected: | ||
| 74 | std::string name; | 76 | std::string name; |
| 75 | }; | 77 | }; |
| 76 | 78 | ||
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 17d63658a..b143a51c7 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -1953,14 +1953,11 @@ static ResultCode CreateEvent(Core::System& system, Handle* out_write, Handle* o | |||
| 1953 | HandleTable& handle_table = kernel.CurrentProcess()->GetHandleTable(); | 1953 | HandleTable& handle_table = kernel.CurrentProcess()->GetHandleTable(); |
| 1954 | 1954 | ||
| 1955 | // Create a new event. | 1955 | // Create a new event. |
| 1956 | const auto event = KEvent::Create(kernel, "CreateEvent"); | 1956 | KEvent* event = KEvent::CreateWithKernel(kernel); |
| 1957 | if (!event) { | 1957 | R_UNLESS(event != nullptr, ResultOutOfResource); |
| 1958 | LOG_ERROR(Kernel_SVC, "Unable to create new events. Event creation limit reached."); | ||
| 1959 | return ResultOutOfResource; | ||
| 1960 | } | ||
| 1961 | 1958 | ||
| 1962 | // Initialize the event. | 1959 | // Initialize the event. |
| 1963 | event->Initialize(); | 1960 | event->Initialize("CreateEvent"); |
| 1964 | 1961 | ||
| 1965 | // Add the writable event to the handle table. | 1962 | // Add the writable event to the handle table. |
| 1966 | const auto write_create_result = handle_table.Create(event->GetWritableEvent().get()); | 1963 | const auto write_create_result = handle_table.Create(event->GetWritableEvent().get()); |