summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/CMakeLists.txt6
-rw-r--r--src/core/hle/kernel/event.cpp53
-rw-r--r--src/core/hle/kernel/readable_event.cpp48
-rw-r--r--src/core/hle/kernel/readable_event.h56
-rw-r--r--src/core/hle/kernel/writable_event.cpp81
-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
11namespace Kernel {
12
13Event::Event(KernelCore& kernel) : WaitObject{kernel} {}
14Event::~Event() = default;
15
16SharedPtr<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
26bool Event::ShouldWait(Thread* thread) const {
27 return !signaled;
28}
29
30void Event::Acquire(Thread* thread) {
31 ASSERT_MSG(!ShouldWait(thread), "object unavailable!");
32
33 if (reset_type == ResetType::OneShot)
34 signaled = false;
35}
36
37void Event::Signal() {
38 signaled = true;
39 WakeupAllWaitingThreads();
40}
41
42void Event::Clear() {
43 signaled = false;
44}
45
46void 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
12namespace Kernel {
13
14ReadableEvent::ReadableEvent(KernelCore& kernel) : WaitObject{kernel} {}
15ReadableEvent::~ReadableEvent() = default;
16
17bool ReadableEvent::ShouldWait(Thread* thread) const {
18 return !writable_event->IsSignaled();
19}
20
21void ReadableEvent::Acquire(Thread* thread) {
22 ASSERT_MSG(!ShouldWait(thread), "object unavailable!");
23
24 writable_event->ResetOnAcquire();
25}
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}
34
35void ReadableEvent::Signal() {
36 writable_event->Signal();
37}
38
39void ReadableEvent::Clear() {
40 writable_event->Clear();
41}
42
43void 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
10namespace Kernel {
11
12class KernelCore;
13class WritableEvent;
14
15class ReadableEvent final : public WaitObject {
16 friend class WritableEvent;
17
18public:
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
48private:
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
13namespace Kernel {
14
15WritableEvent::WritableEvent(KernelCore& kernel) : WaitObject{kernel} {}
16WritableEvent::~WritableEvent() = default;
17
18std::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
32SharedPtr<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
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}
50
51void WritableEvent::Signal() {
52 signaled = true;
53 WakeupAllWaitingThreads();
54}
55
56void WritableEvent::Clear() {
57 signaled = false;
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}
69
70bool WritableEvent::IsSignaled() const {
71 return signaled;
72}
73
74void 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 @@
11namespace Kernel { 11namespace Kernel {
12 12
13class KernelCore; 13class KernelCore;
14class ReadableEvent;
14 15
15class Event final : public WaitObject { 16class WritableEvent final : public WaitObject {
16public: 17public:
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
50private: 66private:
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