summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel
diff options
context:
space:
mode:
authorGravatar Zach Hilman2018-11-27 09:18:29 -0500
committerGravatar Zach Hilman2018-11-29 08:48:40 -0500
commita342bcc9b130e9bd78720e09e04c92dcac8840d0 (patch)
treedf1d16c2a71b121fc449b53fc931c6fac8ccf82a /src/core/hle/kernel
parentcore: Port all current usages of Event to Readable/WritableEvent (diff)
downloadyuzu-a342bcc9b130e9bd78720e09e04c92dcac8840d0.tar.gz
yuzu-a342bcc9b130e9bd78720e09e04c92dcac8840d0.tar.xz
yuzu-a342bcc9b130e9bd78720e09e04c92dcac8840d0.zip
kernel/event: Reference ReadableEvent from WritableEvent
Diffstat (limited to 'src/core/hle/kernel')
-rw-r--r--src/core/hle/kernel/hle_ipc.cpp6
-rw-r--r--src/core/hle/kernel/kernel.cpp17
-rw-r--r--src/core/hle/kernel/kernel.h11
-rw-r--r--src/core/hle/kernel/readable_event.cpp24
-rw-r--r--src/core/hle/kernel/readable_event.h17
-rw-r--r--src/core/hle/kernel/svc.cpp4
-rw-r--r--src/core/hle/kernel/writable_event.cpp57
-rw-r--r--src/core/hle/kernel/writable_event.h36
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
230void KernelCore::AddNamedEvent(std::string name, SharedPtr<ReadableEvent> event) {
231 impl->named_events.emplace(std::move(name), std::move(event));
232}
233
234KernelCore::NamedEventTable::iterator KernelCore::FindNamedEvent(const std::string& name) {
235 return impl->named_events.find(name);
236}
237
238KernelCore::NamedEventTable::const_iterator KernelCore::FindNamedEvent(
239 const std::string& name) const {
240 return impl->named_events.find(name);
241}
242
243void KernelCore::AddNamedPort(std::string name, SharedPtr<ClientPort> port) { 226void 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 {
20class ClientPort; 20class ClientPort;
21class HandleTable; 21class HandleTable;
22class Process; 22class Process;
23class ReadableEvent;
24class ResourceLimit; 23class ResourceLimit;
25class Thread; 24class Thread;
26class Timer; 25class Timer;
@@ -28,7 +27,6 @@ class Timer;
28/// Represents a single instance of the kernel. 27/// Represents a single instance of the kernel.
29class KernelCore { 28class KernelCore {
30private: 29private:
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
34public: 32public:
@@ -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} {}
15ReadableEvent::~ReadableEvent() = default; 15ReadableEvent::~ReadableEvent() = default;
16 16
17bool ReadableEvent::ShouldWait(Thread* thread) const { 17bool ReadableEvent::ShouldWait(Thread* thread) const {
18 return !writable_event->IsSignaled(); 18 return !signaled;
19} 19}
20 20
21void ReadableEvent::Acquire(Thread* thread) { 21void 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
27void ReadableEvent::AddWaitingThread(SharedPtr<Thread> thread) {
28 writable_event->AddWaitingThread(thread);
29}
30
31void ReadableEvent::RemoveWaitingThread(Thread* thread) {
32 writable_event->RemoveWaitingThread(thread);
33} 26}
34 27
35void ReadableEvent::Signal() { 28void ReadableEvent::Signal() {
36 writable_event->Signal(); 29 signaled = true;
30 WakeupAllWaitingThreads();
37} 31}
38 32
39void ReadableEvent::Clear() { 33void ReadableEvent::Clear() {
40 writable_event->Clear(); 34 signaled = false;
41} 35}
42 36
43void ReadableEvent::WakeupAllWaitingThreads() { 37void 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
48private: 44private:
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
13namespace Kernel { 13namespace Kernel {
14 14
15WritableEvent::WritableEvent(KernelCore& kernel) : WaitObject{kernel} {} 15WritableEvent::WritableEvent(KernelCore& kernel) : Object{kernel} {}
16WritableEvent::~WritableEvent() = default; 16WritableEvent::~WritableEvent() = default;
17 17
18std::tuple<SharedPtr<WritableEvent>, SharedPtr<ReadableEvent>> WritableEvent::CreateEventPair( 18EventPair 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
32SharedPtr<WritableEvent> WritableEvent::CreateRegisteredEventPair(KernelCore& kernel, 32ResetType 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
40bool WritableEvent::ShouldWait(Thread* thread) const {
41 return !signaled;
42}
43
44void 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
51void WritableEvent::Signal() { 36void WritableEvent::Signal() {
52 signaled = true; 37 readable->Signal();
53 WakeupAllWaitingThreads();
54} 38}
55 39
56void WritableEvent::Clear() { 40void WritableEvent::Clear() {
57 signaled = false; 41 readable->Clear();
58}
59
60void WritableEvent::ResetOnAcquire() {
61 if (reset_type == ResetType::OneShot)
62 Clear();
63}
64
65void WritableEvent::ResetOnWakeup() {
66 if (reset_type == ResetType::Pulse)
67 Clear();
68} 42}
69 43
70bool WritableEvent::IsSignaled() const { 44bool WritableEvent::IsSignaled() const {
71 return signaled; 45 return readable->signaled;
72}
73
74void 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
13class KernelCore; 13class KernelCore;
14class ReadableEvent; 14class ReadableEvent;
15class WritableEvent;
15 16
16class WritableEvent final : public WaitObject { 17struct EventPair {
18 SharedPtr<ReadableEvent> readable;
19 SharedPtr<WritableEvent> writable;
20};
21
22class WritableEvent final : public Object {
17public: 23public:
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
66private: 53private:
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