From e5a59ef27c6a1fc66dfcbc63c84ad14dc73c54ae Mon Sep 17 00:00:00 2001 From: Yuri Kunde Schlesner Date: Mon, 5 Jun 2017 22:25:22 -0700 Subject: [PATCH] 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. --- src/core/hle/service/sm/srv.cpp | 17 +++++++++-------- 1 file 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 @@ #include "common/common_types.h" #include "common/logging/log.h" #include "core/hle/kernel/client_session.h" -#include "core/hle/kernel/event.h" +#include "core/hle/kernel/semaphore.h" #include "core/hle/kernel/server_session.h" #include "core/hle/service/sm/srv.h" namespace Service { namespace SM { -static Kernel::SharedPtr event_handle; +constexpr int MAX_PENDING_NOTIFICATIONS = 16; + +static Kernel::SharedPtr notification_semaphore; /** * SRV::RegisterClient service function @@ -51,14 +53,13 @@ static void RegisterClient(Interface* self) { static void EnableNotification(Interface* self) { u32* cmd_buff = Kernel::GetCommandBuffer(); - // TODO(bunnei): Change to a semaphore once these have been implemented - event_handle = Kernel::Event::Create(Kernel::ResetType::OneShot, "SRV:Event"); - event_handle->Clear(); + notification_semaphore = + Kernel::Semaphore::Create(0, MAX_PENDING_NOTIFICATIONS, "SRV:Notification").Unwrap(); cmd_buff[0] = IPC::MakeHeader(0x2, 0x1, 0x2); // 0x20042 cmd_buff[1] = RESULT_SUCCESS.raw; // No error cmd_buff[2] = IPC::CopyHandleDesc(1); - cmd_buff[3] = Kernel::g_handle_table.Create(event_handle).MoveFrom(); + cmd_buff[3] = Kernel::g_handle_table.Create(notification_semaphore).MoveFrom(); LOG_WARNING(Service_SRV, "(STUBBED) called"); } @@ -177,11 +178,11 @@ const Interface::FunctionInfo FunctionTable[] = { SRV::SRV() { Register(FunctionTable); - event_handle = nullptr; + notification_semaphore = nullptr; } SRV::~SRV() { - event_handle = nullptr; + notification_semaphore = nullptr; } } // namespace SM