summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2017-06-05 22:25:22 -0700
committerGravatar Yuri Kunde Schlesner2017-06-06 02:57:04 -0700
commite5a59ef27c6a1fc66dfcbc63c84ad14dc73c54ae (patch)
tree82feb44406f4767d3c0bd401b016dc446ae06097 /src/core
parentService: Move SRV interface to a new sm/ subdirectory (diff)
downloadyuzu-e5a59ef27c6a1fc66dfcbc63c84ad14dc73c54ae.tar.gz
yuzu-e5a59ef27c6a1fc66dfcbc63c84ad14dc73c54ae.tar.xz
yuzu-e5a59ef27c6a1fc66dfcbc63c84ad14dc73c54ae.zip
Service/sm: Use an actual semaphore for the notification semaphore
An Event was used way back then when we didn't have proper working semaphores. Our Semaphore implementation is good enough now.
Diffstat (limited to 'src/core')
-rw-r--r--src/core/hle/service/sm/srv.cpp17
1 files changed, 9 insertions, 8 deletions
diff --git a/src/core/hle/service/sm/srv.cpp b/src/core/hle/service/sm/srv.cpp
index 9d7a83597..d6946c734 100644
--- a/src/core/hle/service/sm/srv.cpp
+++ b/src/core/hle/service/sm/srv.cpp
@@ -7,14 +7,16 @@
7#include "common/common_types.h" 7#include "common/common_types.h"
8#include "common/logging/log.h" 8#include "common/logging/log.h"
9#include "core/hle/kernel/client_session.h" 9#include "core/hle/kernel/client_session.h"
10#include "core/hle/kernel/event.h" 10#include "core/hle/kernel/semaphore.h"
11#include "core/hle/kernel/server_session.h" 11#include "core/hle/kernel/server_session.h"
12#include "core/hle/service/sm/srv.h" 12#include "core/hle/service/sm/srv.h"
13 13
14namespace Service { 14namespace Service {
15namespace SM { 15namespace SM {
16 16
17static Kernel::SharedPtr<Kernel::Event> event_handle; 17constexpr int MAX_PENDING_NOTIFICATIONS = 16;
18
19static Kernel::SharedPtr<Kernel::Semaphore> notification_semaphore;
18 20
19/** 21/**
20 * SRV::RegisterClient service function 22 * SRV::RegisterClient service function
@@ -51,14 +53,13 @@ static void RegisterClient(Interface* self) {
51static void EnableNotification(Interface* self) { 53static void EnableNotification(Interface* self) {
52 u32* cmd_buff = Kernel::GetCommandBuffer(); 54 u32* cmd_buff = Kernel::GetCommandBuffer();
53 55
54 // TODO(bunnei): Change to a semaphore once these have been implemented 56 notification_semaphore =
55 event_handle = Kernel::Event::Create(Kernel::ResetType::OneShot, "SRV:Event"); 57 Kernel::Semaphore::Create(0, MAX_PENDING_NOTIFICATIONS, "SRV:Notification").Unwrap();
56 event_handle->Clear();
57 58
58 cmd_buff[0] = IPC::MakeHeader(0x2, 0x1, 0x2); // 0x20042 59 cmd_buff[0] = IPC::MakeHeader(0x2, 0x1, 0x2); // 0x20042
59 cmd_buff[1] = RESULT_SUCCESS.raw; // No error 60 cmd_buff[1] = RESULT_SUCCESS.raw; // No error
60 cmd_buff[2] = IPC::CopyHandleDesc(1); 61 cmd_buff[2] = IPC::CopyHandleDesc(1);
61 cmd_buff[3] = Kernel::g_handle_table.Create(event_handle).MoveFrom(); 62 cmd_buff[3] = Kernel::g_handle_table.Create(notification_semaphore).MoveFrom();
62 LOG_WARNING(Service_SRV, "(STUBBED) called"); 63 LOG_WARNING(Service_SRV, "(STUBBED) called");
63} 64}
64 65
@@ -177,11 +178,11 @@ const Interface::FunctionInfo FunctionTable[] = {
177 178
178SRV::SRV() { 179SRV::SRV() {
179 Register(FunctionTable); 180 Register(FunctionTable);
180 event_handle = nullptr; 181 notification_semaphore = nullptr;
181} 182}
182 183
183SRV::~SRV() { 184SRV::~SRV() {
184 event_handle = nullptr; 185 notification_semaphore = nullptr;
185} 186}
186 187
187} // namespace SM 188} // namespace SM