summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2015-01-23 03:11:25 -0200
committerGravatar Yuri Kunde Schlesner2015-01-30 11:49:43 -0200
commitd52d85993683a6948285801ab54d51c79c98afba (patch)
tree98b4d084c26198ad4bb8a0d8fd84f1a411a32ff6 /src
parentKernel: Convert Timer to (mostly) not use Handles (diff)
downloadyuzu-d52d85993683a6948285801ab54d51c79c98afba.tar.gz
yuzu-d52d85993683a6948285801ab54d51c79c98afba.tar.xz
yuzu-d52d85993683a6948285801ab54d51c79c98afba.zip
Kernel: Convert Event to not use Handles
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/kernel/event.cpp83
-rw-r--r--src/core/hle/kernel/event.h51
-rw-r--r--src/core/hle/service/apt_u.cpp26
-rw-r--r--src/core/hle/service/dsp_dsp.cpp26
-rw-r--r--src/core/hle/service/gsp_gpu.cpp19
-rw-r--r--src/core/hle/service/hid/hid.cpp28
-rw-r--r--src/core/hle/service/hid/hid.h11
-rw-r--r--src/core/hle/service/hid/hid_user.cpp11
-rw-r--r--src/core/hle/service/srv.cpp8
-rw-r--r--src/core/hle/svc.cpp40
10 files changed, 151 insertions, 152 deletions
diff --git a/src/core/hle/kernel/event.cpp b/src/core/hle/kernel/event.cpp
index 74df47a05..d9ad40c6a 100644
--- a/src/core/hle/kernel/event.cpp
+++ b/src/core/hle/kernel/event.cpp
@@ -14,78 +14,37 @@
14 14
15namespace Kernel { 15namespace Kernel {
16 16
17class Event : public WaitObject { 17ResultVal<SharedPtr<Event>> Event::Create(ResetType reset_type, std::string name) {
18public: 18 SharedPtr<Event> evt(new Event);
19 std::string GetTypeName() const override { return "Event"; } 19 // TOOD(yuriks): Don't create Handle (see Thread::Create())
20 std::string GetName() const override { return name; } 20 CASCADE_RESULT(auto unused, Kernel::g_handle_table.Create(evt));
21
22 static const HandleType HANDLE_TYPE = HandleType::Event;
23 HandleType GetHandleType() const override { return HANDLE_TYPE; }
24
25 ResetType intitial_reset_type; ///< ResetType specified at Event initialization
26 ResetType reset_type; ///< Current ResetType
27
28 bool signaled; ///< Whether the event has already been signaled
29 std::string name; ///< Name of event (optional)
30
31 bool ShouldWait() override {
32 return !signaled;
33 }
34
35 void Acquire() override {
36 _assert_msg_(Kernel, !ShouldWait(), "object unavailable!");
37
38 // Release the event if it's not sticky...
39 if (reset_type != RESETTYPE_STICKY)
40 signaled = false;
41 }
42};
43
44ResultCode SignalEvent(const Handle handle) {
45 Event* evt = g_handle_table.Get<Event>(handle).get();
46 if (evt == nullptr)
47 return InvalidHandle(ErrorModule::Kernel);
48
49 evt->signaled = true;
50 evt->WakeupAllWaitingThreads();
51
52 return RESULT_SUCCESS;
53}
54
55ResultCode ClearEvent(Handle handle) {
56 Event* evt = g_handle_table.Get<Event>(handle).get();
57 if (evt == nullptr)
58 return InvalidHandle(ErrorModule::Kernel);
59 21
60 evt->signaled = false; 22 evt->signaled = false;
23 evt->reset_type = evt->intitial_reset_type = reset_type;
24 evt->name = std::move(name);
61 25
62 return RESULT_SUCCESS; 26 return MakeResult<SharedPtr<Event>>(evt);
63} 27}
64 28
65/** 29bool Event::ShouldWait() {
66 * Creates an event 30 return !signaled;
67 * @param handle Reference to handle for the newly created mutex 31}
68 * @param reset_type ResetType describing how to create event
69 * @param name Optional name of event
70 * @return Newly created Event object
71 */
72static Event* CreateEvent(Handle& handle, const ResetType reset_type, const std::string& name) {
73 Event* evt = new Event;
74 32
75 // TOOD(yuriks): Fix error reporting 33void Event::Acquire() {
76 handle = Kernel::g_handle_table.Create(evt).ValueOr(INVALID_HANDLE); 34 _assert_msg_(Kernel, !ShouldWait(), "object unavailable!");
77 35
78 evt->signaled = false; 36 // Release the event if it's not sticky...
79 evt->reset_type = evt->intitial_reset_type = reset_type; 37 if (reset_type != RESETTYPE_STICKY)
80 evt->name = name; 38 signaled = false;
39}
81 40
82 return evt; 41void Event::Signal() {
42 signaled = true;
43 WakeupAllWaitingThreads();
83} 44}
84 45
85Handle CreateEvent(const ResetType reset_type, const std::string& name) { 46void Event::Clear() {
86 Handle handle; 47 signaled = false;
87 Event* evt = CreateEvent(handle, reset_type, name);
88 return handle;
89} 48}
90 49
91} // namespace 50} // namespace
diff --git a/src/core/hle/kernel/event.h b/src/core/hle/kernel/event.h
index c08b12ee1..47420b157 100644
--- a/src/core/hle/kernel/event.h
+++ b/src/core/hle/kernel/event.h
@@ -11,26 +11,35 @@
11 11
12namespace Kernel { 12namespace Kernel {
13 13
14/** 14class Event : public WaitObject {
15 * Signals an event 15public:
16 * @param handle Handle to event to signal 16 /**
17 * @return Result of operation, 0 on success, otherwise error code 17 * Creates an event
18 */ 18 * @param reset_type ResetType describing how to create event
19ResultCode SignalEvent(const Handle handle); 19 * @param name Optional name of event
20 20 */
21/** 21 static ResultVal<SharedPtr<Event>> Create(ResetType reset_type, std::string name = "Unknown");
22 * Clears an event 22
23 * @param handle Handle to event to clear 23 std::string GetTypeName() const override { return "Event"; }
24 * @return Result of operation, 0 on success, otherwise error code 24 std::string GetName() const override { return name; }
25 */ 25
26ResultCode ClearEvent(Handle handle); 26 static const HandleType HANDLE_TYPE = HandleType::Event;
27 27 HandleType GetHandleType() const override { return HANDLE_TYPE; }
28/** 28
29 * Creates an event 29 ResetType intitial_reset_type; ///< ResetType specified at Event initialization
30 * @param reset_type ResetType describing how to create event 30 ResetType reset_type; ///< Current ResetType
31 * @param name Optional name of event 31
32 * @return Handle to newly created Event object 32 bool signaled; ///< Whether the event has already been signaled
33 */ 33 std::string name; ///< Name of event (optional)
34Handle CreateEvent(const ResetType reset_type, const std::string& name="Unknown"); 34
35 bool ShouldWait() override;
36 void Acquire() override;
37
38 void Signal();
39 void Clear();
40
41private:
42 Event() = default;
43};
35 44
36} // namespace 45} // namespace
diff --git a/src/core/hle/service/apt_u.cpp b/src/core/hle/service/apt_u.cpp
index 5d7a6e060..629b670ed 100644
--- a/src/core/hle/service/apt_u.cpp
+++ b/src/core/hle/service/apt_u.cpp
@@ -30,8 +30,8 @@ static const VAddr SHARED_FONT_VADDR = 0x18000000;
30static Kernel::SharedPtr<Kernel::SharedMemory> shared_font_mem; 30static Kernel::SharedPtr<Kernel::SharedMemory> shared_font_mem;
31 31
32static Kernel::SharedPtr<Kernel::Mutex> lock; 32static Kernel::SharedPtr<Kernel::Mutex> lock;
33static Handle notification_event_handle = 0; ///< APT notification event handle 33static Kernel::SharedPtr<Kernel::Event> notification_event; ///< APT notification event
34static Handle pause_event_handle = 0; ///< APT pause event handle 34static Kernel::SharedPtr<Kernel::Event> pause_event = 0; ///< APT pause event
35static std::vector<u8> shared_font; 35static std::vector<u8> shared_font;
36 36
37/// Signals used by APT functions 37/// Signals used by APT functions
@@ -68,14 +68,16 @@ enum class AppID : u32 {
68void Initialize(Service::Interface* self) { 68void Initialize(Service::Interface* self) {
69 u32* cmd_buff = Kernel::GetCommandBuffer(); 69 u32* cmd_buff = Kernel::GetCommandBuffer();
70 70
71 notification_event_handle = Kernel::CreateEvent(RESETTYPE_ONESHOT, "APT_U:Notification"); 71 // TODO(bunnei): Check if these are created in Initialize or on APT process startup.
72 pause_event_handle = Kernel::CreateEvent(RESETTYPE_ONESHOT, "APT_U:Pause"); 72 notification_event = Kernel::Event::Create(RESETTYPE_ONESHOT, "APT_U:Notification").MoveFrom();
73 pause_event = Kernel::Event::Create(RESETTYPE_ONESHOT, "APT_U:Pause").MoveFrom();
73 74
74 cmd_buff[3] = notification_event_handle; 75 cmd_buff[3] = Kernel::g_handle_table.Create(notification_event).MoveFrom();
75 cmd_buff[4] = pause_event_handle; 76 cmd_buff[4] = Kernel::g_handle_table.Create(pause_event).MoveFrom();
76 77
77 Kernel::ClearEvent(notification_event_handle); 78 // TODO(bunnei): Check if these events are cleared/signaled every time Initialize is called.
78 Kernel::SignalEvent(pause_event_handle); // Fire start event 79 notification_event->Clear();
80 pause_event->Signal(); // Fire start event
79 81
80 _assert_msg_(KERNEL, (nullptr != lock), "Cannot initialize without lock"); 82 _assert_msg_(KERNEL, (nullptr != lock), "Cannot initialize without lock");
81 lock->Release(); 83 lock->Release();
@@ -94,7 +96,7 @@ void NotifyToWait(Service::Interface* self) {
94 u32* cmd_buff = Kernel::GetCommandBuffer(); 96 u32* cmd_buff = Kernel::GetCommandBuffer();
95 u32 app_id = cmd_buff[1]; 97 u32 app_id = cmd_buff[1];
96 // TODO(Subv): Verify this, it seems to get SWKBD and Home Menu further. 98 // TODO(Subv): Verify this, it seems to get SWKBD and Home Menu further.
97 Kernel::SignalEvent(pause_event_handle); 99 pause_event->Signal();
98 100
99 cmd_buff[1] = RESULT_SUCCESS.raw; // No error 101 cmd_buff[1] = RESULT_SUCCESS.raw; // No error
100 LOG_WARNING(Service_APT, "(STUBBED) app_id=%u", app_id); 102 LOG_WARNING(Service_APT, "(STUBBED) app_id=%u", app_id);
@@ -104,10 +106,6 @@ void GetLockHandle(Service::Interface* self) {
104 u32* cmd_buff = Kernel::GetCommandBuffer(); 106 u32* cmd_buff = Kernel::GetCommandBuffer();
105 u32 flags = cmd_buff[1]; // TODO(bunnei): Figure out the purpose of the flag field 107 u32 flags = cmd_buff[1]; // TODO(bunnei): Figure out the purpose of the flag field
106 108
107 if (nullptr == lock) {
108 // TODO(bunnei): Verify if this is created here or at application boot?
109 lock = Kernel::Mutex::Create(false, "APT_U:Lock").MoveFrom();
110 }
111 cmd_buff[1] = RESULT_SUCCESS.raw; // No error 109 cmd_buff[1] = RESULT_SUCCESS.raw; // No error
112 110
113 // Not sure what these parameters are used for, but retail apps check that they are 0 after 111 // Not sure what these parameters are used for, but retail apps check that they are 0 after
@@ -520,7 +518,7 @@ Interface::Interface() {
520 shared_font_mem = nullptr; 518 shared_font_mem = nullptr;
521 } 519 }
522 520
523 lock = nullptr; 521 lock = Kernel::Mutex::Create(false, "APT_U:Lock").MoveFrom();
524 522
525 Register(FunctionTable, ARRAY_SIZE(FunctionTable)); 523 Register(FunctionTable, ARRAY_SIZE(FunctionTable));
526} 524}
diff --git a/src/core/hle/service/dsp_dsp.cpp b/src/core/hle/service/dsp_dsp.cpp
index d5e39ea4b..9a38be393 100644
--- a/src/core/hle/service/dsp_dsp.cpp
+++ b/src/core/hle/service/dsp_dsp.cpp
@@ -13,8 +13,8 @@
13namespace DSP_DSP { 13namespace DSP_DSP {
14 14
15static u32 read_pipe_count = 0; 15static u32 read_pipe_count = 0;
16static Handle semaphore_event = 0; 16static Kernel::SharedPtr<Kernel::Event> semaphore_event;
17static Handle interrupt_event = 0; 17static Kernel::SharedPtr<Kernel::Event> interrupt_event;
18 18
19void SignalInterrupt() { 19void SignalInterrupt() {
20 // TODO(bunnei): This is just a stub, it does not do anything other than signal to the emulated 20 // TODO(bunnei): This is just a stub, it does not do anything other than signal to the emulated
@@ -24,7 +24,7 @@ void SignalInterrupt() {
24 // DSP interrupts, and trigger them at the appropriate times. 24 // DSP interrupts, and trigger them at the appropriate times.
25 25
26 if (interrupt_event != 0) 26 if (interrupt_event != 0)
27 Kernel::SignalEvent(interrupt_event); 27 interrupt_event->Signal();
28} 28}
29 29
30/** 30/**
@@ -78,8 +78,8 @@ void LoadComponent(Service::Interface* self) {
78void GetSemaphoreEventHandle(Service::Interface* self) { 78void GetSemaphoreEventHandle(Service::Interface* self) {
79 u32* cmd_buff = Kernel::GetCommandBuffer(); 79 u32* cmd_buff = Kernel::GetCommandBuffer();
80 80
81 cmd_buff[1] = 0; // No error 81 cmd_buff[1] = RESULT_SUCCESS.raw; // No error
82 cmd_buff[3] = semaphore_event; // Event handle 82 cmd_buff[3] = Kernel::g_handle_table.Create(semaphore_event).MoveFrom(); // Event handle
83 83
84 LOG_WARNING(Service_DSP, "(STUBBED) called"); 84 LOG_WARNING(Service_DSP, "(STUBBED) called");
85} 85}
@@ -96,9 +96,16 @@ void GetSemaphoreEventHandle(Service::Interface* self) {
96void RegisterInterruptEvents(Service::Interface* self) { 96void RegisterInterruptEvents(Service::Interface* self) {
97 u32* cmd_buff = Kernel::GetCommandBuffer(); 97 u32* cmd_buff = Kernel::GetCommandBuffer();
98 98
99 interrupt_event = static_cast<Handle>(cmd_buff[4]); 99 auto evt = Kernel::g_handle_table.Get<Kernel::Event>(cmd_buff[4]);
100 if (evt != nullptr) {
101 interrupt_event = evt;
102 cmd_buff[1] = 0; // No error
103 } else {
104 LOG_ERROR(Service_DSP, "called with invalid handle=%08X", cmd_buff[4]);
100 105
101 cmd_buff[1] = 0; // No error 106 // TODO(yuriks): An error should be returned from SendSyncRequest, not in the cmdbuf
107 cmd_buff[1] = -1;
108 }
102 109
103 LOG_WARNING(Service_DSP, "(STUBBED) called"); 110 LOG_WARNING(Service_DSP, "(STUBBED) called");
104} 111}
@@ -194,8 +201,9 @@ const Interface::FunctionInfo FunctionTable[] = {
194// Interface class 201// Interface class
195 202
196Interface::Interface() { 203Interface::Interface() {
197 semaphore_event = Kernel::CreateEvent(RESETTYPE_ONESHOT, "DSP_DSP::semaphore_event"); 204 semaphore_event = Kernel::Event::Create(RESETTYPE_ONESHOT,
198 interrupt_event = 0; 205 "DSP_DSP::semaphore_event").MoveFrom();
206 interrupt_event = nullptr;
199 read_pipe_count = 0; 207 read_pipe_count = 0;
200 208
201 Register(FunctionTable, ARRAY_SIZE(FunctionTable)); 209 Register(FunctionTable, ARRAY_SIZE(FunctionTable));
diff --git a/src/core/hle/service/gsp_gpu.cpp b/src/core/hle/service/gsp_gpu.cpp
index 1be2438c8..5b91f17d2 100644
--- a/src/core/hle/service/gsp_gpu.cpp
+++ b/src/core/hle/service/gsp_gpu.cpp
@@ -22,9 +22,12 @@ GraphicsDebugger g_debugger;
22 22
23namespace GSP_GPU { 23namespace GSP_GPU {
24 24
25Handle g_interrupt_event = 0; ///< Handle to event triggered when GSP interrupt has been signalled 25/// Event triggered when GSP interrupt has been signalled
26Kernel::SharedPtr<Kernel::SharedMemory> g_shared_memory; ///< GSP shared memoryings 26Kernel::SharedPtr<Kernel::Event> g_interrupt_event;
27u32 g_thread_id = 1; ///< Thread index into interrupt relay queue, 1 is arbitrary 27/// GSP shared memoryings
28Kernel::SharedPtr<Kernel::SharedMemory> g_shared_memory;
29/// Thread index into interrupt relay queue, 1 is arbitrary
30u32 g_thread_id = 1;
28 31
29/// Gets a pointer to a thread command buffer in GSP shared memory 32/// Gets a pointer to a thread command buffer in GSP shared memory
30static inline u8* GetCommandBuffer(u32 thread_id) { 33static inline u8* GetCommandBuffer(u32 thread_id) {
@@ -181,10 +184,10 @@ static void FlushDataCache(Service::Interface* self) {
181static void RegisterInterruptRelayQueue(Service::Interface* self) { 184static void RegisterInterruptRelayQueue(Service::Interface* self) {
182 u32* cmd_buff = Kernel::GetCommandBuffer(); 185 u32* cmd_buff = Kernel::GetCommandBuffer();
183 u32 flags = cmd_buff[1]; 186 u32 flags = cmd_buff[1];
184 g_interrupt_event = cmd_buff[3];
185 g_shared_memory = Kernel::SharedMemory::Create("GSPSharedMem").MoveFrom();
186 187
187 _assert_msg_(GSP, (g_interrupt_event != 0), "handle is not valid!"); 188 g_interrupt_event = Kernel::g_handle_table.Get<Kernel::Event>(cmd_buff[3]);
189 _assert_msg_(GSP, (g_interrupt_event != nullptr), "handle is not valid!");
190 g_shared_memory = Kernel::SharedMemory::Create("GSPSharedMem").MoveFrom();
188 191
189 Handle shmem_handle = Kernel::g_handle_table.Create(g_shared_memory).MoveFrom(); 192 Handle shmem_handle = Kernel::g_handle_table.Create(g_shared_memory).MoveFrom();
190 193
@@ -192,7 +195,7 @@ static void RegisterInterruptRelayQueue(Service::Interface* self) {
192 cmd_buff[2] = g_thread_id++; // Thread ID 195 cmd_buff[2] = g_thread_id++; // Thread ID
193 cmd_buff[4] = shmem_handle; // GSP shared memory 196 cmd_buff[4] = shmem_handle; // GSP shared memory
194 197
195 Kernel::SignalEvent(g_interrupt_event); // TODO(bunnei): Is this correct? 198 g_interrupt_event->Signal(); // TODO(bunnei): Is this correct?
196} 199}
197 200
198/** 201/**
@@ -234,7 +237,7 @@ void SignalInterrupt(InterruptId interrupt_id) {
234 info->is_dirty = false; 237 info->is_dirty = false;
235 } 238 }
236 } 239 }
237 Kernel::SignalEvent(g_interrupt_event); 240 g_interrupt_event->Signal();
238} 241}
239 242
240/// Executes the next GSP command 243/// Executes the next GSP command
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index ee2ba7e01..835055af4 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -14,11 +14,11 @@ namespace HID {
14 14
15Kernel::SharedPtr<Kernel::SharedMemory> g_shared_mem = nullptr; 15Kernel::SharedPtr<Kernel::SharedMemory> g_shared_mem = nullptr;
16 16
17Handle g_event_pad_or_touch_1 = 0; 17Kernel::SharedPtr<Kernel::Event> g_event_pad_or_touch_1;
18Handle g_event_pad_or_touch_2 = 0; 18Kernel::SharedPtr<Kernel::Event> g_event_pad_or_touch_2;
19Handle g_event_accelerometer = 0; 19Kernel::SharedPtr<Kernel::Event> g_event_accelerometer;
20Handle g_event_gyroscope = 0; 20Kernel::SharedPtr<Kernel::Event> g_event_gyroscope;
21Handle g_event_debug_pad = 0; 21Kernel::SharedPtr<Kernel::Event> g_event_debug_pad;
22 22
23// Next Pad state update information 23// Next Pad state update information
24static PadState next_state = {{0}}; 24static PadState next_state = {{0}};
@@ -115,19 +115,21 @@ void PadUpdateComplete() {
115 } 115 }
116 116
117 // Signal both handles when there's an update to Pad or touch 117 // Signal both handles when there's an update to Pad or touch
118 Kernel::SignalEvent(g_event_pad_or_touch_1); 118 g_event_pad_or_touch_1->Signal();
119 Kernel::SignalEvent(g_event_pad_or_touch_2); 119 g_event_pad_or_touch_2->Signal();
120} 120}
121 121
122void HIDInit() { 122void HIDInit() {
123 g_shared_mem = Kernel::SharedMemory::Create("HID:SharedMem").MoveFrom(); 123 using namespace Kernel;
124
125 g_shared_mem = SharedMemory::Create("HID:SharedMem").MoveFrom();
124 126
125 // Create event handles 127 // Create event handles
126 g_event_pad_or_touch_1 = Kernel::CreateEvent(RESETTYPE_ONESHOT, "HID:EventPadOrTouch1"); 128 g_event_pad_or_touch_1 = Event::Create(RESETTYPE_ONESHOT, "HID:EventPadOrTouch1").MoveFrom();
127 g_event_pad_or_touch_2 = Kernel::CreateEvent(RESETTYPE_ONESHOT, "HID:EventPadOrTouch2"); 129 g_event_pad_or_touch_2 = Event::Create(RESETTYPE_ONESHOT, "HID:EventPadOrTouch2").MoveFrom();
128 g_event_accelerometer = Kernel::CreateEvent(RESETTYPE_ONESHOT, "HID:EventAccelerometer"); 130 g_event_accelerometer = Event::Create(RESETTYPE_ONESHOT, "HID:EventAccelerometer").MoveFrom();
129 g_event_gyroscope = Kernel::CreateEvent(RESETTYPE_ONESHOT, "HID:EventGyroscope"); 131 g_event_gyroscope = Event::Create(RESETTYPE_ONESHOT, "HID:EventGyroscope").MoveFrom();
130 g_event_debug_pad = Kernel::CreateEvent(RESETTYPE_ONESHOT, "HID:EventDebugPad"); 132 g_event_debug_pad = Event::Create(RESETTYPE_ONESHOT, "HID:EventDebugPad").MoveFrom();
131} 133}
132 134
133void HIDShutdown() { 135void HIDShutdown() {
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h
index 5e6236647..2116d2ca3 100644
--- a/src/core/hle/service/hid/hid.h
+++ b/src/core/hle/service/hid/hid.h
@@ -11,6 +11,7 @@
11 11
12namespace Kernel { 12namespace Kernel {
13 class SharedMemory; 13 class SharedMemory;
14 class Event;
14} 15}
15 16
16namespace Service { 17namespace Service {
@@ -20,11 +21,11 @@ namespace HID {
20extern Kernel::SharedPtr<Kernel::SharedMemory> g_shared_mem; 21extern Kernel::SharedPtr<Kernel::SharedMemory> g_shared_mem;
21 22
22// Event handles 23// Event handles
23extern Handle g_event_pad_or_touch_1; 24extern Kernel::SharedPtr<Kernel::Event> g_event_pad_or_touch_1;
24extern Handle g_event_pad_or_touch_2; 25extern Kernel::SharedPtr<Kernel::Event> g_event_pad_or_touch_2;
25extern Handle g_event_accelerometer; 26extern Kernel::SharedPtr<Kernel::Event> g_event_accelerometer;
26extern Handle g_event_gyroscope; 27extern Kernel::SharedPtr<Kernel::Event> g_event_gyroscope;
27extern Handle g_event_debug_pad; 28extern Kernel::SharedPtr<Kernel::Event> g_event_debug_pad;
28 29
29/** 30/**
30 * Structure of a Pad controller state. 31 * Structure of a Pad controller state.
diff --git a/src/core/hle/service/hid/hid_user.cpp b/src/core/hle/service/hid/hid_user.cpp
index c167927ea..5444aa5ee 100644
--- a/src/core/hle/service/hid/hid_user.cpp
+++ b/src/core/hle/service/hid/hid_user.cpp
@@ -5,6 +5,7 @@
5#include "common/log.h" 5#include "common/log.h"
6 6
7#include "core/hle/hle.h" 7#include "core/hle/hle.h"
8#include "core/hle/kernel/event.h"
8#include "core/hle/kernel/shared_memory.h" 9#include "core/hle/kernel/shared_memory.h"
9#include "core/hle/service/hid/hid.h" 10#include "core/hle/service/hid/hid.h"
10#include "hid_user.h" 11#include "hid_user.h"
@@ -49,11 +50,11 @@ void GetIPCHandles(Service::Interface* self) {
49 cmd_buff[1] = 0; // No error 50 cmd_buff[1] = 0; // No error
50 // TODO(yuriks): Return error from SendSyncRequest is this fails (part of IPC marshalling) 51 // TODO(yuriks): Return error from SendSyncRequest is this fails (part of IPC marshalling)
51 cmd_buff[3] = Kernel::g_handle_table.Create(Service::HID::g_shared_mem).MoveFrom(); 52 cmd_buff[3] = Kernel::g_handle_table.Create(Service::HID::g_shared_mem).MoveFrom();
52 cmd_buff[4] = Service::HID::g_event_pad_or_touch_1; 53 cmd_buff[4] = Kernel::g_handle_table.Create(Service::HID::g_event_pad_or_touch_1).MoveFrom();
53 cmd_buff[5] = Service::HID::g_event_pad_or_touch_2; 54 cmd_buff[5] = Kernel::g_handle_table.Create(Service::HID::g_event_pad_or_touch_2).MoveFrom();
54 cmd_buff[6] = Service::HID::g_event_accelerometer; 55 cmd_buff[6] = Kernel::g_handle_table.Create(Service::HID::g_event_accelerometer).MoveFrom();
55 cmd_buff[7] = Service::HID::g_event_gyroscope; 56 cmd_buff[7] = Kernel::g_handle_table.Create(Service::HID::g_event_gyroscope).MoveFrom();
56 cmd_buff[8] = Service::HID::g_event_debug_pad; 57 cmd_buff[8] = Kernel::g_handle_table.Create(Service::HID::g_event_debug_pad).MoveFrom();
57} 58}
58 59
59const Interface::FunctionInfo FunctionTable[] = { 60const Interface::FunctionInfo FunctionTable[] = {
diff --git a/src/core/hle/service/srv.cpp b/src/core/hle/service/srv.cpp
index 082834cfe..aa0aac3bb 100644
--- a/src/core/hle/service/srv.cpp
+++ b/src/core/hle/service/srv.cpp
@@ -11,7 +11,7 @@
11 11
12namespace SRV { 12namespace SRV {
13 13
14static Handle g_event_handle = 0; 14static Kernel::SharedPtr<Kernel::Event> event_handle;
15 15
16static void Initialize(Service::Interface* self) { 16static void Initialize(Service::Interface* self) {
17 u32* cmd_buff = Kernel::GetCommandBuffer(); 17 u32* cmd_buff = Kernel::GetCommandBuffer();
@@ -23,11 +23,11 @@ static void GetProcSemaphore(Service::Interface* self) {
23 u32* cmd_buff = Kernel::GetCommandBuffer(); 23 u32* cmd_buff = Kernel::GetCommandBuffer();
24 24
25 // TODO(bunnei): Change to a semaphore once these have been implemented 25 // TODO(bunnei): Change to a semaphore once these have been implemented
26 g_event_handle = Kernel::CreateEvent(RESETTYPE_ONESHOT, "SRV:Event"); 26 event_handle = Kernel::Event::Create(RESETTYPE_ONESHOT, "SRV:Event").MoveFrom();
27 Kernel::ClearEvent(g_event_handle); 27 event_handle->Clear();
28 28
29 cmd_buff[1] = 0; // No error 29 cmd_buff[1] = 0; // No error
30 cmd_buff[3] = g_event_handle; 30 cmd_buff[3] = Kernel::g_handle_table.Create(event_handle).MoveFrom();
31} 31}
32 32
33static void GetServiceHandle(Service::Interface* self) { 33static void GetServiceHandle(Service::Interface* self) {
diff --git a/src/core/hle/svc.cpp b/src/core/hle/svc.cpp
index 95403644b..0c50f0d5b 100644
--- a/src/core/hle/svc.cpp
+++ b/src/core/hle/svc.cpp
@@ -447,11 +447,17 @@ static Result QueryMemory(void* info, void* out, u32 addr) {
447} 447}
448 448
449/// Create an event 449/// Create an event
450static Result CreateEvent(Handle* evt, u32 reset_type) { 450static Result CreateEvent(Handle* handle, u32 reset_type) {
451 *evt = Kernel::CreateEvent((ResetType)reset_type); 451 auto evt_res = Kernel::Event::Create(static_cast<ResetType>(reset_type));
452 LOG_TRACE(Kernel_SVC, "called reset_type=0x%08X : created handle=0x%08X", 452 if (evt_res.Failed())
453 reset_type, *evt); 453 return evt_res.Code().raw;
454 return 0; 454 auto handle_res = Kernel::g_handle_table.Create(evt_res.MoveFrom());
455 if (handle_res.Failed())
456 return handle_res.Code().raw;
457 *handle = handle_res.MoveFrom();
458
459 LOG_TRACE(Kernel_SVC, "called reset_type=0x%08X : created handle=0x%08X", reset_type, *handle);
460 return RESULT_SUCCESS.raw;
455} 461}
456 462
457/// Duplicates a kernel handle 463/// Duplicates a kernel handle
@@ -465,16 +471,28 @@ static Result DuplicateHandle(Handle* out, Handle handle) {
465} 471}
466 472
467/// Signals an event 473/// Signals an event
468static Result SignalEvent(Handle evt) { 474static Result SignalEvent(Handle handle) {
469 LOG_TRACE(Kernel_SVC, "called event=0x%08X", evt); 475 LOG_TRACE(Kernel_SVC, "called event=0x%08X", handle);
476
477 auto evt = Kernel::g_handle_table.Get<Kernel::Event>(handle);
478 if (evt == nullptr)
479 return InvalidHandle(ErrorModule::Kernel).raw;
480
481 evt->Signal();
470 HLE::Reschedule(__func__); 482 HLE::Reschedule(__func__);
471 return Kernel::SignalEvent(evt).raw; 483 return RESULT_SUCCESS.raw;
472} 484}
473 485
474/// Clears an event 486/// Clears an event
475static Result ClearEvent(Handle evt) { 487static Result ClearEvent(Handle handle) {
476 LOG_TRACE(Kernel_SVC, "called event=0x%08X", evt); 488 LOG_TRACE(Kernel_SVC, "called event=0x%08X", handle);
477 return Kernel::ClearEvent(evt).raw; 489
490 auto evt = Kernel::g_handle_table.Get<Kernel::Event>(handle);
491 if (evt == nullptr)
492 return InvalidHandle(ErrorModule::Kernel).raw;
493
494 evt->Clear();
495 return RESULT_SUCCESS.raw;
478} 496}
479 497
480/// Creates a timer 498/// Creates a timer