ソースを参照

service: hid: Handle pending delete

Narr the Reg 2 年 前
コミット
edfbf363de

+ 1 - 0
src/hid_core/resource_manager.cpp

@@ -224,6 +224,7 @@ Result ResourceManager::RegisterAppletResourceUserId(u64 aruid, bool bool_value)
 void ResourceManager::UnregisterAppletResourceUserId(u64 aruid) {
     std::scoped_lock lock{shared_mutex};
     applet_resource->UnregisterAppletResourceUserId(aruid);
+    npad->UnregisterAppletResourceUserId(aruid);
 }
 
 Result ResourceManager::GetSharedMemoryHandle(Kernel::KSharedMemory** out_handle, u64 aruid) {

+ 14 - 20
src/hid_core/resources/applet_resource.cpp

@@ -87,7 +87,9 @@ Result AppletResource::RegisterAppletResourceUserId(u64 aruid, bool enable_input
             data_index = i;
             break;
         }
-        if (registration_list.flag[i] == RegistrationStatus::None) {
+        // TODO: Don't Handle pending delete here
+        if (registration_list.flag[i] == RegistrationStatus::None ||
+            registration_list.flag[i] == RegistrationStatus::PendingDelete) {
             data_index = i;
             break;
         }
@@ -104,30 +106,22 @@ Result AppletResource::RegisterAppletResourceUserId(u64 aruid, bool enable_input
 }
 
 void AppletResource::UnregisterAppletResourceUserId(u64 aruid) {
-    u64 index = GetIndexFromAruid(aruid);
+    const u64 index = GetIndexFromAruid(aruid);
 
-    if (index < AruidIndexMax) {
-        if (data[index].flag.is_assigned) {
-            data[index].shared_memory_format = nullptr;
-            data[index].flag.is_assigned.Assign(false);
-        }
+    if (index >= AruidIndexMax) {
+        return;
     }
 
-    index = GetIndexFromAruid(aruid);
-    if (index < AruidIndexMax) {
-        DestroySevenSixAxisTransferMemory();
-        data[index].flag.raw = 0;
-        data[index].aruid = 0;
+    FreeAppletResourceId(aruid);
+    DestroySevenSixAxisTransferMemory();
+    data[index].flag.raw = 0;
+    data[index].aruid = 0;
 
-        index = GetIndexFromAruid(aruid);
-        if (index < AruidIndexMax) {
-            registration_list.flag[index] = RegistrationStatus::PendingDelete;
-        }
-    }
+    registration_list.flag[index] = RegistrationStatus::PendingDelete;
 }
 
 void AppletResource::FreeAppletResourceId(u64 aruid) {
-    u64 index = GetIndexFromAruid(aruid);
+    const u64 index = GetIndexFromAruid(aruid);
     if (index >= AruidIndexMax) {
         return;
     }
@@ -144,7 +138,7 @@ u64 AppletResource::GetActiveAruid() {
 }
 
 Result AppletResource::GetSharedMemoryHandle(Kernel::KSharedMemory** out_handle, u64 aruid) {
-    u64 index = GetIndexFromAruid(aruid);
+    const u64 index = GetIndexFromAruid(aruid);
     if (index >= AruidIndexMax) {
         return ResultAruidNotRegistered;
     }
@@ -155,7 +149,7 @@ Result AppletResource::GetSharedMemoryHandle(Kernel::KSharedMemory** out_handle,
 
 Result AppletResource::GetSharedMemoryFormat(SharedMemoryFormat** out_shared_memory_format,
                                              u64 aruid) {
-    u64 index = GetIndexFromAruid(aruid);
+    const u64 index = GetIndexFromAruid(aruid);
     if (index >= AruidIndexMax) {
         return ResultAruidNotRegistered;
     }

+ 3 - 1
src/hid_core/resources/npad/npad_resource.cpp

@@ -46,7 +46,9 @@ Result NPadResource::RegisterAppletResourceUserId(u64 aruid) {
             data_index = i;
             break;
         }
-        if (registration_list.flag[i] == RegistrationStatus::None) {
+        // TODO: Don't Handle pending delete here
+        if (registration_list.flag[i] == RegistrationStatus::None ||
+            registration_list.flag[i] == RegistrationStatus::PendingDelete) {
             data_index = i;
             break;
         }