diff --git a/src/core/hle/service/friend/friend.cpp b/src/core/hle/service/friend/friend.cpp index d1ec12ef92..42b4ee861d 100644 --- a/src/core/hle/service/friend/friend.cpp +++ b/src/core/hle/service/friend/friend.cpp @@ -149,7 +149,8 @@ private: class INotificationService final : public ServiceFramework { public: - INotificationService(Common::UUID uuid) : ServiceFramework("INotificationService"), uuid(uuid) { + INotificationService(Common::UUID uuid, Core::System& system) + : ServiceFramework("INotificationService"), uuid(uuid) { // clang-format off static const FunctionInfo functions[] = { {0, &INotificationService::GetEvent, "GetEvent"}, @@ -159,6 +160,9 @@ public: // clang-format on RegisterHandlers(functions); + + notification_event = Kernel::WritableEvent::CreateEventPair( + system.Kernel(), Kernel::ResetType::Manual, "INotificationService:NotifyEvent"); } private: @@ -167,13 +171,6 @@ private: IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(RESULT_SUCCESS); - - if (!is_event_created) { - auto& kernel = Core::System::GetInstance().Kernel(); - notification_event = Kernel::WritableEvent::CreateEventPair( - kernel, Kernel::ResetType::Manual, "INotificationService:NotifyEvent"); - is_event_created = true; - } rb.PushCopyObjects(notification_event.readable); } @@ -261,21 +258,21 @@ void Module::Interface::CreateNotificationService(Kernel::HLERequestContext& ctx IPC::ResponseBuilder rb{ctx, 2, 0, 1}; rb.Push(RESULT_SUCCESS); - rb.PushIpcInterface(uuid); + rb.PushIpcInterface(uuid, system); } -Module::Interface::Interface(std::shared_ptr module, const char* name) - : ServiceFramework(name), module(std::move(module)) {} +Module::Interface::Interface(std::shared_ptr module, Core::System& system, const char* name) + : ServiceFramework(name), module(std::move(module)), system(system) {} Module::Interface::~Interface() = default; -void InstallInterfaces(SM::ServiceManager& service_manager) { +void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) { auto module = std::make_shared(); - std::make_shared(module, "friend:a")->InstallAsService(service_manager); - std::make_shared(module, "friend:m")->InstallAsService(service_manager); - std::make_shared(module, "friend:s")->InstallAsService(service_manager); - std::make_shared(module, "friend:u")->InstallAsService(service_manager); - std::make_shared(module, "friend:v")->InstallAsService(service_manager); + std::make_shared(module, system, "friend:a")->InstallAsService(service_manager); + std::make_shared(module, system, "friend:m")->InstallAsService(service_manager); + std::make_shared(module, system, "friend:s")->InstallAsService(service_manager); + std::make_shared(module, system, "friend:u")->InstallAsService(service_manager); + std::make_shared(module, system, "friend:v")->InstallAsService(service_manager); } } // namespace Service::Friend diff --git a/src/core/hle/service/friend/friend.h b/src/core/hle/service/friend/friend.h index 38d05fa8e1..24f3fc9697 100644 --- a/src/core/hle/service/friend/friend.h +++ b/src/core/hle/service/friend/friend.h @@ -6,13 +6,17 @@ #include "core/hle/service/service.h" +namespace Core { +class System; +} + namespace Service::Friend { class Module final { public: class Interface : public ServiceFramework { public: - explicit Interface(std::shared_ptr module, const char* name); + explicit Interface(std::shared_ptr module, Core::System& system, const char* name); ~Interface() override; void CreateFriendService(Kernel::HLERequestContext& ctx); @@ -20,10 +24,11 @@ public: protected: std::shared_ptr module; + Core::System& system; }; }; /// Registers all Friend services with the specified service manager. -void InstallInterfaces(SM::ServiceManager& service_manager); +void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system); } // namespace Service::Friend diff --git a/src/core/hle/service/friend/interface.cpp b/src/core/hle/service/friend/interface.cpp index 5b384f7333..58155f6528 100644 --- a/src/core/hle/service/friend/interface.cpp +++ b/src/core/hle/service/friend/interface.cpp @@ -6,8 +6,8 @@ namespace Service::Friend { -Friend::Friend(std::shared_ptr module, const char* name) - : Interface(std::move(module), name) { +Friend::Friend(std::shared_ptr module, Core::System& system, const char* name) + : Interface(std::move(module), system, name) { static const FunctionInfo functions[] = { {0, &Friend::CreateFriendService, "CreateFriendService"}, {1, &Friend::CreateNotificationService, "CreateNotificationService"}, diff --git a/src/core/hle/service/friend/interface.h b/src/core/hle/service/friend/interface.h index 1963def39f..465a357708 100644 --- a/src/core/hle/service/friend/interface.h +++ b/src/core/hle/service/friend/interface.h @@ -10,7 +10,7 @@ namespace Service::Friend { class Friend final : public Module::Interface { public: - explicit Friend(std::shared_ptr module, const char* name); + explicit Friend(std::shared_ptr module, Core::System& system, const char* name); ~Friend() override; };