hle: kernel: Reimplement KReadableEvent and KWritableEvent.
This commit is contained in:
		| @@ -13,6 +13,7 @@ | ||||
| #include "core/file_sys/registered_cache.h" | ||||
| #include "core/file_sys/savedata_factory.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" | ||||
| @@ -303,17 +304,18 @@ ISelfController::ISelfController(Core::System& system_, NVFlinger::NVFlinger& nv | ||||
|     RegisterHandlers(functions); | ||||
|  | ||||
|     auto& kernel = system.Kernel(); | ||||
|     launchable_event = | ||||
|         Kernel::KWritableEvent::CreateEventPair(kernel, "ISelfController:LaunchableEvent"); | ||||
|     launchable_event = Kernel::KEvent::Create(kernel, "ISelfController:LaunchableEvent"); | ||||
|     launchable_event->Initialize(); | ||||
|  | ||||
|     // 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 | ||||
|     // ISelfControllers. The event is signaled on creation, and on transition from suspended -> not | ||||
|     // suspended if the event has previously been created by a call to | ||||
|     // GetAccumulatedSuspendedTickChangedEvent. | ||||
|     accumulated_suspended_tick_changed_event = Kernel::KWritableEvent::CreateEventPair( | ||||
|         kernel, "ISelfController:AccumulatedSuspendedTickChangedEvent"); | ||||
|     accumulated_suspended_tick_changed_event.writable->Signal(); | ||||
|     accumulated_suspended_tick_changed_event = | ||||
|         Kernel::KEvent::Create(kernel, "ISelfController:AccumulatedSuspendedTickChangedEvent"); | ||||
|     accumulated_suspended_tick_changed_event->Initialize(); | ||||
|     accumulated_suspended_tick_changed_event->GetWritableEvent()->Signal(); | ||||
| } | ||||
|  | ||||
| ISelfController::~ISelfController() = default; | ||||
| @@ -372,11 +374,11 @@ void ISelfController::LeaveFatalSection(Kernel::HLERequestContext& ctx) { | ||||
| void ISelfController::GetLibraryAppletLaunchableEvent(Kernel::HLERequestContext& ctx) { | ||||
|     LOG_WARNING(Service_AM, "(STUBBED) called"); | ||||
|  | ||||
|     launchable_event.writable->Signal(); | ||||
|     launchable_event->GetWritableEvent()->Signal(); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|     rb.PushCopyObjects(launchable_event.readable); | ||||
|     rb.PushCopyObjects(launchable_event->GetReadableEvent()); | ||||
| } | ||||
|  | ||||
| void ISelfController::SetScreenShotPermission(Kernel::HLERequestContext& ctx) { | ||||
| @@ -555,41 +557,42 @@ void ISelfController::GetAccumulatedSuspendedTickChangedEvent(Kernel::HLERequest | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|     rb.PushCopyObjects(accumulated_suspended_tick_changed_event.readable); | ||||
|     rb.PushCopyObjects(accumulated_suspended_tick_changed_event->GetReadableEvent()); | ||||
| } | ||||
|  | ||||
| AppletMessageQueue::AppletMessageQueue(Kernel::KernelCore& kernel) { | ||||
|     on_new_message = | ||||
|         Kernel::KWritableEvent::CreateEventPair(kernel, "AMMessageQueue:OnMessageReceived"); | ||||
|     on_new_message = Kernel::KEvent::Create(kernel, "AMMessageQueue:OnMessageReceived"); | ||||
|     on_new_message->Initialize(); | ||||
|     on_operation_mode_changed = | ||||
|         Kernel::KWritableEvent::CreateEventPair(kernel, "AMMessageQueue:OperationModeChanged"); | ||||
|         Kernel::KEvent::Create(kernel, "AMMessageQueue:OperationModeChanged"); | ||||
|     on_operation_mode_changed->Initialize(); | ||||
| } | ||||
|  | ||||
| AppletMessageQueue::~AppletMessageQueue() = default; | ||||
|  | ||||
| const std::shared_ptr<Kernel::KReadableEvent>& AppletMessageQueue::GetMessageReceiveEvent() const { | ||||
|     return on_new_message.readable; | ||||
|     return on_new_message->GetReadableEvent(); | ||||
| } | ||||
|  | ||||
| const std::shared_ptr<Kernel::KReadableEvent>& AppletMessageQueue::GetOperationModeChangedEvent() | ||||
|     const { | ||||
|     return on_operation_mode_changed.readable; | ||||
|     return on_operation_mode_changed->GetReadableEvent(); | ||||
| } | ||||
|  | ||||
| void AppletMessageQueue::PushMessage(AppletMessage msg) { | ||||
|     messages.push(msg); | ||||
|     on_new_message.writable->Signal(); | ||||
|     on_new_message->GetWritableEvent()->Signal(); | ||||
| } | ||||
|  | ||||
| AppletMessageQueue::AppletMessage AppletMessageQueue::PopMessage() { | ||||
|     if (messages.empty()) { | ||||
|         on_new_message.writable->Clear(); | ||||
|         on_new_message->GetWritableEvent()->Clear(); | ||||
|         return AppletMessage::NoMessage; | ||||
|     } | ||||
|     auto msg = messages.front(); | ||||
|     messages.pop(); | ||||
|     if (messages.empty()) { | ||||
|         on_new_message.writable->Clear(); | ||||
|         on_new_message->GetWritableEvent()->Clear(); | ||||
|     } | ||||
|     return msg; | ||||
| } | ||||
| @@ -601,7 +604,7 @@ std::size_t AppletMessageQueue::GetMessageCount() const { | ||||
| void AppletMessageQueue::OperationModeChanged() { | ||||
|     PushMessage(AppletMessage::OperationModeChanged); | ||||
|     PushMessage(AppletMessage::PerformanceModeChanged); | ||||
|     on_operation_mode_changed.writable->Signal(); | ||||
|     on_operation_mode_changed->GetWritableEvent()->Signal(); | ||||
| } | ||||
|  | ||||
| void AppletMessageQueue::RequestExit() { | ||||
| @@ -1229,14 +1232,15 @@ IApplicationFunctions::IApplicationFunctions(Core::System& system_) | ||||
|     RegisterHandlers(functions); | ||||
|  | ||||
|     auto& kernel = system.Kernel(); | ||||
|     gpu_error_detected_event = Kernel::KWritableEvent::CreateEventPair( | ||||
|         kernel, "IApplicationFunctions:GpuErrorDetectedSystemEvent"); | ||||
|  | ||||
|     friend_invitation_storage_channel_event = Kernel::KWritableEvent::CreateEventPair( | ||||
|         kernel, "IApplicationFunctions:FriendInvitationStorageChannelEvent"); | ||||
|  | ||||
|     health_warning_disappeared_system_event = Kernel::WritableEvent::CreateEventPair( | ||||
|         kernel, "IApplicationFunctions:HealthWarningDisappearedSystemEvent"); | ||||
|     gpu_error_detected_event = | ||||
|         Kernel::KEvent::Create(kernel, "IApplicationFunctions:GpuErrorDetectedSystemEvent"); | ||||
|     gpu_error_detected_event->Initialize(); | ||||
|     friend_invitation_storage_channel_event = | ||||
|         Kernel::KEvent::Create(kernel, "IApplicationFunctions:FriendInvitationStorageChannelEvent"); | ||||
|     friend_invitation_storage_channel_event->Initialize(); | ||||
|     health_warning_disappeared_system_event = | ||||
|         Kernel::KEvent::Create(kernel, "IApplicationFunctions:HealthWarningDisappearedSystemEvent"); | ||||
|     health_warning_disappeared_system_event->Initialize(); | ||||
| } | ||||
|  | ||||
| IApplicationFunctions::~IApplicationFunctions() = default; | ||||
| @@ -1633,7 +1637,7 @@ void IApplicationFunctions::GetGpuErrorDetectedSystemEvent(Kernel::HLERequestCon | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|     rb.PushCopyObjects(gpu_error_detected_event.readable); | ||||
|     rb.PushCopyObjects(gpu_error_detected_event->GetReadableEvent()); | ||||
| } | ||||
|  | ||||
| void IApplicationFunctions::GetFriendInvitationStorageChannelEvent(Kernel::HLERequestContext& ctx) { | ||||
| @@ -1641,7 +1645,7 @@ void IApplicationFunctions::GetFriendInvitationStorageChannelEvent(Kernel::HLERe | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|     rb.PushCopyObjects(friend_invitation_storage_channel_event.readable); | ||||
|     rb.PushCopyObjects(friend_invitation_storage_channel_event->GetReadableEvent()); | ||||
| } | ||||
|  | ||||
| void IApplicationFunctions::TryPopFromFriendInvitationStorageChannel( | ||||
| @@ -1657,7 +1661,7 @@ void IApplicationFunctions::GetHealthWarningDisappearedSystemEvent(Kernel::HLERe | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|     rb.PushCopyObjects(health_warning_disappeared_system_event.readable); | ||||
|     rb.PushCopyObjects(health_warning_disappeared_system_event->GetReadableEvent()); | ||||
| } | ||||
|  | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager, NVFlinger::NVFlinger& nvflinger, | ||||
| @@ -1693,8 +1697,9 @@ IHomeMenuFunctions::IHomeMenuFunctions(Core::System& system_) | ||||
|  | ||||
|     RegisterHandlers(functions); | ||||
|  | ||||
|     pop_from_general_channel_event = Kernel::KWritableEvent::CreateEventPair( | ||||
|         system.Kernel(), "IHomeMenuFunctions:PopFromGeneralChannelEvent"); | ||||
|     pop_from_general_channel_event = | ||||
|         Kernel::KEvent::Create(system.Kernel(), "IHomeMenuFunctions:PopFromGeneralChannelEvent"); | ||||
|     pop_from_general_channel_event->Initialize(); | ||||
| } | ||||
|  | ||||
| IHomeMenuFunctions::~IHomeMenuFunctions() = default; | ||||
| @@ -1711,7 +1716,7 @@ void IHomeMenuFunctions::GetPopFromGeneralChannelEvent(Kernel::HLERequestContext | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 2, 1}; | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|     rb.PushCopyObjects(pop_from_general_channel_event.readable); | ||||
|     rb.PushCopyObjects(pop_from_general_channel_event->GetReadableEvent()); | ||||
| } | ||||
|  | ||||
| IGlobalStateController::IGlobalStateController(Core::System& system_) | ||||
|   | ||||
| @@ -7,11 +7,12 @@ | ||||
| #include <chrono> | ||||
| #include <memory> | ||||
| #include <queue> | ||||
| #include "core/hle/kernel/k_writable_event.h" | ||||
|  | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Kernel { | ||||
| class KernelCore; | ||||
| class KEvent; | ||||
| class TransferMemory; | ||||
| } // namespace Kernel | ||||
|  | ||||
| @@ -65,8 +66,8 @@ public: | ||||
|  | ||||
| private: | ||||
|     std::queue<AppletMessage> messages; | ||||
|     Kernel::EventPair on_new_message; | ||||
|     Kernel::EventPair on_operation_mode_changed; | ||||
|     std::shared_ptr<Kernel::KEvent> on_new_message; | ||||
|     std::shared_ptr<Kernel::KEvent> on_operation_mode_changed; | ||||
| }; | ||||
|  | ||||
| class IWindowController final : public ServiceFramework<IWindowController> { | ||||
| @@ -153,8 +154,8 @@ private: | ||||
|     }; | ||||
|  | ||||
|     NVFlinger::NVFlinger& nvflinger; | ||||
|     Kernel::EventPair launchable_event; | ||||
|     Kernel::EventPair accumulated_suspended_tick_changed_event; | ||||
|     std::shared_ptr<Kernel::KEvent> launchable_event; | ||||
|     std::shared_ptr<Kernel::KEvent> accumulated_suspended_tick_changed_event; | ||||
|  | ||||
|     u32 idle_time_detection_extension = 0; | ||||
|     u64 num_fatal_sections_entered = 0; | ||||
| @@ -295,9 +296,9 @@ private: | ||||
|     bool launch_popped_application_specific = false; | ||||
|     bool launch_popped_account_preselect = false; | ||||
|     s32 previous_program_index{-1}; | ||||
|     Kernel::EventPair gpu_error_detected_event; | ||||
|     Kernel::EventPair friend_invitation_storage_channel_event; | ||||
|     Kernel::EventPair health_warning_disappeared_system_event; | ||||
|     std::shared_ptr<Kernel::KEvent> gpu_error_detected_event; | ||||
|     std::shared_ptr<Kernel::KEvent> friend_invitation_storage_channel_event; | ||||
|     std::shared_ptr<Kernel::KEvent> health_warning_disappeared_system_event; | ||||
| }; | ||||
|  | ||||
| class IHomeMenuFunctions final : public ServiceFramework<IHomeMenuFunctions> { | ||||
| @@ -309,7 +310,7 @@ private: | ||||
|     void RequestToGetForeground(Kernel::HLERequestContext& ctx); | ||||
|     void GetPopFromGeneralChannelEvent(Kernel::HLERequestContext& ctx); | ||||
|  | ||||
|     Kernel::EventPair pop_from_general_channel_event; | ||||
|     std::shared_ptr<Kernel::KEvent> pop_from_general_channel_event; | ||||
| }; | ||||
|  | ||||
| class IGlobalStateController final : public ServiceFramework<IGlobalStateController> { | ||||
|   | ||||
| @@ -3,6 +3,7 @@ | ||||
| // Refer to the license.txt file included. | ||||
|  | ||||
| #include <cstring> | ||||
|  | ||||
| #include "common/assert.h" | ||||
| #include "core/core.h" | ||||
| #include "core/frontend/applets/controller.h" | ||||
| @@ -11,6 +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_event.h" | ||||
| #include "core/hle/kernel/k_readable_event.h" | ||||
| #include "core/hle/kernel/k_writable_event.h" | ||||
| #include "core/hle/kernel/server_session.h" | ||||
| @@ -27,11 +29,13 @@ namespace Service::AM::Applets { | ||||
|  | ||||
| AppletDataBroker::AppletDataBroker(Kernel::KernelCore& kernel) { | ||||
|     state_changed_event = | ||||
|         Kernel::KWritableEvent::CreateEventPair(kernel, "ILibraryAppletAccessor:StateChangedEvent"); | ||||
|     pop_out_data_event = | ||||
|         Kernel::KWritableEvent::CreateEventPair(kernel, "ILibraryAppletAccessor:PopDataOutEvent"); | ||||
|     pop_interactive_out_data_event = Kernel::KWritableEvent::CreateEventPair( | ||||
|         kernel, "ILibraryAppletAccessor:PopInteractiveDataOutEvent"); | ||||
|         Kernel::KEvent::Create(kernel, "ILibraryAppletAccessor:StateChangedEvent"); | ||||
|     state_changed_event->Initialize(); | ||||
|     pop_out_data_event = Kernel::KEvent::Create(kernel, "ILibraryAppletAccessor:PopDataOutEvent"); | ||||
|     pop_out_data_event->Initialize(); | ||||
|     pop_interactive_out_data_event = | ||||
|         Kernel::KEvent::Create(kernel, "ILibraryAppletAccessor:PopInteractiveDataOutEvent"); | ||||
|     pop_interactive_out_data_event->Initialize(); | ||||
| } | ||||
|  | ||||
| AppletDataBroker::~AppletDataBroker() = default; | ||||
| @@ -58,7 +62,7 @@ std::shared_ptr<IStorage> AppletDataBroker::PopNormalDataToGame() { | ||||
|  | ||||
|     auto out = std::move(out_channel.front()); | ||||
|     out_channel.pop_front(); | ||||
|     pop_out_data_event.writable->Clear(); | ||||
|     pop_out_data_event->GetWritableEvent()->Clear(); | ||||
|     return out; | ||||
| } | ||||
|  | ||||
| @@ -77,7 +81,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.writable->Clear(); | ||||
|     pop_interactive_out_data_event->GetWritableEvent()->Clear(); | ||||
|     return out; | ||||
| } | ||||
|  | ||||
| @@ -96,7 +100,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.writable->Signal(); | ||||
|     pop_out_data_event->GetWritableEvent()->Signal(); | ||||
| } | ||||
|  | ||||
| void AppletDataBroker::PushInteractiveDataFromGame(std::shared_ptr<IStorage>&& storage) { | ||||
| @@ -105,23 +109,23 @@ 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.writable->Signal(); | ||||
|     pop_interactive_out_data_event->GetWritableEvent()->Signal(); | ||||
| } | ||||
|  | ||||
| void AppletDataBroker::SignalStateChanged() const { | ||||
|     state_changed_event.writable->Signal(); | ||||
|     state_changed_event->GetWritableEvent()->Signal(); | ||||
| } | ||||
|  | ||||
| std::shared_ptr<Kernel::KReadableEvent> AppletDataBroker::GetNormalDataEvent() const { | ||||
|     return pop_out_data_event.readable; | ||||
|     return pop_out_data_event->GetReadableEvent(); | ||||
| } | ||||
|  | ||||
| std::shared_ptr<Kernel::KReadableEvent> AppletDataBroker::GetInteractiveDataEvent() const { | ||||
|     return pop_interactive_out_data_event.readable; | ||||
|     return pop_interactive_out_data_event->GetReadableEvent(); | ||||
| } | ||||
|  | ||||
| std::shared_ptr<Kernel::KReadableEvent> AppletDataBroker::GetStateChangedEvent() const { | ||||
|     return state_changed_event.readable; | ||||
|     return state_changed_event->GetReadableEvent(); | ||||
| } | ||||
|  | ||||
| Applet::Applet(Kernel::KernelCore& kernel_) : broker{kernel_} {} | ||||
|   | ||||
| @@ -6,8 +6,8 @@ | ||||
|  | ||||
| #include <memory> | ||||
| #include <queue> | ||||
|  | ||||
| #include "common/swap.h" | ||||
| #include "core/hle/kernel/k_writable_event.h" | ||||
| #include "core/hle/kernel/object.h" | ||||
|  | ||||
| union ResultCode; | ||||
| @@ -29,7 +29,9 @@ class WebBrowserApplet; | ||||
|  | ||||
| namespace Kernel { | ||||
| class KernelCore; | ||||
| } | ||||
| class KEvent; | ||||
| class KReadableEvent; | ||||
| } // namespace Kernel | ||||
|  | ||||
| namespace Service::AM { | ||||
|  | ||||
| @@ -106,13 +108,13 @@ private: | ||||
|     // PopInteractiveDataToGame and PushInteractiveDataFromApplet | ||||
|     std::deque<std::shared_ptr<IStorage>> out_interactive_channel; | ||||
|  | ||||
|     Kernel::EventPair state_changed_event; | ||||
|     std::shared_ptr<Kernel::KEvent> state_changed_event; | ||||
|  | ||||
|     // Signaled on PushNormalDataFromApplet | ||||
|     Kernel::EventPair pop_out_data_event; | ||||
|     std::shared_ptr<Kernel::KEvent> pop_out_data_event; | ||||
|  | ||||
|     // Signaled on PushInteractiveDataFromApplet | ||||
|     Kernel::EventPair pop_interactive_out_data_event; | ||||
|     std::shared_ptr<Kernel::KEvent> pop_interactive_out_data_event; | ||||
| }; | ||||
|  | ||||
| class Applet { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 bunnei
					bunnei