summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel')
-rw-r--r--src/core/hle/kernel/handle_table.cpp1
-rw-r--r--src/core/hle/kernel/init/init_slab_setup.cpp2
-rw-r--r--src/core/hle/kernel/k_event.cpp38
-rw-r--r--src/core/hle/kernel/k_event.h23
-rw-r--r--src/core/hle/kernel/object.h2
-rw-r--r--src/core/hle/kernel/svc.cpp9
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
30namespace { 32namespace {
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
9namespace Kernel { 11namespace Kernel {
10 12
11KEvent::KEvent(KernelCore& kernel, std::string&& name) : Object{kernel, std::move(name)} {} 13KEvent::KEvent(KernelCore& kernel) : KAutoObjectWithSlabHeapAndContainer{kernel} {}
12 14
13KEvent::~KEvent() = default; 15KEvent::~KEvent() = default;
14 16
15std::shared_ptr<KEvent> KEvent::Create(KernelCore& kernel, std::string&& name) { 17void 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
19void 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
43void KEvent::Finalize() {
44 KAutoObjectWithSlabHeapAndContainer<KEvent, KAutoObjectWithList>::Finalize();
45}
46
47void 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
9namespace Kernel { 9namespace Kernel {
10 10
11class KernelCore; 11class KernelCore;
12class KReadableEvent; 12class KReadableEvent;
13class KWritableEvent; 13class KWritableEvent;
14class Process;
15
16class KEvent final : public KAutoObjectWithSlabHeapAndContainer<KEvent, KAutoObjectWithList> {
17 KERNEL_AUTOOBJECT_TRAITS(KEvent, KAutoObject);
14 18
15class KEvent final : public Object {
16public: 19public:
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:
51private: 61private:
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
72private: 72private:
73 std::atomic<u32> object_id{0}; 73 std::atomic<u32> object_id{0};
74
75protected:
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());