diff options
Diffstat (limited to '')
35 files changed, 378 insertions, 897 deletions
diff --git a/src/core/hle/service/acc/async_context.cpp b/src/core/hle/service/acc/async_context.cpp index 459323132..a49dfdec7 100644 --- a/src/core/hle/service/acc/async_context.cpp +++ b/src/core/hle/service/acc/async_context.cpp @@ -4,15 +4,12 @@ #include "core/core.h" #include "core/hle/ipc_helpers.h" +#include "core/hle/kernel/k_event.h" #include "core/hle/service/acc/async_context.h" namespace Service::Account { IAsyncContext::IAsyncContext(Core::System& system_) - : ServiceFramework{system_, "IAsyncContext"}, compeletion_event{system_.Kernel()} { - - Kernel::KAutoObject::Create(std::addressof(compeletion_event)); - compeletion_event.Initialize("IAsyncContext:CompletionEvent"); - + : ServiceFramework{system_, "IAsyncContext"}, service_context{system_, "IAsyncContext"} { // clang-format off static const FunctionInfo functions[] = { {0, &IAsyncContext::GetSystemEvent, "GetSystemEvent"}, @@ -23,6 +20,12 @@ IAsyncContext::IAsyncContext(Core::System& system_) // clang-format on RegisterHandlers(functions); + + completion_event = service_context.CreateEvent("IAsyncContext:CompletionEvent"); +} + +IAsyncContext::~IAsyncContext() { + service_context.CloseEvent(completion_event); } void IAsyncContext::GetSystemEvent(Kernel::HLERequestContext& ctx) { @@ -30,7 +33,7 @@ void IAsyncContext::GetSystemEvent(Kernel::HLERequestContext& ctx) { IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(compeletion_event.GetReadableEvent()); + rb.PushCopyObjects(completion_event->GetReadableEvent()); } void IAsyncContext::Cancel(Kernel::HLERequestContext& ctx) { @@ -62,7 +65,7 @@ void IAsyncContext::GetResult(Kernel::HLERequestContext& ctx) { void IAsyncContext::MarkComplete() { is_complete.store(true); - compeletion_event.GetWritableEvent().Signal(); + completion_event->GetWritableEvent().Signal(); } } // namespace Service::Account diff --git a/src/core/hle/service/acc/async_context.h b/src/core/hle/service/acc/async_context.h index c694b4946..cc3a0a9fe 100644 --- a/src/core/hle/service/acc/async_context.h +++ b/src/core/hle/service/acc/async_context.h @@ -5,7 +5,7 @@ #pragma once #include <atomic> -#include "core/hle/kernel/k_event.h" +#include "core/hle/service/kernel_helpers.h" #include "core/hle/service/service.h" namespace Core { @@ -17,6 +17,7 @@ namespace Service::Account { class IAsyncContext : public ServiceFramework<IAsyncContext> { public: explicit IAsyncContext(Core::System& system_); + ~IAsyncContext() override; void GetSystemEvent(Kernel::HLERequestContext& ctx); void Cancel(Kernel::HLERequestContext& ctx); @@ -30,8 +31,10 @@ protected: void MarkComplete(); + KernelHelpers::ServiceContext service_context; + std::atomic<bool> is_complete{false}; - Kernel::KEvent compeletion_event; + Kernel::KEvent* completion_event; }; } // namespace Service::Account diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index 8c2e2f920..eccdcc20d 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp @@ -16,9 +16,7 @@ #include "core/hle/ipc_helpers.h" #include "core/hle/kernel/k_event.h" #include "core/hle/kernel/k_process.h" -#include "core/hle/kernel/k_readable_event.h" #include "core/hle/kernel/k_transfer_memory.h" -#include "core/hle/kernel/k_writable_event.h" #include "core/hle/kernel/kernel.h" #include "core/hle/service/acc/profile_manager.h" #include "core/hle/service/am/am.h" @@ -254,8 +252,9 @@ IDebugFunctions::IDebugFunctions(Core::System& system_) IDebugFunctions::~IDebugFunctions() = default; ISelfController::ISelfController(Core::System& system_, NVFlinger::NVFlinger& nvflinger_) - : ServiceFramework{system_, "ISelfController"}, nvflinger{nvflinger_}, - launchable_event{system.Kernel()}, accumulated_suspended_tick_changed_event{system.Kernel()} { + : ServiceFramework{system_, "ISelfController"}, nvflinger{nvflinger_}, service_context{ + system, + "ISelfController"} { // clang-format off static const FunctionInfo functions[] = { {0, &ISelfController::Exit, "Exit"}, @@ -311,9 +310,7 @@ ISelfController::ISelfController(Core::System& system_, NVFlinger::NVFlinger& nv RegisterHandlers(functions); - Kernel::KAutoObject::Create(std::addressof(launchable_event)); - - launchable_event.Initialize("ISelfController:LaunchableEvent"); + launchable_event = service_context.CreateEvent("ISelfController:LaunchableEvent"); // This event is created by AM on the first time GetAccumulatedSuspendedTickChangedEvent() is // called. Yuzu can just create it unconditionally, since it doesn't need to support multiple @@ -321,21 +318,23 @@ ISelfController::ISelfController(Core::System& system_, NVFlinger::NVFlinger& nv // suspended if the event has previously been created by a call to // GetAccumulatedSuspendedTickChangedEvent. - Kernel::KAutoObject::Create(std::addressof(accumulated_suspended_tick_changed_event)); - accumulated_suspended_tick_changed_event.Initialize( - "ISelfController:AccumulatedSuspendedTickChangedEvent"); - accumulated_suspended_tick_changed_event.GetWritableEvent().Signal(); + accumulated_suspended_tick_changed_event = + service_context.CreateEvent("ISelfController:AccumulatedSuspendedTickChangedEvent"); + accumulated_suspended_tick_changed_event->GetWritableEvent().Signal(); } -ISelfController::~ISelfController() = default; +ISelfController::~ISelfController() { + service_context.CloseEvent(launchable_event); + service_context.CloseEvent(accumulated_suspended_tick_changed_event); +} void ISelfController::Exit(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_AM, "called"); - system.Shutdown(); - IPC::ResponseBuilder rb{ctx, 2}; rb.Push(ResultSuccess); + + system.Exit(); } void ISelfController::LockExit(Kernel::HLERequestContext& ctx) { @@ -383,11 +382,11 @@ void ISelfController::LeaveFatalSection(Kernel::HLERequestContext& ctx) { void ISelfController::GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext& ctx) { LOG_WARNING(Service_AM, "(STUBBED) called"); - launchable_event.GetWritableEvent().Signal(); + launchable_event->GetWritableEvent().Signal(); IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(launchable_event.GetReadableEvent()); + rb.PushCopyObjects(launchable_event->GetReadableEvent()); } void ISelfController::SetScreenShotPermission(Kernel::HLERequestContext& ctx) { @@ -566,7 +565,7 @@ void ISelfController::GetAccumulatedSuspendedTickChangedEvent(Kernel::HLERequest IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(accumulated_suspended_tick_changed_event.GetReadableEvent()); + rb.PushCopyObjects(accumulated_suspended_tick_changed_event->GetReadableEvent()); } void ISelfController::SetAlbumImageTakenNotificationEnabled(Kernel::HLERequestContext& ctx) { @@ -584,40 +583,39 @@ void ISelfController::SetAlbumImageTakenNotificationEnabled(Kernel::HLERequestCo rb.Push(ResultSuccess); } -AppletMessageQueue::AppletMessageQueue(Kernel::KernelCore& kernel) - : on_new_message{kernel}, on_operation_mode_changed{kernel} { - - Kernel::KAutoObject::Create(std::addressof(on_new_message)); - Kernel::KAutoObject::Create(std::addressof(on_operation_mode_changed)); - - on_new_message.Initialize("AMMessageQueue:OnMessageReceived"); - on_operation_mode_changed.Initialize("AMMessageQueue:OperationModeChanged"); +AppletMessageQueue::AppletMessageQueue(Core::System& system) + : service_context{system, "AppletMessageQueue"} { + on_new_message = service_context.CreateEvent("AMMessageQueue:OnMessageReceived"); + on_operation_mode_changed = service_context.CreateEvent("AMMessageQueue:OperationModeChanged"); } -AppletMessageQueue::~AppletMessageQueue() = default; +AppletMessageQueue::~AppletMessageQueue() { + service_context.CloseEvent(on_new_message); + service_context.CloseEvent(on_operation_mode_changed); +} Kernel::KReadableEvent& AppletMessageQueue::GetMessageReceiveEvent() { - return on_new_message.GetReadableEvent(); + return on_new_message->GetReadableEvent(); } Kernel::KReadableEvent& AppletMessageQueue::GetOperationModeChangedEvent() { - return on_operation_mode_changed.GetReadableEvent(); + return on_operation_mode_changed->GetReadableEvent(); } void AppletMessageQueue::PushMessage(AppletMessage msg) { messages.push(msg); - on_new_message.GetWritableEvent().Signal(); + on_new_message->GetWritableEvent().Signal(); } AppletMessageQueue::AppletMessage AppletMessageQueue::PopMessage() { if (messages.empty()) { - on_new_message.GetWritableEvent().Clear(); + on_new_message->GetWritableEvent().Clear(); return AppletMessage::NoMessage; } auto msg = messages.front(); messages.pop(); if (messages.empty()) { - on_new_message.GetWritableEvent().Clear(); + on_new_message->GetWritableEvent().Clear(); } return msg; } @@ -637,7 +635,7 @@ void AppletMessageQueue::FocusStateChanged() { void AppletMessageQueue::OperationModeChanged() { PushMessage(AppletMessage::OperationModeChanged); PushMessage(AppletMessage::PerformanceModeChanged); - on_operation_mode_changed.GetWritableEvent().Signal(); + on_operation_mode_changed->GetWritableEvent().Signal(); } ICommonStateGetter::ICommonStateGetter(Core::System& system_, @@ -1272,10 +1270,8 @@ void ILibraryAppletCreator::CreateHandleStorage(Kernel::HLERequestContext& ctx) } IApplicationFunctions::IApplicationFunctions(Core::System& system_) - : ServiceFramework{system_, "IApplicationFunctions"}, gpu_error_detected_event{system.Kernel()}, - friend_invitation_storage_channel_event{system.Kernel()}, - notification_storage_channel_event{system.Kernel()}, health_warning_disappeared_system_event{ - system.Kernel()} { + : ServiceFramework{system_, "IApplicationFunctions"}, service_context{system, + "IApplicationFunctions"} { // clang-format off static const FunctionInfo functions[] = { {1, &IApplicationFunctions::PopLaunchParameter, "PopLaunchParameter"}, @@ -1343,21 +1339,22 @@ IApplicationFunctions::IApplicationFunctions(Core::System& system_) RegisterHandlers(functions); - Kernel::KAutoObject::Create(std::addressof(gpu_error_detected_event)); - Kernel::KAutoObject::Create(std::addressof(friend_invitation_storage_channel_event)); - Kernel::KAutoObject::Create(std::addressof(notification_storage_channel_event)); - Kernel::KAutoObject::Create(std::addressof(health_warning_disappeared_system_event)); - - gpu_error_detected_event.Initialize("IApplicationFunctions:GpuErrorDetectedSystemEvent"); - friend_invitation_storage_channel_event.Initialize( - "IApplicationFunctions:FriendInvitationStorageChannelEvent"); - notification_storage_channel_event.Initialize( - "IApplicationFunctions:NotificationStorageChannelEvent"); - health_warning_disappeared_system_event.Initialize( - "IApplicationFunctions:HealthWarningDisappearedSystemEvent"); + gpu_error_detected_event = + service_context.CreateEvent("IApplicationFunctions:GpuErrorDetectedSystemEvent"); + friend_invitation_storage_channel_event = + service_context.CreateEvent("IApplicationFunctions:FriendInvitationStorageChannelEvent"); + notification_storage_channel_event = + service_context.CreateEvent("IApplicationFunctions:NotificationStorageChannelEvent"); + health_warning_disappeared_system_event = + service_context.CreateEvent("IApplicationFunctions:HealthWarningDisappearedSystemEvent"); } -IApplicationFunctions::~IApplicationFunctions() = default; +IApplicationFunctions::~IApplicationFunctions() { + service_context.CloseEvent(gpu_error_detected_event); + service_context.CloseEvent(friend_invitation_storage_channel_event); + service_context.CloseEvent(notification_storage_channel_event); + service_context.CloseEvent(health_warning_disappeared_system_event); +} void IApplicationFunctions::EnableApplicationCrashReport(Kernel::HLERequestContext& ctx) { LOG_WARNING(Service_AM, "(STUBBED) called"); @@ -1751,7 +1748,7 @@ void IApplicationFunctions::GetGpuErrorDetectedSystemEvent(Kernel::HLERequestCon IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(gpu_error_detected_event.GetReadableEvent()); + rb.PushCopyObjects(gpu_error_detected_event->GetReadableEvent()); } void IApplicationFunctions::GetFriendInvitationStorageChannelEvent(Kernel::HLERequestContext& ctx) { @@ -1759,7 +1756,7 @@ void IApplicationFunctions::GetFriendInvitationStorageChannelEvent(Kernel::HLERe IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(friend_invitation_storage_channel_event.GetReadableEvent()); + rb.PushCopyObjects(friend_invitation_storage_channel_event->GetReadableEvent()); } void IApplicationFunctions::TryPopFromFriendInvitationStorageChannel( @@ -1775,7 +1772,7 @@ void IApplicationFunctions::GetNotificationStorageChannelEvent(Kernel::HLEReques IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(notification_storage_channel_event.GetReadableEvent()); + rb.PushCopyObjects(notification_storage_channel_event->GetReadableEvent()); } void IApplicationFunctions::GetHealthWarningDisappearedSystemEvent(Kernel::HLERequestContext& ctx) { @@ -1783,12 +1780,12 @@ void IApplicationFunctions::GetHealthWarningDisappearedSystemEvent(Kernel::HLERe IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(health_warning_disappeared_system_event.GetReadableEvent()); + rb.PushCopyObjects(health_warning_disappeared_system_event->GetReadableEvent()); } void InstallInterfaces(SM::ServiceManager& service_manager, NVFlinger::NVFlinger& nvflinger, Core::System& system) { - auto message_queue = std::make_shared<AppletMessageQueue>(system.Kernel()); + auto message_queue = std::make_shared<AppletMessageQueue>(system); // Needed on game boot message_queue->PushMessage(AppletMessageQueue::AppletMessage::FocusStateChanged); @@ -1801,8 +1798,8 @@ void InstallInterfaces(SM::ServiceManager& service_manager, NVFlinger::NVFlinger } IHomeMenuFunctions::IHomeMenuFunctions(Core::System& system_) - : ServiceFramework{system_, "IHomeMenuFunctions"}, pop_from_general_channel_event{ - system.Kernel()} { + : ServiceFramework{system_, "IHomeMenuFunctions"}, service_context{system, + "IHomeMenuFunctions"} { // clang-format off static const FunctionInfo functions[] = { {10, &IHomeMenuFunctions::RequestToGetForeground, "RequestToGetForeground"}, @@ -1823,11 +1820,13 @@ IHomeMenuFunctions::IHomeMenuFunctions(Core::System& system_) RegisterHandlers(functions); - Kernel::KAutoObject::Create(std::addressof(pop_from_general_channel_event)); - pop_from_general_channel_event.Initialize("IHomeMenuFunctions:PopFromGeneralChannelEvent"); + pop_from_general_channel_event = + service_context.CreateEvent("IHomeMenuFunctions:PopFromGeneralChannelEvent"); } -IHomeMenuFunctions::~IHomeMenuFunctions() = default; +IHomeMenuFunctions::~IHomeMenuFunctions() { + service_context.CloseEvent(pop_from_general_channel_event); +} void IHomeMenuFunctions::RequestToGetForeground(Kernel::HLERequestContext& ctx) { LOG_WARNING(Service_AM, "(STUBBED) called"); @@ -1841,7 +1840,7 @@ void IHomeMenuFunctions::GetPopFromGeneralChannelEvent(Kernel::HLERequestContext IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(pop_from_general_channel_event.GetReadableEvent()); + rb.PushCopyObjects(pop_from_general_channel_event->GetReadableEvent()); } IGlobalStateController::IGlobalStateController(Core::System& system_) diff --git a/src/core/hle/service/am/am.h b/src/core/hle/service/am/am.h index c13aa5787..202d20757 100644 --- a/src/core/hle/service/am/am.h +++ b/src/core/hle/service/am/am.h @@ -8,7 +8,7 @@ #include <memory> #include <queue> -#include "core/hle/kernel/k_event.h" +#include "core/hle/service/kernel_helpers.h" #include "core/hle/service/service.h" namespace Kernel { @@ -53,7 +53,7 @@ public: PerformanceModeChanged = 31, }; - explicit AppletMessageQueue(Kernel::KernelCore& kernel); + explicit AppletMessageQueue(Core::System& system); ~AppletMessageQueue(); Kernel::KReadableEvent& GetMessageReceiveEvent(); @@ -66,9 +66,12 @@ public: void OperationModeChanged(); private: + KernelHelpers::ServiceContext service_context; + + Kernel::KEvent* on_new_message; + Kernel::KEvent* on_operation_mode_changed; + std::queue<AppletMessage> messages; - Kernel::KEvent on_new_message; - Kernel::KEvent on_operation_mode_changed; }; class IWindowController final : public ServiceFramework<IWindowController> { @@ -156,8 +159,11 @@ private: }; NVFlinger::NVFlinger& nvflinger; - Kernel::KEvent launchable_event; - Kernel::KEvent accumulated_suspended_tick_changed_event; + + KernelHelpers::ServiceContext service_context; + + Kernel::KEvent* launchable_event; + Kernel::KEvent* accumulated_suspended_tick_changed_event; u32 idle_time_detection_extension = 0; u64 num_fatal_sections_entered = 0; @@ -298,13 +304,15 @@ private: void GetNotificationStorageChannelEvent(Kernel::HLERequestContext& ctx); void GetHealthWarningDisappearedSystemEvent(Kernel::HLERequestContext& ctx); + KernelHelpers::ServiceContext service_context; + bool launch_popped_application_specific = false; bool launch_popped_account_preselect = false; s32 previous_program_index{-1}; - Kernel::KEvent gpu_error_detected_event; - Kernel::KEvent friend_invitation_storage_channel_event; - Kernel::KEvent notification_storage_channel_event; - Kernel::KEvent health_warning_disappeared_system_event; + Kernel::KEvent* gpu_error_detected_event; + Kernel::KEvent* friend_invitation_storage_channel_event; + Kernel::KEvent* notification_storage_channel_event; + Kernel::KEvent* health_warning_disappeared_system_event; }; class IHomeMenuFunctions final : public ServiceFramework<IHomeMenuFunctions> { @@ -316,7 +324,9 @@ private: void RequestToGetForeground(Kernel::HLERequestContext& ctx); void GetPopFromGeneralChannelEvent(Kernel::HLERequestContext& ctx); - Kernel::KEvent pop_from_general_channel_event; + KernelHelpers::ServiceContext service_context; + + Kernel::KEvent* pop_from_general_channel_event; }; class IGlobalStateController final : public ServiceFramework<IGlobalStateController> { diff --git a/src/core/hle/service/am/applets/applets.cpp b/src/core/hle/service/am/applets/applets.cpp index 2b7685d42..7320b1c0f 100644 --- a/src/core/hle/service/am/applets/applets.cpp +++ b/src/core/hle/service/am/applets/applets.cpp @@ -12,8 +12,7 @@ #include "core/frontend/applets/profile_select.h" #include "core/frontend/applets/software_keyboard.h" #include "core/frontend/applets/web_browser.h" -#include "core/hle/kernel/k_readable_event.h" -#include "core/hle/kernel/k_writable_event.h" +#include "core/hle/kernel/k_event.h" #include "core/hle/service/am/am.h" #include "core/hle/service/am/applet_ae.h" #include "core/hle/service/am/applet_oe.h" @@ -29,19 +28,19 @@ namespace Service::AM::Applets { AppletDataBroker::AppletDataBroker(Core::System& system_, LibraryAppletMode applet_mode_) - : system{system_}, applet_mode{applet_mode_}, state_changed_event{system.Kernel()}, - pop_out_data_event{system.Kernel()}, pop_interactive_out_data_event{system.Kernel()} { - - Kernel::KAutoObject::Create(std::addressof(state_changed_event)); - Kernel::KAutoObject::Create(std::addressof(pop_out_data_event)); - Kernel::KAutoObject::Create(std::addressof(pop_interactive_out_data_event)); - - state_changed_event.Initialize("ILibraryAppletAccessor:StateChangedEvent"); - pop_out_data_event.Initialize("ILibraryAppletAccessor:PopDataOutEvent"); - pop_interactive_out_data_event.Initialize("ILibraryAppletAccessor:PopInteractiveDataOutEvent"); + : system{system_}, applet_mode{applet_mode_}, service_context{system, + "ILibraryAppletAccessor"} { + state_changed_event = service_context.CreateEvent("ILibraryAppletAccessor:StateChangedEvent"); + pop_out_data_event = service_context.CreateEvent("ILibraryAppletAccessor:PopDataOutEvent"); + pop_interactive_out_data_event = + service_context.CreateEvent("ILibraryAppletAccessor:PopInteractiveDataOutEvent"); } -AppletDataBroker::~AppletDataBroker() = default; +AppletDataBroker::~AppletDataBroker() { + service_context.CloseEvent(state_changed_event); + service_context.CloseEvent(pop_out_data_event); + service_context.CloseEvent(pop_interactive_out_data_event); +} AppletDataBroker::RawChannelData AppletDataBroker::PeekDataToAppletForDebug() const { std::vector<std::vector<u8>> out_normal; @@ -65,7 +64,7 @@ std::shared_ptr<IStorage> AppletDataBroker::PopNormalDataToGame() { auto out = std::move(out_channel.front()); out_channel.pop_front(); - pop_out_data_event.GetWritableEvent().Clear(); + pop_out_data_event->GetWritableEvent().Clear(); return out; } @@ -84,7 +83,7 @@ std::shared_ptr<IStorage> AppletDataBroker::PopInteractiveDataToGame() { auto out = std::move(out_interactive_channel.front()); out_interactive_channel.pop_front(); - pop_interactive_out_data_event.GetWritableEvent().Clear(); + pop_interactive_out_data_event->GetWritableEvent().Clear(); return out; } @@ -103,7 +102,7 @@ void AppletDataBroker::PushNormalDataFromGame(std::shared_ptr<IStorage>&& storag void AppletDataBroker::PushNormalDataFromApplet(std::shared_ptr<IStorage>&& storage) { out_channel.emplace_back(std::move(storage)); - pop_out_data_event.GetWritableEvent().Signal(); + pop_out_data_event->GetWritableEvent().Signal(); } void AppletDataBroker::PushInteractiveDataFromGame(std::shared_ptr<IStorage>&& storage) { @@ -112,11 +111,11 @@ void AppletDataBroker::PushInteractiveDataFromGame(std::shared_ptr<IStorage>&& s void AppletDataBroker::PushInteractiveDataFromApplet(std::shared_ptr<IStorage>&& storage) { out_interactive_channel.emplace_back(std::move(storage)); - pop_interactive_out_data_event.GetWritableEvent().Signal(); + pop_interactive_out_data_event->GetWritableEvent().Signal(); } void AppletDataBroker::SignalStateChanged() { - state_changed_event.GetWritableEvent().Signal(); + state_changed_event->GetWritableEvent().Signal(); switch (applet_mode) { case LibraryAppletMode::AllForeground: @@ -141,15 +140,15 @@ void AppletDataBroker::SignalStateChanged() { } Kernel::KReadableEvent& AppletDataBroker::GetNormalDataEvent() { - return pop_out_data_event.GetReadableEvent(); + return pop_out_data_event->GetReadableEvent(); } Kernel::KReadableEvent& AppletDataBroker::GetInteractiveDataEvent() { - return pop_interactive_out_data_event.GetReadableEvent(); + return pop_interactive_out_data_event->GetReadableEvent(); } Kernel::KReadableEvent& AppletDataBroker::GetStateChangedEvent() { - return state_changed_event.GetReadableEvent(); + return state_changed_event->GetReadableEvent(); } Applet::Applet(Core::System& system_, LibraryAppletMode applet_mode_) diff --git a/src/core/hle/service/am/applets/applets.h b/src/core/hle/service/am/applets/applets.h index 5c0b4b459..15eeb4ee1 100644 --- a/src/core/hle/service/am/applets/applets.h +++ b/src/core/hle/service/am/applets/applets.h @@ -8,7 +8,7 @@ #include <queue> #include "common/swap.h" -#include "core/hle/kernel/k_event.h" +#include "core/hle/service/kernel_helpers.h" union ResultCode; @@ -105,6 +105,8 @@ private: Core::System& system; LibraryAppletMode applet_mode; + KernelHelpers::ServiceContext service_context; + // Queues are named from applet's perspective // PopNormalDataToApplet and PushNormalDataFromGame @@ -119,13 +121,13 @@ private: // PopInteractiveDataToGame and PushInteractiveDataFromApplet std::deque<std::shared_ptr<IStorage>> out_interactive_channel; - Kernel::KEvent state_changed_event; + Kernel::KEvent* state_changed_event; // Signaled on PushNormalDataFromApplet - Kernel::KEvent pop_out_data_event; + Kernel::KEvent* pop_out_data_event; // Signaled on PushInteractiveDataFromApplet - Kernel::KEvent pop_interactive_out_data_event; + Kernel::KEvent* pop_interactive_out_data_event; }; class Applet { diff --git a/src/core/hle/service/aoc/aoc_u.cpp b/src/core/hle/service/aoc/aoc_u.cpp index dd945e058..4c54066c6 100644 --- a/src/core/hle/service/aoc/aoc_u.cpp +++ b/src/core/hle/service/aoc/aoc_u.cpp @@ -16,8 +16,8 @@ #include "core/file_sys/patch_manager.h" #include "core/file_sys/registered_cache.h" #include "core/hle/ipc_helpers.h" +#include "core/hle/kernel/k_event.h" #include "core/hle/kernel/k_process.h" -#include "core/hle/kernel/k_readable_event.h" #include "core/hle/kernel/kernel.h" #include "core/hle/service/aoc/aoc_u.h" #include "core/loader/loader.h" @@ -49,7 +49,8 @@ static std::vector<u64> AccumulateAOCTitleIDs(Core::System& system) { class IPurchaseEventManager final : public ServiceFramework<IPurchaseEventManager> { public: explicit IPurchaseEventManager(Core::System& system_) - : ServiceFramework{system_, "IPurchaseEventManager"}, purchased_event{system.Kernel()} { + : ServiceFramework{system_, "IPurchaseEventManager"}, service_context{ + system, "IPurchaseEventManager"} { // clang-format off static const FunctionInfo functions[] = { {0, &IPurchaseEventManager::SetDefaultDeliveryTarget, "SetDefaultDeliveryTarget"}, @@ -62,8 +63,11 @@ public: RegisterHandlers(functions); - Kernel::KAutoObject::Create(std::addressof(purchased_event)); - purchased_event.Initialize("IPurchaseEventManager:PurchasedEvent"); + purchased_event = service_context.CreateEvent("IPurchaseEventManager:PurchasedEvent"); + } + + ~IPurchaseEventManager() override { + service_context.CloseEvent(purchased_event); } private: @@ -96,15 +100,17 @@ private: IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(purchased_event.GetReadableEvent()); + rb.PushCopyObjects(purchased_event->GetReadableEvent()); } - Kernel::KEvent purchased_event; + KernelHelpers::ServiceContext service_context; + + Kernel::KEvent* purchased_event; }; AOC_U::AOC_U(Core::System& system_) : ServiceFramework{system_, "aoc:u"}, add_on_content{AccumulateAOCTitleIDs(system)}, - aoc_change_event{system.Kernel()} { + service_context{system_, "aoc:u"} { // clang-format off static const FunctionInfo functions[] = { {0, nullptr, "CountAddOnContentByApplicationId"}, @@ -126,11 +132,12 @@ AOC_U::AOC_U(Core::System& system_) RegisterHandlers(functions); - Kernel::KAutoObject::Create(std::addressof(aoc_change_event)); - aoc_change_event.Initialize("GetAddOnContentListChanged:Event"); + aoc_change_event = service_context.CreateEvent("GetAddOnContentListChanged:Event"); } -AOC_U::~AOC_U() = default; +AOC_U::~AOC_U() { + service_context.CloseEvent(aoc_change_event); +} void AOC_U::CountAddOnContent(Kernel::HLERequestContext& ctx) { struct Parameters { @@ -254,7 +261,7 @@ void AOC_U::GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx) { IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(aoc_change_event.GetReadableEvent()); + rb.PushCopyObjects(aoc_change_event->GetReadableEvent()); } void AOC_U::GetAddOnContentListChangedEventWithProcessId(Kernel::HLERequestContext& ctx) { @@ -262,7 +269,7 @@ void AOC_U::GetAddOnContentListChangedEventWithProcessId(Kernel::HLERequestConte IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(aoc_change_event.GetReadableEvent()); + rb.PushCopyObjects(aoc_change_event->GetReadableEvent()); } void AOC_U::CreateEcPurchasedEventManager(Kernel::HLERequestContext& ctx) { diff --git a/src/core/hle/service/aoc/aoc_u.h b/src/core/hle/service/aoc/aoc_u.h index bb6ffb8eb..31d645be8 100644 --- a/src/core/hle/service/aoc/aoc_u.h +++ b/src/core/hle/service/aoc/aoc_u.h @@ -4,7 +4,7 @@ #pragma once -#include "core/hle/kernel/k_event.h" +#include "core/hle/service/kernel_helpers.h" #include "core/hle/service/service.h" namespace Core { @@ -33,7 +33,9 @@ private: void CreatePermanentEcPurchasedEventManager(Kernel::HLERequestContext& ctx); std::vector<u64> add_on_content; - Kernel::KEvent aoc_change_event; + KernelHelpers::ServiceContext service_context; + + Kernel::KEvent* aoc_change_event; }; /// Registers all AOC services with the specified service manager. diff --git a/src/core/hle/service/audio/audin_u.cpp b/src/core/hle/service/audio/audin_u.cpp index 570525019..840d1d883 100644 --- a/src/core/hle/service/audio/audin_u.cpp +++ b/src/core/hle/service/audio/audin_u.cpp @@ -12,7 +12,7 @@ namespace Service::Audio { IAudioIn::IAudioIn(Core::System& system_) - : ServiceFramework{system_, "IAudioIn"}, buffer_event{system_.Kernel()} { + : ServiceFramework{system_, "IAudioIn"}, service_context{system_, "IAudioIn"} { // clang-format off static const FunctionInfo functions[] = { {0, nullptr, "GetAudioInState"}, @@ -35,11 +35,12 @@ IAudioIn::IAudioIn(Core::System& system_) RegisterHandlers(functions); - Kernel::KAutoObject::Create(std::addressof(buffer_event)); - buffer_event.Initialize("IAudioIn:BufferEvent"); + buffer_event = service_context.CreateEvent("IAudioIn:BufferEvent"); } -IAudioIn::~IAudioIn() = default; +IAudioIn::~IAudioIn() { + service_context.CloseEvent(buffer_event); +} void IAudioIn::Start(Kernel::HLERequestContext& ctx) { LOG_WARNING(Service_Audio, "(STUBBED) called"); @@ -53,7 +54,7 @@ void IAudioIn::RegisterBufferEvent(Kernel::HLERequestContext& ctx) { IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(buffer_event.GetReadableEvent()); + rb.PushCopyObjects(buffer_event->GetReadableEvent()); } void IAudioIn::AppendAudioInBufferAuto(Kernel::HLERequestContext& ctx) { diff --git a/src/core/hle/service/audio/audin_u.h b/src/core/hle/service/audio/audin_u.h index f2f7f9932..bf3418613 100644 --- a/src/core/hle/service/audio/audin_u.h +++ b/src/core/hle/service/audio/audin_u.h @@ -4,7 +4,7 @@ #pragma once -#include "core/hle/kernel/k_event.h" +#include "core/hle/service/kernel_helpers.h" #include "core/hle/service/service.h" namespace Core { @@ -27,7 +27,9 @@ private: void RegisterBufferEvent(Kernel::HLERequestContext& ctx); void AppendAudioInBufferAuto(Kernel::HLERequestContext& ctx); - Kernel::KEvent buffer_event; + KernelHelpers::ServiceContext service_context; + + Kernel::KEvent* buffer_event; }; class AudInU final : public ServiceFramework<AudInU> { diff --git a/src/core/hle/service/audio/audout_u.cpp b/src/core/hle/service/audio/audout_u.cpp index 92d4510b1..beb387745 100644 --- a/src/core/hle/service/audio/audout_u.cpp +++ b/src/core/hle/service/audio/audout_u.cpp @@ -15,11 +15,10 @@ #include "core/hle/ipc_helpers.h" #include "core/hle/kernel/hle_ipc.h" #include "core/hle/kernel/k_event.h" -#include "core/hle/kernel/k_readable_event.h" -#include "core/hle/kernel/k_writable_event.h" #include "core/hle/kernel/kernel.h" #include "core/hle/service/audio/audout_u.h" #include "core/hle/service/audio/errors.h" +#include "core/hle/service/kernel_helpers.h" #include "core/memory.h" namespace Service::Audio { @@ -41,11 +40,12 @@ enum class AudioState : u32 { class IAudioOut final : public ServiceFramework<IAudioOut> { public: - IAudioOut(Core::System& system_, AudoutParams audio_params_, AudioCore::AudioOut& audio_core_, - std::string&& device_name_, std::string&& unique_name) - : ServiceFramework{system_, "IAudioOut"}, audio_core{audio_core_}, device_name{std::move( - device_name_)}, - audio_params{audio_params_}, buffer_event{system.Kernel()}, main_memory{system.Memory()} { + explicit IAudioOut(Core::System& system_, AudoutParams audio_params_, + AudioCore::AudioOut& audio_core_, std::string&& device_name_, + std::string&& unique_name) + : ServiceFramework{system_, "IAudioOut"}, audio_core{audio_core_}, + device_name{std::move(device_name_)}, audio_params{audio_params_}, + main_memory{system.Memory()}, service_context{system_, "IAudioOut"} { // clang-format off static const FunctionInfo functions[] = { {0, &IAudioOut::GetAudioOutState, "GetAudioOutState"}, @@ -67,16 +67,19 @@ public: RegisterHandlers(functions); // This is the event handle used to check if the audio buffer was released - Kernel::KAutoObject::Create(std::addressof(buffer_event)); - buffer_event.Initialize("IAudioOutBufferReleased"); + buffer_event = service_context.CreateEvent("IAudioOutBufferReleased"); stream = audio_core.OpenStream(system.CoreTiming(), audio_params.sample_rate, audio_params.channel_count, std::move(unique_name), [this] { const auto guard = LockService(); - buffer_event.GetWritableEvent().Signal(); + buffer_event->GetWritableEvent().Signal(); }); } + ~IAudioOut() override { + service_context.CloseEvent(buffer_event); + } + private: struct AudioBuffer { u64_le next; @@ -126,7 +129,7 @@ private: IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(buffer_event.GetReadableEvent()); + rb.PushCopyObjects(buffer_event->GetReadableEvent()); } void AppendAudioOutBufferImpl(Kernel::HLERequestContext& ctx) { @@ -227,9 +230,12 @@ private: [[maybe_unused]] AudoutParams audio_params{}; - /// This is the event handle used to check if the audio buffer was released - Kernel::KEvent buffer_event; Core::Memory::Memory& main_memory; + + KernelHelpers::ServiceContext service_context; + + /// This is the event handle used to check if the audio buffer was released + Kernel::KEvent* buffer_event; }; AudOutU::AudOutU(Core::System& system_) : ServiceFramework{system_, "audout:u"} { diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp index 1a91719f5..1f69d39cc 100644 --- a/src/core/hle/service/audio/audren_u.cpp +++ b/src/core/hle/service/audio/audren_u.cpp @@ -17,8 +17,6 @@ #include "core/hle/ipc_helpers.h" #include "core/hle/kernel/hle_ipc.h" #include "core/hle/kernel/k_event.h" -#include "core/hle/kernel/k_readable_event.h" -#include "core/hle/kernel/k_writable_event.h" #include "core/hle/kernel/kernel.h" #include "core/hle/service/audio/audren_u.h" #include "core/hle/service/audio/errors.h" @@ -30,7 +28,7 @@ public: explicit IAudioRenderer(Core::System& system_, const AudioCommon::AudioRendererParameter& audren_params, const std::size_t instance_number) - : ServiceFramework{system_, "IAudioRenderer"}, system_event{system.Kernel()} { + : ServiceFramework{system_, "IAudioRenderer"}, service_context{system_, "IAudioRenderer"} { // clang-format off static const FunctionInfo functions[] = { {0, &IAudioRenderer::GetSampleRate, "GetSampleRate"}, @@ -49,17 +47,20 @@ public: // clang-format on RegisterHandlers(functions); - Kernel::KAutoObject::Create(std::addressof(system_event)); - system_event.Initialize("IAudioRenderer:SystemEvent"); + system_event = service_context.CreateEvent("IAudioRenderer:SystemEvent"); renderer = std::make_unique<AudioCore::AudioRenderer>( system.CoreTiming(), system.Memory(), audren_params, [this]() { const auto guard = LockService(); - system_event.GetWritableEvent().Signal(); + system_event->GetWritableEvent().Signal(); }, instance_number); } + ~IAudioRenderer() override { + service_context.CloseEvent(system_event); + } + private: void GetSampleRate(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_Audio, "called"); @@ -130,7 +131,7 @@ private: IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(system_event.GetReadableEvent()); + rb.PushCopyObjects(system_event->GetReadableEvent()); } void SetRenderingTimeLimit(Kernel::HLERequestContext& ctx) { @@ -164,14 +165,16 @@ private: rb.Push(ERR_NOT_SUPPORTED); } - Kernel::KEvent system_event; + KernelHelpers::ServiceContext service_context; + + Kernel::KEvent* system_event; std::unique_ptr<AudioCore::AudioRenderer> renderer; u32 rendering_time_limit_percent = 100; }; class IAudioDevice final : public ServiceFramework<IAudioDevice> { public: - explicit IAudioDevice(Core::System& system_, Kernel::KEvent& buffer_event_, u32_le revision_) + explicit IAudioDevice(Core::System& system_, Kernel::KEvent* buffer_event_, u32_le revision_) : ServiceFramework{system_, "IAudioDevice"}, buffer_event{buffer_event_}, revision{ revision_} { static const FunctionInfo functions[] = { @@ -279,11 +282,11 @@ private: void QueryAudioDeviceSystemEvent(Kernel::HLERequestContext& ctx) { LOG_WARNING(Service_Audio, "(STUBBED) called"); - buffer_event.GetWritableEvent().Signal(); + buffer_event->GetWritableEvent().Signal(); IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(buffer_event.GetReadableEvent()); + rb.PushCopyObjects(buffer_event->GetReadableEvent()); } void GetActiveChannelCount(Kernel::HLERequestContext& ctx) { @@ -300,7 +303,7 @@ private: IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(buffer_event.GetReadableEvent()); + rb.PushCopyObjects(buffer_event->GetReadableEvent()); } void QueryAudioDeviceOutputEvent(Kernel::HLERequestContext& ctx) { @@ -308,16 +311,15 @@ private: IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(buffer_event.GetReadableEvent()); + rb.PushCopyObjects(buffer_event->GetReadableEvent()); } - Kernel::KEvent& buffer_event; + Kernel::KEvent* buffer_event; u32_le revision = 0; }; AudRenU::AudRenU(Core::System& system_) - : ServiceFramework{system_, "audren:u"}, buffer_event{system.Kernel()} { - + : ServiceFramework{system_, "audren:u"}, service_context{system_, "audren:u"} { // clang-format off static const FunctionInfo functions[] = { {0, &AudRenU::OpenAudioRenderer, "OpenAudioRenderer"}, @@ -330,11 +332,12 @@ AudRenU::AudRenU(Core::System& system_) RegisterHandlers(functions); - Kernel::KAutoObject::Create(std::addressof(buffer_event)); - buffer_event.Initialize("IAudioOutBufferReleasedEvent"); + buffer_event = service_context.CreateEvent("IAudioOutBufferReleasedEvent"); } -AudRenU::~AudRenU() = default; +AudRenU::~AudRenU() { + service_context.CloseEvent(buffer_event); +} void AudRenU::OpenAudioRenderer(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_Audio, "called"); diff --git a/src/core/hle/service/audio/audren_u.h b/src/core/hle/service/audio/audren_u.h index 0ee6f9542..5922b4b27 100644 --- a/src/core/hle/service/audio/audren_u.h +++ b/src/core/hle/service/audio/audren_u.h @@ -4,7 +4,7 @@ #pragma once -#include "core/hle/kernel/k_event.h" +#include "core/hle/service/kernel_helpers.h" #include "core/hle/service/service.h" namespace Core { @@ -31,8 +31,10 @@ private: void OpenAudioRendererImpl(Kernel::HLERequestContext& ctx); + KernelHelpers::ServiceContext service_context; + std::size_t audren_instance_count = 0; - Kernel::KEvent buffer_event; + Kernel::KEvent* buffer_event; }; // Describes a particular audio feature that may be supported in a particular revision. diff --git a/src/core/hle/service/bcat/backend/backend.cpp b/src/core/hle/service/bcat/backend/backend.cpp index a78544c88..4c7d3bb6e 100644 --- a/src/core/hle/service/bcat/backend/backend.cpp +++ b/src/core/hle/service/bcat/backend/backend.cpp @@ -5,22 +5,24 @@ #include "common/hex_util.h" #include "common/logging/log.h" #include "core/core.h" -#include "core/hle/kernel/k_readable_event.h" -#include "core/hle/kernel/k_writable_event.h" +#include "core/hle/kernel/k_event.h" #include "core/hle/lock.h" #include "core/hle/service/bcat/backend/backend.h" namespace Service::BCAT { -ProgressServiceBackend::ProgressServiceBackend(Kernel::KernelCore& kernel, - std::string_view event_name) - : update_event{kernel} { - Kernel::KAutoObject::Create(std::addressof(update_event)); - update_event.Initialize("ProgressServiceBackend:UpdateEvent:" + std::string(event_name)); +ProgressServiceBackend::ProgressServiceBackend(Core::System& system, std::string_view event_name) + : service_context{system, "ProgressServiceBackend"} { + update_event = service_context.CreateEvent("ProgressServiceBackend:UpdateEvent:" + + std::string(event_name)); +} + +ProgressServiceBackend::~ProgressServiceBackend() { + service_context.CloseEvent(update_event); } Kernel::KReadableEvent& ProgressServiceBackend::GetEvent() { - return update_event.GetReadableEvent(); + return update_event->GetReadableEvent(); } DeliveryCacheProgressImpl& ProgressServiceBackend::GetImpl() { @@ -88,9 +90,9 @@ void ProgressServiceBackend::FinishDownload(ResultCode result) { void ProgressServiceBackend::SignalUpdate() { if (need_hle_lock) { std::lock_guard lock(HLE::g_hle_lock); - update_event.GetWritableEvent().Signal(); + update_event->GetWritableEvent().Signal(); } else { - update_event.GetWritableEvent().Signal(); + update_event->GetWritableEvent().Signal(); } } diff --git a/src/core/hle/service/bcat/backend/backend.h b/src/core/hle/service/bcat/backend/backend.h index e79a9c2ad..749e046c7 100644 --- a/src/core/hle/service/bcat/backend/backend.h +++ b/src/core/hle/service/bcat/backend/backend.h @@ -11,8 +11,8 @@ #include "common/common_types.h" #include "core/file_sys/vfs_types.h" -#include "core/hle/kernel/k_event.h" #include "core/hle/result.h" +#include "core/hle/service/kernel_helpers.h" namespace Core { class System; @@ -70,6 +70,8 @@ class ProgressServiceBackend { friend class IBcatService; public: + ~ProgressServiceBackend(); + // Clients should call this with true if any of the functions are going to be called from a // non-HLE thread and this class need to lock the hle mutex. (default is false) void SetNeedHLELock(bool need); @@ -97,15 +99,17 @@ public: void FinishDownload(ResultCode result); private: - explicit ProgressServiceBackend(Kernel::KernelCore& kernel, std::string_view event_name); + explicit ProgressServiceBackend(Core::System& system, std::string_view event_name); Kernel::KReadableEvent& GetEvent(); DeliveryCacheProgressImpl& GetImpl(); void SignalUpdate(); + KernelHelpers::ServiceContext service_context; + DeliveryCacheProgressImpl impl{}; - Kernel::KEvent update_event; + Kernel::KEvent* update_event; bool need_hle_lock = false; }; diff --git a/src/core/hle/service/bcat/backend/boxcat.cpp b/src/core/hle/service/bcat/backend/boxcat.cpp deleted file mode 100644 index 7ca7f2aac..000000000 --- a/src/core/hle/service/bcat/backend/boxcat.cpp +++ /dev/null @@ -1,548 +0,0 @@ -// Copyright 2019 yuzu emulator team -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -#include <fmt/ostream.h> - -#ifdef __GNUC__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wshadow" -#ifndef __clang__ -#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" -#endif -#endif -#include <httplib.h> -#include <mbedtls/sha256.h> -#include <nlohmann/json.hpp> -#ifdef __GNUC__ -#pragma GCC diagnostic pop -#endif - -#include "common/fs/file.h" -#include "common/fs/fs.h" -#include "common/fs/path_util.h" -#include "common/hex_util.h" -#include "common/logging/log.h" -#include "common/settings.h" -#include "core/core.h" -#include "core/file_sys/vfs.h" -#include "core/file_sys/vfs_libzip.h" -#include "core/file_sys/vfs_vector.h" -#include "core/frontend/applets/error.h" -#include "core/hle/service/am/applets/applets.h" -#include "core/hle/service/bcat/backend/boxcat.h" - -namespace Service::BCAT { -namespace { - -// Prevents conflicts with windows macro called CreateFile -FileSys::VirtualFile VfsCreateFileWrap(FileSys::VirtualDir dir, std::string_view name) { - return dir->CreateFile(name); -} - -// Prevents conflicts with windows macro called DeleteFile -bool VfsDeleteFileWrap(FileSys::VirtualDir dir, std::string_view name) { - return dir->DeleteFile(name); -} - -constexpr ResultCode ERROR_GENERAL_BCAT_FAILURE{ErrorModule::BCAT, 1}; - -constexpr char BOXCAT_HOSTNAME[] = "api.yuzu-emu.org"; - -// Formatted using fmt with arg[0] = hex title id -constexpr char BOXCAT_PATHNAME_DATA[] = "/game-assets/{:016X}/boxcat"; -constexpr char BOXCAT_PATHNAME_LAUNCHPARAM[] = "/game-assets/{:016X}/launchparam"; - -constexpr char BOXCAT_PATHNAME_EVENTS[] = "/game-assets/boxcat/events"; - -constexpr char BOXCAT_API_VERSION[] = "1"; -constexpr char BOXCAT_CLIENT_TYPE[] = "yuzu"; - -// HTTP status codes for Boxcat -enum class ResponseStatus { - Ok = 200, ///< Operation completed successfully. - BadClientVersion = 301, ///< The Boxcat-Client-Version doesn't match the server. - NoUpdate = 304, ///< The digest provided would match the new data, no need to update. - NoMatchTitleId = 404, ///< The title ID provided doesn't have a boxcat implementation. - NoMatchBuildId = 406, ///< The build ID provided is blacklisted (potentially because of format - ///< issues or whatnot) and has no data. -}; - -enum class DownloadResult { - Success = 0, - NoResponse, - GeneralWebError, - NoMatchTitleId, - NoMatchBuildId, - InvalidContentType, - GeneralFSError, - BadClientVersion, -}; - -constexpr std::array<const char*, 8> DOWNLOAD_RESULT_LOG_MESSAGES{ - "Success", - "There was no response from the server.", - "There was a general web error code returned from the server.", - "The title ID of the current game doesn't have a boxcat implementation. If you believe an " - "implementation should be added, contact yuzu support.", - "The build ID of the current version of the game is marked as incompatible with the current " - "BCAT distribution. Try upgrading or downgrading your game version or contacting yuzu support.", - "The content type of the web response was invalid.", - "There was a general filesystem error while saving the zip file.", - "The server is either too new or too old to serve the request. Try using the latest version of " - "an official release of yuzu.", -}; - -std::ostream& operator<<(std::ostream& os, DownloadResult result) { - return os << DOWNLOAD_RESULT_LOG_MESSAGES.at(static_cast<std::size_t>(result)); -} - -constexpr u32 PORT = 443; -constexpr u32 TIMEOUT_SECONDS = 30; -[[maybe_unused]] constexpr u64 VFS_COPY_BLOCK_SIZE = 1ULL << 24; // 4MB - -std::filesystem::path GetBINFilePath(u64 title_id) { - return Common::FS::GetYuzuPath(Common::FS::YuzuPath::CacheDir) / "bcat" / - fmt::format("{:016X}/launchparam.bin", title_id); -} - -std::filesystem::path GetZIPFilePath(u64 title_id) { - return Common::FS::GetYuzuPath(Common::FS::YuzuPath::CacheDir) / "bcat" / - fmt::format("{:016X}/data.zip", title_id); -} - -// If the error is something the user should know about (build ID mismatch, bad client version), -// display an error. -void HandleDownloadDisplayResult(const AM::Applets::AppletManager& applet_manager, - DownloadResult res) { - if (res == DownloadResult::Success || res == DownloadResult::NoResponse || - res == DownloadResult::GeneralWebError || res == DownloadResult::GeneralFSError || - res == DownloadResult::NoMatchTitleId || res == DownloadResult::InvalidContentType) { - return; - } - - const auto& frontend{applet_manager.GetAppletFrontendSet()}; - frontend.error->ShowCustomErrorText( - ResultUnknown, "There was an error while attempting to use Boxcat.", - DOWNLOAD_RESULT_LOG_MESSAGES[static_cast<std::size_t>(res)], [] {}); -} - -bool VfsRawCopyProgress(FileSys::VirtualFile src, FileSys::VirtualFile dest, - std::string_view dir_name, ProgressServiceBackend& progress, - std::size_t block_size = 0x1000) { - if (src == nullptr || dest == nullptr || !src->IsReadable() || !dest->IsWritable()) - return false; - if (!dest->Resize(src->GetSize())) - return false; - - progress.StartDownloadingFile(dir_name, src->GetName(), src->GetSize()); - - std::vector<u8> temp(std::min(block_size, src->GetSize())); - for (std::size_t i = 0; i < src->GetSize(); i += block_size) { - const auto read = std::min(block_size, src->GetSize() - i); - - if (src->Read(temp.data(), read, i) != read) { - return false; - } - - if (dest->Write(temp.data(), read, i) != read) { - return false; - } - - progress.UpdateFileProgress(i); - } - - progress.FinishDownloadingFile(); - - return true; -} - -bool VfsRawCopyDProgressSingle(FileSys::VirtualDir src, FileSys::VirtualDir dest, - ProgressServiceBackend& progress, std::size_t block_size = 0x1000) { - if (src == nullptr || dest == nullptr || !src->IsReadable() || !dest->IsWritable()) - return false; - - for (const auto& file : src->GetFiles()) { - const auto out_file = VfsCreateFileWrap(dest, file->GetName()); - if (!VfsRawCopyProgress(file, out_file, src->GetName(), progress, block_size)) { - return false; - } - } - progress.CommitDirectory(src->GetName()); - - return true; -} - -bool VfsRawCopyDProgress(FileSys::VirtualDir src, FileSys::VirtualDir dest, - ProgressServiceBackend& progress, std::size_t block_size = 0x1000) { - if (src == nullptr || dest == nullptr || !src->IsReadable() || !dest->IsWritable()) - return false; - - for (const auto& dir : src->GetSubdirectories()) { - const auto out = dest->CreateSubdirectory(dir->GetName()); - if (!VfsRawCopyDProgressSingle(dir, out, progress, block_size)) { - return false; - } - } - - return true; -} - -} // Anonymous namespace - -class Boxcat::Client { -public: - Client(std::filesystem::path path_, u64 title_id_, u64 build_id_) - : path(std::move(path_)), title_id(title_id_), build_id(build_id_) {} - - DownloadResult DownloadDataZip() { - return DownloadInternal(fmt::format(BOXCAT_PATHNAME_DATA, title_id), TIMEOUT_SECONDS, - "application/zip"); - } - - DownloadResult DownloadLaunchParam() { - return DownloadInternal(fmt::format(BOXCAT_PATHNAME_LAUNCHPARAM, title_id), - TIMEOUT_SECONDS / 3, "application/octet-stream"); - } - -private: - DownloadResult DownloadInternal(const std::string& resolved_path, u32 timeout_seconds, - const std::string& content_type_name) { - if (client == nullptr) { - client = std::make_unique<httplib::SSLClient>(BOXCAT_HOSTNAME, PORT); - client->set_connection_timeout(timeout_seconds); - client->set_read_timeout(timeout_seconds); - client->set_write_timeout(timeout_seconds); - } - - httplib::Headers headers{ - {std::string("Game-Assets-API-Version"), std::string(BOXCAT_API_VERSION)}, - {std::string("Boxcat-Client-Type"), std::string(BOXCAT_CLIENT_TYPE)}, - {std::string("Game-Build-Id"), fmt::format("{:016X}", build_id)}, - }; - - if (Common::FS::Exists(path)) { - Common::FS::IOFile file{path, Common::FS::FileAccessMode::Read, - Common::FS::FileType::BinaryFile}; - if (file.IsOpen()) { - std::vector<u8> bytes(file.GetSize()); - void(file.Read(bytes)); - const auto digest = DigestFile(bytes); - headers.insert({std::string("If-None-Match"), Common::HexToString(digest, false)}); - } - } - - const auto response = client->Get(resolved_path.c_str(), headers); - if (response == nullptr) - return DownloadResult::NoResponse; - - if (response->status == static_cast<int>(ResponseStatus::NoUpdate)) - return DownloadResult::Success; - if (response->status == static_cast<int>(ResponseStatus::BadClientVersion)) - return DownloadResult::BadClientVersion; - if (response->status == static_cast<int>(ResponseStatus::NoMatchTitleId)) - return DownloadResult::NoMatchTitleId; - if (response->status == static_cast<int>(ResponseStatus::NoMatchBuildId)) - return DownloadResult::NoMatchBuildId; - if (response->status != static_cast<int>(ResponseStatus::Ok)) - return DownloadResult::GeneralWebError; - - const auto content_type = response->headers.find("content-type"); - if (content_type == response->headers.end() || - content_type->second.find(content_type_name) == std::string::npos) { - return DownloadResult::InvalidContentType; - } - - if (!Common::FS::CreateDirs(path)) { - return DownloadResult::GeneralFSError; - } - - Common::FS::IOFile file{path, Common::FS::FileAccessMode::Append, - Common::FS::FileType::BinaryFile}; - if (!file.IsOpen()) { - return DownloadResult::GeneralFSError; - } - - if (!file.SetSize(response->body.size())) { - return DownloadResult::GeneralFSError; - } - - if (file.Write(response->body) != response->body.size()) { - return DownloadResult::GeneralFSError; - } - - return DownloadResult::Success; - } - - using Digest = std::array<u8, 0x20>; - static Digest DigestFile(std::vector<u8> bytes) { - Digest out{}; - mbedtls_sha256_ret(bytes.data(), bytes.size(), out.data(), 0); - return out; - } - - std::unique_ptr<httplib::SSLClient> client; - std::filesystem::path path; - u64 title_id; - u64 build_id; -}; - -Boxcat::Boxcat(AM::Applets::AppletManager& applet_manager_, DirectoryGetter getter) - : Backend(std::move(getter)), applet_manager{applet_manager_} {} - -Boxcat::~Boxcat() = default; - -void SynchronizeInternal(AM::Applets::AppletManager& applet_manager, DirectoryGetter dir_getter, - TitleIDVersion title, ProgressServiceBackend& progress, - std::optional<std::string> dir_name = {}) { - progress.SetNeedHLELock(true); - - if (Settings::values.bcat_boxcat_local) { - LOG_INFO(Service_BCAT, "Boxcat using local data by override, skipping download."); - const auto dir = dir_getter(title.title_id); - if (dir) - progress.SetTotalSize(dir->GetSize()); - progress.FinishDownload(ResultSuccess); - return; - } - - const auto zip_path = GetZIPFilePath(title.title_id); - Boxcat::Client client{zip_path, title.title_id, title.build_id}; - - progress.StartConnecting(); - - const auto res = client.DownloadDataZip(); - if (res != DownloadResult::Success) { - LOG_ERROR(Service_BCAT, "Boxcat synchronization failed with error '{}'!", res); - - if (res == DownloadResult::NoMatchBuildId || res == DownloadResult::NoMatchTitleId) { - Common::FS::RemoveFile(zip_path); - } - - HandleDownloadDisplayResult(applet_manager, res); - progress.FinishDownload(ERROR_GENERAL_BCAT_FAILURE); - return; - } - - progress.StartProcessingDataList(); - - Common::FS::IOFile zip{zip_path, Common::FS::FileAccessMode::Read, - Common::FS::FileType::BinaryFile}; - const auto size = zip.GetSize(); - std::vector<u8> bytes(size); - if (!zip.IsOpen() || size == 0 || zip.Read(bytes) != bytes.size()) { - LOG_ERROR(Service_BCAT, "Boxcat failed to read ZIP file at path '{}'!", - Common::FS::PathToUTF8String(zip_path)); - progress.FinishDownload(ERROR_GENERAL_BCAT_FAILURE); - return; - } - - const auto extracted = FileSys::ExtractZIP(std::make_shared<FileSys::VectorVfsFile>(bytes)); - if (extracted == nullptr) { - LOG_ERROR(Service_BCAT, "Boxcat failed to extract ZIP file!"); - progress.FinishDownload(ERROR_GENERAL_BCAT_FAILURE); - return; - } - - if (dir_name == std::nullopt) { - progress.SetTotalSize(extracted->GetSize()); - - const auto target_dir = dir_getter(title.title_id); - if (target_dir == nullptr || !VfsRawCopyDProgress(extracted, target_dir, progress)) { - LOG_ERROR(Service_BCAT, "Boxcat failed to copy extracted ZIP to target directory!"); - progress.FinishDownload(ERROR_GENERAL_BCAT_FAILURE); - return; - } - } else { - const auto target_dir = dir_getter(title.title_id); - if (target_dir == nullptr) { - LOG_ERROR(Service_BCAT, "Boxcat failed to get directory for title ID!"); - progress.FinishDownload(ERROR_GENERAL_BCAT_FAILURE); - return; - } - - const auto target_sub = target_dir->GetSubdirectory(*dir_name); - const auto source_sub = extracted->GetSubdirectory(*dir_name); - - progress.SetTotalSize(source_sub->GetSize()); - - std::vector<std::string> filenames; - { - const auto files = target_sub->GetFiles(); - std::transform(files.begin(), files.end(), std::back_inserter(filenames), - [](const auto& vfile) { return vfile->GetName(); }); - } - - for (const auto& filename : filenames) { - VfsDeleteFileWrap(target_sub, filename); - } - - if (target_sub == nullptr || source_sub == nullptr || - !VfsRawCopyDProgressSingle(source_sub, target_sub, progress)) { - LOG_ERROR(Service_BCAT, "Boxcat failed to copy extracted ZIP to target directory!"); - progress.FinishDownload(ERROR_GENERAL_BCAT_FAILURE); - return; - } - } - - progress.FinishDownload(ResultSuccess); -} - -bool Boxcat::Synchronize(TitleIDVersion title, ProgressServiceBackend& progress) { - is_syncing.exchange(true); - - std::thread([this, title, &progress] { - SynchronizeInternal(applet_manager, dir_getter, title, progress); - }).detach(); - - return true; -} - -bool Boxcat::SynchronizeDirectory(TitleIDVersion title, std::string name, - ProgressServiceBackend& progress) { - is_syncing.exchange(true); - - std::thread([this, title, name, &progress] { - SynchronizeInternal(applet_manager, dir_getter, title, progress, name); - }).detach(); - - return true; -} - -bool Boxcat::Clear(u64 title_id) { - if (Settings::values.bcat_boxcat_local) { - LOG_INFO(Service_BCAT, "Boxcat using local data by override, skipping clear."); - return true; - } - - const auto dir = dir_getter(title_id); - - std::vector<std::string> dirnames; - - for (const auto& subdir : dir->GetSubdirectories()) - dirnames.push_back(subdir->GetName()); - - for (const auto& subdir : dirnames) { - if (!dir->DeleteSubdirectoryRecursive(subdir)) - return false; - } - - return true; -} - -void Boxcat::SetPassphrase(u64 title_id, const Passphrase& passphrase) { - LOG_DEBUG(Service_BCAT, "called, title_id={:016X}, passphrase={}", title_id, - Common::HexToString(passphrase)); -} - -std::optional<std::vector<u8>> Boxcat::GetLaunchParameter(TitleIDVersion title) { - const auto bin_file_path = GetBINFilePath(title.title_id); - - if (Settings::values.bcat_boxcat_local) { - LOG_INFO(Service_BCAT, "Boxcat using local data by override, skipping download."); - } else { - Client launch_client{bin_file_path, title.title_id, title.build_id}; - - const auto res = launch_client.DownloadLaunchParam(); - if (res != DownloadResult::Success) { - LOG_ERROR(Service_BCAT, "Boxcat synchronization failed with error '{}'!", res); - - if (res == DownloadResult::NoMatchBuildId || res == DownloadResult::NoMatchTitleId) { - Common::FS::RemoveFile(bin_file_path); - } - - HandleDownloadDisplayResult(applet_manager, res); - return std::nullopt; - } - } - - Common::FS::IOFile bin{bin_file_path, Common::FS::FileAccessMode::Read, - Common::FS::FileType::BinaryFile}; - const auto size = bin.GetSize(); - std::vector<u8> bytes(size); - if (!bin.IsOpen() || size == 0 || bin.Read(bytes) != bytes.size()) { - LOG_ERROR(Service_BCAT, "Boxcat failed to read launch parameter binary at path '{}'!", - Common::FS::PathToUTF8String(bin_file_path)); - return std::nullopt; - } - - return bytes; -} - -Boxcat::StatusResult Boxcat::GetStatus(std::optional<std::string>& global, - std::map<std::string, EventStatus>& games) { - httplib::SSLClient client{BOXCAT_HOSTNAME, static_cast<int>(PORT)}; - client.set_connection_timeout(static_cast<int>(TIMEOUT_SECONDS)); - client.set_read_timeout(static_cast<int>(TIMEOUT_SECONDS)); - client.set_write_timeout(static_cast<int>(TIMEOUT_SECONDS)); - - httplib::Headers headers{ - {std::string("Game-Assets-API-Version"), std::string(BOXCAT_API_VERSION)}, - {std::string("Boxcat-Client-Type"), std::string(BOXCAT_CLIENT_TYPE)}, - }; - - if (!client.is_valid()) { - LOG_ERROR(Service_BCAT, "Client is invalid, going offline!"); - return StatusResult::Offline; - } - - if (!client.is_socket_open()) { - LOG_ERROR(Service_BCAT, "Failed to open socket, going offline!"); - return StatusResult::Offline; - } - - const auto response = client.Get(BOXCAT_PATHNAME_EVENTS, headers); - if (response == nullptr) - return StatusResult::Offline; - - if (response->status == static_cast<int>(ResponseStatus::BadClientVersion)) - return StatusResult::BadClientVersion; - - try { - nlohmann::json json = nlohmann::json::parse(response->body); - - if (!json["online"].get<bool>()) - return StatusResult::Offline; - - if (json["global"].is_null()) - global = std::nullopt; - else - global = json["global"].get<std::string>(); - - if (json["games"].is_array()) { - for (const auto& object : json["games"]) { - if (object.is_object() && object.find("name") != object.end()) { - EventStatus detail{}; - if (object["header"].is_string()) { - detail.header = object["header"].get<std::string>(); - } else { - detail.header = std::nullopt; - } - - if (object["footer"].is_string()) { - detail.footer = object["footer"].get<std::string>(); - } else { - detail.footer = std::nullopt; - } - - if (object["events"].is_array()) { - for (const auto& event : object["events"]) { - if (!event.is_string()) - continue; - detail.events.push_back(event.get<std::string>()); - } - } - - games.insert_or_assign(object["name"], std::move(detail)); - } - } - } - - return StatusResult::Success; - } catch (const nlohmann::json::parse_error& error) { - LOG_ERROR(Service_BCAT, "{}", error.what()); - return StatusResult::ParseError; - } -} - -} // namespace Service::BCAT diff --git a/src/core/hle/service/bcat/backend/boxcat.h b/src/core/hle/service/bcat/backend/boxcat.h deleted file mode 100644 index d65b42e58..000000000 --- a/src/core/hle/service/bcat/backend/boxcat.h +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2019 yuzu emulator team -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -#pragma once - -#include <atomic> -#include <map> -#include <optional> -#include "core/hle/service/bcat/backend/backend.h" - -namespace Service::AM::Applets { -class AppletManager; -} - -namespace Service::BCAT { - -struct EventStatus { - std::optional<std::string> header; - std::optional<std::string> footer; - std::vector<std::string> events; -}; - -/// Boxcat is yuzu's custom backend implementation of Nintendo's BCAT service. It is free to use and -/// doesn't require a switch or nintendo account. The content is controlled by the yuzu team. -class Boxcat final : public Backend { - friend void SynchronizeInternal(AM::Applets::AppletManager& applet_manager, - DirectoryGetter dir_getter, TitleIDVersion title, - ProgressServiceBackend& progress, - std::optional<std::string> dir_name); - -public: - explicit Boxcat(AM::Applets::AppletManager& applet_manager_, DirectoryGetter getter); - ~Boxcat() override; - - bool Synchronize(TitleIDVersion title, ProgressServiceBackend& progress) override; - bool SynchronizeDirectory(TitleIDVersion title, std::string name, - ProgressServiceBackend& progress) override; - - bool Clear(u64 title_id) override; - - void SetPassphrase(u64 title_id, const Passphrase& passphrase) override; - - std::optional<std::vector<u8>> GetLaunchParameter(TitleIDVersion title) override; - - enum class StatusResult { - Success, - Offline, - ParseError, - BadClientVersion, - }; - - static StatusResult GetStatus(std::optional<std::string>& global, - std::map<std::string, EventStatus>& games); - -private: - std::atomic_bool is_syncing{false}; - - class Client; - std::unique_ptr<Client> client; - AM::Applets::AppletManager& applet_manager; -}; - -} // namespace Service::BCAT diff --git a/src/core/hle/service/bcat/bcat_module.cpp b/src/core/hle/service/bcat/bcat_module.cpp index 72294eb2e..27e9b8df8 100644 --- a/src/core/hle/service/bcat/bcat_module.cpp +++ b/src/core/hle/service/bcat/bcat_module.cpp @@ -4,7 +4,6 @@ #include <cctype> #include <mbedtls/md5.h> -#include "backend/boxcat.h" #include "common/hex_util.h" #include "common/logging/log.h" #include "common/settings.h" @@ -128,8 +127,8 @@ public: explicit IBcatService(Core::System& system_, Backend& backend_) : ServiceFramework{system_, "IBcatService"}, backend{backend_}, progress{{ - ProgressServiceBackend{system_.Kernel(), "Normal"}, - ProgressServiceBackend{system_.Kernel(), "Directory"}, + ProgressServiceBackend{system_, "Normal"}, + ProgressServiceBackend{system_, "Directory"}, }} { // clang-format off static const FunctionInfo functions[] = { @@ -578,12 +577,6 @@ void Module::Interface::CreateDeliveryCacheStorageServiceWithApplicationId( std::unique_ptr<Backend> CreateBackendFromSettings([[maybe_unused]] Core::System& system, DirectoryGetter getter) { -#ifdef YUZU_ENABLE_BOXCAT - if (Settings::values.bcat_backend.GetValue() == "boxcat") { - return std::make_unique<Boxcat>(system.GetAppletManager(), std::move(getter)); - } -#endif - return std::make_unique<NullBackend>(std::move(getter)); } diff --git a/src/core/hle/service/btdrv/btdrv.cpp b/src/core/hle/service/btdrv/btdrv.cpp index acf791de2..ecd3bd22a 100644 --- a/src/core/hle/service/btdrv/btdrv.cpp +++ b/src/core/hle/service/btdrv/btdrv.cpp @@ -7,9 +7,9 @@ #include "core/hle/ipc_helpers.h" #include "core/hle/kernel/hle_ipc.h" #include "core/hle/kernel/k_event.h" -#include "core/hle/kernel/k_readable_event.h" #include "core/hle/kernel/kernel.h" #include "core/hle/service/btdrv/btdrv.h" +#include "core/hle/service/kernel_helpers.h" #include "core/hle/service/service.h" #include "core/hle/service/sm/sm.h" @@ -18,7 +18,7 @@ namespace Service::BtDrv { class Bt final : public ServiceFramework<Bt> { public: explicit Bt(Core::System& system_) - : ServiceFramework{system_, "bt"}, register_event{system.Kernel()} { + : ServiceFramework{system_, "bt"}, service_context{system_, "bt"} { // clang-format off static const FunctionInfo functions[] = { {0, nullptr, "LeClientReadCharacteristic"}, @@ -35,8 +35,11 @@ public: // clang-format on RegisterHandlers(functions); - Kernel::KAutoObject::Create(std::addressof(register_event)); - register_event.Initialize("BT:RegisterEvent"); + register_event = service_context.CreateEvent("BT:RegisterEvent"); + } + + ~Bt() override { + service_context.CloseEvent(register_event); } private: @@ -45,10 +48,12 @@ private: IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(register_event.GetReadableEvent()); + rb.PushCopyObjects(register_event->GetReadableEvent()); } - Kernel::KEvent register_event; + KernelHelpers::ServiceContext service_context; + + Kernel::KEvent* register_event; }; class BtDrv final : public ServiceFramework<BtDrv> { diff --git a/src/core/hle/service/btm/btm.cpp b/src/core/hle/service/btm/btm.cpp index 3ab29036a..780a99c2d 100644 --- a/src/core/hle/service/btm/btm.cpp +++ b/src/core/hle/service/btm/btm.cpp @@ -9,9 +9,9 @@ #include "core/hle/ipc_helpers.h" #include "core/hle/kernel/hle_ipc.h" #include "core/hle/kernel/k_event.h" -#include "core/hle/kernel/k_readable_event.h" #include "core/hle/kernel/kernel.h" #include "core/hle/service/btm/btm.h" +#include "core/hle/service/kernel_helpers.h" #include "core/hle/service/service.h" namespace Service::BTM { @@ -19,9 +19,7 @@ namespace Service::BTM { class IBtmUserCore final : public ServiceFramework<IBtmUserCore> { public: explicit IBtmUserCore(Core::System& system_) - : ServiceFramework{system_, "IBtmUserCore"}, scan_event{system.Kernel()}, - connection_event{system.Kernel()}, service_discovery{system.Kernel()}, - config_event{system.Kernel()} { + : ServiceFramework{system_, "IBtmUserCore"}, service_context{system_, "IBtmUserCore"} { // clang-format off static const FunctionInfo functions[] = { {0, &IBtmUserCore::AcquireBleScanEvent, "AcquireBleScanEvent"}, @@ -60,15 +58,17 @@ public: // clang-format on RegisterHandlers(functions); - Kernel::KAutoObject::Create(std::addressof(scan_event)); - Kernel::KAutoObject::Create(std::addressof(connection_event)); - Kernel::KAutoObject::Create(std::addressof(service_discovery)); - Kernel::KAutoObject::Create(std::addressof(config_event)); + scan_event = service_context.CreateEvent("IBtmUserCore:ScanEvent"); + connection_event = service_context.CreateEvent("IBtmUserCore:ConnectionEvent"); + service_discovery_event = service_context.CreateEvent("IBtmUserCore:DiscoveryEvent"); + config_event = service_context.CreateEvent("IBtmUserCore:ConfigEvent"); + } - scan_event.Initialize("IBtmUserCore:ScanEvent"); - connection_event.Initialize("IBtmUserCore:ConnectionEvent"); - service_discovery.Initialize("IBtmUserCore:Discovery"); - config_event.Initialize("IBtmUserCore:ConfigEvent"); + ~IBtmUserCore() override { + service_context.CloseEvent(scan_event); + service_context.CloseEvent(connection_event); + service_context.CloseEvent(service_discovery_event); + service_context.CloseEvent(config_event); } private: @@ -77,7 +77,7 @@ private: IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(scan_event.GetReadableEvent()); + rb.PushCopyObjects(scan_event->GetReadableEvent()); } void AcquireBleConnectionEvent(Kernel::HLERequestContext& ctx) { @@ -85,7 +85,7 @@ private: IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(connection_event.GetReadableEvent()); + rb.PushCopyObjects(connection_event->GetReadableEvent()); } void AcquireBleServiceDiscoveryEvent(Kernel::HLERequestContext& ctx) { @@ -93,7 +93,7 @@ private: IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(service_discovery.GetReadableEvent()); + rb.PushCopyObjects(service_discovery_event->GetReadableEvent()); } void AcquireBleMtuConfigEvent(Kernel::HLERequestContext& ctx) { @@ -101,13 +101,15 @@ private: IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(config_event.GetReadableEvent()); + rb.PushCopyObjects(config_event->GetReadableEvent()); } - Kernel::KEvent scan_event; - Kernel::KEvent connection_event; - Kernel::KEvent service_discovery; - Kernel::KEvent config_event; + KernelHelpers::ServiceContext service_context; + + Kernel::KEvent* scan_event; + Kernel::KEvent* connection_event; + Kernel::KEvent* service_discovery_event; + Kernel::KEvent* config_event; }; class BTM_USR final : public ServiceFramework<BTM_USR> { diff --git a/src/core/hle/service/friend/friend.cpp b/src/core/hle/service/friend/friend.cpp index b58c152ce..68c9240ae 100644 --- a/src/core/hle/service/friend/friend.cpp +++ b/src/core/hle/service/friend/friend.cpp @@ -8,11 +8,10 @@ #include "core/core.h" #include "core/hle/ipc_helpers.h" #include "core/hle/kernel/k_event.h" -#include "core/hle/kernel/k_readable_event.h" -#include "core/hle/kernel/k_writable_event.h" #include "core/hle/service/friend/errors.h" #include "core/hle/service/friend/friend.h" #include "core/hle/service/friend/friend_interface.h" +#include "core/hle/service/kernel_helpers.h" namespace Service::Friend { @@ -184,9 +183,9 @@ private: class INotificationService final : public ServiceFramework<INotificationService> { public: - explicit INotificationService(Common::UUID uuid_, Core::System& system_) - : ServiceFramework{system_, "INotificationService"}, uuid{uuid_}, notification_event{ - system.Kernel()} { + explicit INotificationService(Core::System& system_, Common::UUID uuid_) + : ServiceFramework{system_, "INotificationService"}, uuid{uuid_}, + service_context{system_, "INotificationService"} { // clang-format off static const FunctionInfo functions[] = { {0, &INotificationService::GetEvent, "GetEvent"}, @@ -197,8 +196,11 @@ public: RegisterHandlers(functions); - Kernel::KAutoObject::Create(std::addressof(notification_event)); - notification_event.Initialize("INotificationService:NotifyEvent"); + notification_event = service_context.CreateEvent("INotificationService:NotifyEvent"); + } + + ~INotificationService() override { + service_context.CloseEvent(notification_event); } private: @@ -207,7 +209,7 @@ private: IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(notification_event.GetReadableEvent()); + rb.PushCopyObjects(notification_event->GetReadableEvent()); } void Clear(Kernel::HLERequestContext& ctx) { @@ -272,8 +274,10 @@ private: bool has_received_friend_request; }; - Common::UUID uuid{Common::INVALID_UUID}; - Kernel::KEvent notification_event; + Common::UUID uuid; + KernelHelpers::ServiceContext service_context; + + Kernel::KEvent* notification_event; std::queue<SizedNotificationInfo> notifications; States states{}; }; @@ -293,7 +297,7 @@ void Module::Interface::CreateNotificationService(Kernel::HLERequestContext& ctx IPC::ResponseBuilder rb{ctx, 2, 0, 1}; rb.Push(ResultSuccess); - rb.PushIpcInterface<INotificationService>(uuid, system); + rb.PushIpcInterface<INotificationService>(system, uuid); } Module::Interface::Interface(std::shared_ptr<Module> module_, Core::System& system_, diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index c930996ab..8c363142c 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp @@ -106,7 +106,7 @@ void IAppletResource::DeactivateController(HidController controller) { controllers[static_cast<size_t>(controller)]->DeactivateController(); } -IAppletResource ::~IAppletResource() { +IAppletResource::~IAppletResource() { system.CoreTiming().UnscheduleEvent(pad_update_event, 0); system.CoreTiming().UnscheduleEvent(motion_update_event, 0); } diff --git a/src/core/hle/service/lbl/lbl.cpp b/src/core/hle/service/lbl/lbl.cpp index 24890c830..37ff37277 100644 --- a/src/core/hle/service/lbl/lbl.cpp +++ b/src/core/hle/service/lbl/lbl.cpp @@ -2,6 +2,7 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include <cmath> #include <memory> #include "common/logging/log.h" diff --git a/src/core/hle/service/nfp/nfp.cpp b/src/core/hle/service/nfp/nfp.cpp index 5f1ca029d..6791f20a5 100644 --- a/src/core/hle/service/nfp/nfp.cpp +++ b/src/core/hle/service/nfp/nfp.cpp @@ -8,9 +8,8 @@ #include "common/logging/log.h" #include "core/core.h" #include "core/hle/ipc_helpers.h" -#include "core/hle/kernel/k_readable_event.h" +#include "core/hle/kernel/k_event.h" #include "core/hle/kernel/k_thread.h" -#include "core/hle/kernel/k_writable_event.h" #include "core/hle/kernel/kernel.h" #include "core/hle/lock.h" #include "core/hle/service/nfp/nfp.h" @@ -23,18 +22,21 @@ constexpr ResultCode ERR_NO_APPLICATION_AREA(ErrorModule::NFP, 152); Module::Interface::Interface(std::shared_ptr<Module> module_, Core::System& system_, const char* name) - : ServiceFramework{system_, name}, nfc_tag_load{system.Kernel()}, module{std::move(module_)} { - Kernel::KAutoObject::Create(std::addressof(nfc_tag_load)); - nfc_tag_load.Initialize("IUser:NFCTagDetected"); + : ServiceFramework{system_, name}, module{std::move(module_)}, service_context{system_, + "NFP::IUser"} { + nfc_tag_load = service_context.CreateEvent("NFP::IUser:NFCTagDetected"); } -Module::Interface::~Interface() = default; +Module::Interface::~Interface() { + service_context.CloseEvent(nfc_tag_load); +} class IUser final : public ServiceFramework<IUser> { public: - explicit IUser(Module::Interface& nfp_interface_, Core::System& system_) + explicit IUser(Module::Interface& nfp_interface_, Core::System& system_, + KernelHelpers::ServiceContext& service_context_) : ServiceFramework{system_, "NFP::IUser"}, nfp_interface{nfp_interface_}, - deactivate_event{system.Kernel()}, availability_change_event{system.Kernel()} { + service_context{service_context_} { static const FunctionInfo functions[] = { {0, &IUser::Initialize, "Initialize"}, {1, &IUser::Finalize, "Finalize"}, @@ -64,11 +66,14 @@ public: }; RegisterHandlers(functions); - Kernel::KAutoObject::Create(std::addressof(deactivate_event)); - Kernel::KAutoObject::Create(std::addressof(availability_change_event)); + deactivate_event = service_context.CreateEvent("NFP::IUser:DeactivateEvent"); + availability_change_event = + service_context.CreateEvent("NFP::IUser:AvailabilityChangeEvent"); + } - deactivate_event.Initialize("IUser:DeactivateEvent"); - availability_change_event.Initialize("IUser:AvailabilityChangeEvent"); + ~IUser() override { + service_context.CloseEvent(deactivate_event); + service_context.CloseEvent(availability_change_event); } private: @@ -166,7 +171,7 @@ private: IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(deactivate_event.GetReadableEvent()); + rb.PushCopyObjects(deactivate_event->GetReadableEvent()); } void StopDetection(Kernel::HLERequestContext& ctx) { @@ -175,7 +180,7 @@ private: switch (device_state) { case DeviceState::TagFound: case DeviceState::TagNearby: - deactivate_event.GetWritableEvent().Signal(); + deactivate_event->GetWritableEvent().Signal(); device_state = DeviceState::Initialized; break; case DeviceState::SearchingForTag: @@ -264,7 +269,7 @@ private: IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(availability_change_event.GetReadableEvent()); + rb.PushCopyObjects(availability_change_event->GetReadableEvent()); } void GetRegisterInfo(Kernel::HLERequestContext& ctx) { @@ -313,14 +318,16 @@ private: rb.PushRaw<u32>(0); // This is from the GetCommonInfo stub } + Module::Interface& nfp_interface; + KernelHelpers::ServiceContext& service_context; + bool has_attached_handle{}; const u64 device_handle{0}; // Npad device 1 const u32 npad_id{0}; // Player 1 controller State state{State::NonInitialized}; DeviceState device_state{DeviceState::Initialized}; - Module::Interface& nfp_interface; - Kernel::KEvent deactivate_event; - Kernel::KEvent availability_change_event; + Kernel::KEvent* deactivate_event; + Kernel::KEvent* availability_change_event; }; void Module::Interface::CreateUserInterface(Kernel::HLERequestContext& ctx) { @@ -328,7 +335,7 @@ void Module::Interface::CreateUserInterface(Kernel::HLERequestContext& ctx) { IPC::ResponseBuilder rb{ctx, 2, 0, 1}; rb.Push(ResultSuccess); - rb.PushIpcInterface<IUser>(*this, system); + rb.PushIpcInterface<IUser>(*this, system, service_context); } bool Module::Interface::LoadAmiibo(const std::vector<u8>& buffer) { @@ -338,12 +345,12 @@ bool Module::Interface::LoadAmiibo(const std::vector<u8>& buffer) { } std::memcpy(&amiibo, buffer.data(), sizeof(amiibo)); - nfc_tag_load.GetWritableEvent().Signal(); + nfc_tag_load->GetWritableEvent().Signal(); return true; } Kernel::KReadableEvent& Module::Interface::GetNFCEvent() { - return nfc_tag_load.GetReadableEvent(); + return nfc_tag_load->GetReadableEvent(); } const Module::Interface::AmiiboFile& Module::Interface::GetAmiiboBuffer() const { diff --git a/src/core/hle/service/nfp/nfp.h b/src/core/hle/service/nfp/nfp.h index 5e4e49bc6..95c127efb 100644 --- a/src/core/hle/service/nfp/nfp.h +++ b/src/core/hle/service/nfp/nfp.h @@ -7,7 +7,7 @@ #include <array> #include <vector> -#include "core/hle/kernel/k_event.h" +#include "core/hle/service/kernel_helpers.h" #include "core/hle/service/service.h" namespace Kernel { @@ -42,12 +42,13 @@ public: Kernel::KReadableEvent& GetNFCEvent(); const AmiiboFile& GetAmiiboBuffer() const; - private: - Kernel::KEvent nfc_tag_load; - AmiiboFile amiibo{}; - protected: std::shared_ptr<Module> module; + + private: + KernelHelpers::ServiceContext service_context; + Kernel::KEvent* nfc_tag_load; + AmiiboFile amiibo{}; }; }; diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp index 9decb9290..f13dc8b0d 100644 --- a/src/core/hle/service/nifm/nifm.cpp +++ b/src/core/hle/service/nifm/nifm.cpp @@ -6,10 +6,21 @@ #include "core/core.h" #include "core/hle/ipc_helpers.h" #include "core/hle/kernel/k_event.h" -#include "core/hle/kernel/k_readable_event.h" #include "core/hle/kernel/kernel.h" +#include "core/hle/service/kernel_helpers.h" #include "core/hle/service/nifm/nifm.h" #include "core/hle/service/service.h" + +namespace { + +// Avoids name conflict with Windows' CreateEvent macro. +[[nodiscard]] Kernel::KEvent* CreateKEvent(Service::KernelHelpers::ServiceContext& service_context, + std::string&& name) { + return service_context.CreateEvent(std::move(name)); +} + +} // Anonymous namespace + #include "core/network/network.h" #include "core/network/network_interface.h" @@ -129,7 +140,7 @@ public: class IRequest final : public ServiceFramework<IRequest> { public: explicit IRequest(Core::System& system_) - : ServiceFramework{system_, "IRequest"}, event1{system.Kernel()}, event2{system.Kernel()} { + : ServiceFramework{system_, "IRequest"}, service_context{system_, "IRequest"} { static const FunctionInfo functions[] = { {0, &IRequest::GetRequestState, "GetRequestState"}, {1, &IRequest::GetResult, "GetResult"}, @@ -159,11 +170,13 @@ public: }; RegisterHandlers(functions); - Kernel::KAutoObject::Create(std::addressof(event1)); - Kernel::KAutoObject::Create(std::addressof(event2)); + event1 = CreateKEvent(service_context, "IRequest:Event1"); + event2 = CreateKEvent(service_context, "IRequest:Event2"); + } - event1.Initialize("IRequest:Event1"); - event2.Initialize("IRequest:Event2"); + ~IRequest() override { + service_context.CloseEvent(event1); + service_context.CloseEvent(event2); } private: @@ -199,7 +212,7 @@ private: IPC::ResponseBuilder rb{ctx, 2, 2}; rb.Push(ResultSuccess); - rb.PushCopyObjects(event1.GetReadableEvent(), event2.GetReadableEvent()); + rb.PushCopyObjects(event1->GetReadableEvent(), event2->GetReadableEvent()); } void Cancel(Kernel::HLERequestContext& ctx) { @@ -230,7 +243,10 @@ private: rb.Push<u32>(0); } - Kernel::KEvent event1, event2; + KernelHelpers::ServiceContext service_context; + + Kernel::KEvent* event1; + Kernel::KEvent* event2; }; class INetworkProfile final : public ServiceFramework<INetworkProfile> { diff --git a/src/core/hle/service/nim/nim.cpp b/src/core/hle/service/nim/nim.cpp index 7447cc38f..30fb060b8 100644 --- a/src/core/hle/service/nim/nim.cpp +++ b/src/core/hle/service/nim/nim.cpp @@ -7,9 +7,8 @@ #include "core/core.h" #include "core/hle/ipc_helpers.h" #include "core/hle/kernel/k_event.h" -#include "core/hle/kernel/k_readable_event.h" -#include "core/hle/kernel/k_writable_event.h" #include "core/hle/kernel/kernel.h" +#include "core/hle/service/kernel_helpers.h" #include "core/hle/service/nim/nim.h" #include "core/hle/service/service.h" #include "core/hle/service/sm/sm.h" @@ -301,7 +300,7 @@ class IEnsureNetworkClockAvailabilityService final public: explicit IEnsureNetworkClockAvailabilityService(Core::System& system_) : ServiceFramework{system_, "IEnsureNetworkClockAvailabilityService"}, - finished_event{system.Kernel()} { + service_context{system_, "IEnsureNetworkClockAvailabilityService"} { static const FunctionInfo functions[] = { {0, &IEnsureNetworkClockAvailabilityService::StartTask, "StartTask"}, {1, &IEnsureNetworkClockAvailabilityService::GetFinishNotificationEvent, @@ -313,17 +312,19 @@ public: }; RegisterHandlers(functions); - Kernel::KAutoObject::Create(std::addressof(finished_event)); - finished_event.Initialize("IEnsureNetworkClockAvailabilityService:FinishEvent"); + finished_event = + service_context.CreateEvent("IEnsureNetworkClockAvailabilityService:FinishEvent"); } -private: - Kernel::KEvent finished_event; + ~IEnsureNetworkClockAvailabilityService() override { + service_context.CloseEvent(finished_event); + } +private: void StartTask(Kernel::HLERequestContext& ctx) { // No need to connect to the internet, just finish the task straight away. LOG_DEBUG(Service_NIM, "called"); - finished_event.GetWritableEvent().Signal(); + finished_event->GetWritableEvent().Signal(); IPC::ResponseBuilder rb{ctx, 2}; rb.Push(ResultSuccess); } @@ -333,7 +334,7 @@ private: IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(finished_event.GetReadableEvent()); + rb.PushCopyObjects(finished_event->GetReadableEvent()); } void GetResult(Kernel::HLERequestContext& ctx) { @@ -345,7 +346,7 @@ private: void Cancel(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_NIM, "called"); - finished_event.GetWritableEvent().Clear(); + finished_event->GetWritableEvent().Clear(); IPC::ResponseBuilder rb{ctx, 2}; rb.Push(ResultSuccess); } @@ -368,6 +369,10 @@ private: rb.Push(ResultSuccess); rb.PushRaw<s64>(server_time); } + + KernelHelpers::ServiceContext service_context; + + Kernel::KEvent* finished_event; }; class NTC final : public ServiceFramework<NTC> { diff --git a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp index a33e47d0b..789000294 100644 --- a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp +++ b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp @@ -16,7 +16,7 @@ namespace Service::Nvidia::Devices { nvdisp_disp0::nvdisp_disp0(Core::System& system_, std::shared_ptr<nvmap> nvmap_dev_) : nvdevice{system_}, nvmap_dev{std::move(nvmap_dev_)} {} -nvdisp_disp0 ::~nvdisp_disp0() = default; +nvdisp_disp0::~nvdisp_disp0() = default; NvResult nvdisp_disp0::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, std::vector<u8>& output) { diff --git a/src/core/hle/service/ptm/psm.cpp b/src/core/hle/service/ptm/psm.cpp index d9897c5c5..22ff5269c 100644 --- a/src/core/hle/service/ptm/psm.cpp +++ b/src/core/hle/service/ptm/psm.cpp @@ -8,9 +8,8 @@ #include "core/core.h" #include "core/hle/ipc_helpers.h" #include "core/hle/kernel/k_event.h" -#include "core/hle/kernel/k_readable_event.h" -#include "core/hle/kernel/k_writable_event.h" #include "core/hle/kernel/kernel.h" +#include "core/hle/service/kernel_helpers.h" #include "core/hle/service/ptm/psm.h" #include "core/hle/service/service.h" #include "core/hle/service/sm/sm.h" @@ -20,7 +19,7 @@ namespace Service::PSM { class IPsmSession final : public ServiceFramework<IPsmSession> { public: explicit IPsmSession(Core::System& system_) - : ServiceFramework{system_, "IPsmSession"}, state_change_event{system.Kernel()} { + : ServiceFramework{system_, "IPsmSession"}, service_context{system_, "IPsmSession"} { // clang-format off static const FunctionInfo functions[] = { {0, &IPsmSession::BindStateChangeEvent, "BindStateChangeEvent"}, @@ -33,27 +32,28 @@ public: RegisterHandlers(functions); - Kernel::KAutoObject::Create(std::addressof(state_change_event)); - state_change_event.Initialize("IPsmSession::state_change_event"); + state_change_event = service_context.CreateEvent("IPsmSession::state_change_event"); } - ~IPsmSession() override = default; + ~IPsmSession() override { + service_context.CloseEvent(state_change_event); + } void SignalChargerTypeChanged() { if (should_signal && should_signal_charger_type) { - state_change_event.GetWritableEvent().Signal(); + state_change_event->GetWritableEvent().Signal(); } } void SignalPowerSupplyChanged() { if (should_signal && should_signal_power_supply) { - state_change_event.GetWritableEvent().Signal(); + state_change_event->GetWritableEvent().Signal(); } } void SignalBatteryVoltageStateChanged() { if (should_signal && should_signal_battery_voltage) { - state_change_event.GetWritableEvent().Signal(); + state_change_event->GetWritableEvent().Signal(); } } @@ -65,7 +65,7 @@ private: IPC::ResponseBuilder rb{ctx, 2, 1}; rb.Push(ResultSuccess); - rb.PushCopyObjects(state_change_event.GetReadableEvent()); + rb.PushCopyObjects(state_change_event->GetReadableEvent()); } void UnbindStateChangeEvent(Kernel::HLERequestContext& ctx) { @@ -110,11 +110,13 @@ private: rb.Push(ResultSuccess); } + KernelHelpers::ServiceContext service_context; + bool should_signal_charger_type{}; bool should_signal_power_supply{}; bool should_signal_battery_voltage{}; bool should_signal{}; - Kernel::KEvent state_change_event; + Kernel::KEvent* state_change_event; }; class PSM final : public ServiceFramework<PSM> { diff --git a/src/core/hle/service/time/standard_user_system_clock_core.cpp b/src/core/hle/service/time/standard_user_system_clock_core.cpp index ef79ab917..e94220a44 100644 --- a/src/core/hle/service/time/standard_user_system_clock_core.cpp +++ b/src/core/hle/service/time/standard_user_system_clock_core.cpp @@ -4,6 +4,7 @@ #include "common/assert.h" #include "core/core.h" +#include "core/hle/kernel/k_event.h" #include "core/hle/service/time/standard_local_system_clock_core.h" #include "core/hle/service/time/standard_network_system_clock_core.h" #include "core/hle/service/time/standard_user_system_clock_core.h" @@ -16,10 +17,15 @@ StandardUserSystemClockCore::StandardUserSystemClockCore( : SystemClockCore(local_system_clock_core_.GetSteadyClockCore()), local_system_clock_core{local_system_clock_core_}, network_system_clock_core{network_system_clock_core_}, - auto_correction_time{SteadyClockTimePoint::GetRandom()}, auto_correction_event{ - system_.Kernel()} { - Kernel::KAutoObject::Create(std::addressof(auto_correction_event)); - auto_correction_event.Initialize("StandardUserSystemClockCore:AutoCorrectionEvent"); + auto_correction_time{SteadyClockTimePoint::GetRandom()}, service_context{ + system_, + "StandardUserSystemClockCore"} { + auto_correction_event = + service_context.CreateEvent("StandardUserSystemClockCore:AutoCorrectionEvent"); +} + +StandardUserSystemClockCore::~StandardUserSystemClockCore() { + service_context.CloseEvent(auto_correction_event); } ResultCode StandardUserSystemClockCore::SetAutomaticCorrectionEnabled(Core::System& system, diff --git a/src/core/hle/service/time/standard_user_system_clock_core.h b/src/core/hle/service/time/standard_user_system_clock_core.h index bf9ec5e42..b7cb2b045 100644 --- a/src/core/hle/service/time/standard_user_system_clock_core.h +++ b/src/core/hle/service/time/standard_user_system_clock_core.h @@ -4,7 +4,7 @@ #pragma once -#include "core/hle/kernel/k_event.h" +#include "core/hle/service/kernel_helpers.h" #include "core/hle/service/time/clock_types.h" #include "core/hle/service/time/system_clock_core.h" @@ -27,6 +27,8 @@ public: StandardNetworkSystemClockCore& network_system_clock_core_, Core::System& system_); + ~StandardUserSystemClockCore() override; + ResultCode SetAutomaticCorrectionEnabled(Core::System& system, bool value); ResultCode GetClockContext(Core::System& system, SystemClockContext& ctx) const override; @@ -55,7 +57,8 @@ private: StandardNetworkSystemClockCore& network_system_clock_core; bool auto_correction_enabled{}; SteadyClockTimePoint auto_correction_time; - Kernel::KEvent auto_correction_event; + KernelHelpers::ServiceContext service_context; + Kernel::KEvent* auto_correction_event; }; } // namespace Service::Time::Clock diff --git a/src/core/hle/service/time/system_clock_context_update_callback.h b/src/core/hle/service/time/system_clock_context_update_callback.h index 797954958..6936397a5 100644 --- a/src/core/hle/service/time/system_clock_context_update_callback.h +++ b/src/core/hle/service/time/system_clock_context_update_callback.h @@ -4,6 +4,7 @@ #pragma once +#include <memory> #include <vector> #include "core/hle/service/time/clock_types.h" diff --git a/src/core/hle/service/time/system_clock_core.cpp b/src/core/hle/service/time/system_clock_core.cpp index bd334bbef..5c2354cdd 100644 --- a/src/core/hle/service/time/system_clock_core.cpp +++ b/src/core/hle/service/time/system_clock_core.cpp @@ -13,7 +13,7 @@ SystemClockCore::SystemClockCore(SteadyClockCore& steady_clock_core_) context.steady_time_point.clock_source_id = steady_clock_core.GetClockSourceId(); } -SystemClockCore ::~SystemClockCore() = default; +SystemClockCore::~SystemClockCore() = default; ResultCode SystemClockCore::GetCurrentTime(Core::System& system, s64& posix_time) const { posix_time = 0; diff --git a/src/core/hle/service/time/system_clock_core.h b/src/core/hle/service/time/system_clock_core.h index 83d0e5d62..b9237ad28 100644 --- a/src/core/hle/service/time/system_clock_core.h +++ b/src/core/hle/service/time/system_clock_core.h @@ -4,6 +4,8 @@ #pragma once +#include <memory> + #include "common/common_types.h" #include "core/hle/service/time/clock_types.h" diff --git a/src/core/hle/service/time/time_zone_service.cpp b/src/core/hle/service/time/time_zone_service.cpp index 5c3108768..3871e7316 100644 --- a/src/core/hle/service/time/time_zone_service.cpp +++ b/src/core/hle/service/time/time_zone_service.cpp @@ -10,8 +10,8 @@ namespace Service::Time { -ITimeZoneService ::ITimeZoneService(Core::System& system_, - TimeZone::TimeZoneContentManager& time_zone_manager_) +ITimeZoneService::ITimeZoneService(Core::System& system_, + TimeZone::TimeZoneContentManager& time_zone_manager_) : ServiceFramework{system_, "ITimeZoneService"}, time_zone_content_manager{time_zone_manager_} { static const FunctionInfo functions[] = { {0, &ITimeZoneService::GetDeviceLocationName, "GetDeviceLocationName"}, |