Просмотр исходного кода

KThread: Send termination interrupt to all cores a thread has affinity to

KThread::RequestTerminate may run from a thread which is not the CurrentCore, and thus
masking this out is erroneous.
Merry 2 лет назад
Родитель
Сommit
0f7fc94111
1 измененных файлов с 4 добавлено и 4 удалено
  1. 4 4
      src/core/hle/kernel/k_thread.cpp

+ 4 - 4
src/core/hle/kernel/k_thread.cpp

@@ -1258,11 +1258,11 @@ ThreadState KThread::RequestTerminate() {
         // Change the thread's priority to be higher than any system thread's.
         this->IncreaseBasePriority(TerminatingThreadPriority);
 
-        // If the thread is runnable, send a termination interrupt to other cores.
+        // If the thread is runnable, send a termination interrupt to cores it may be running on.
         if (this->GetState() == ThreadState::Runnable) {
-            if (const u64 core_mask = m_physical_affinity_mask.GetAffinityMask() &
-                                      ~(1ULL << GetCurrentCoreId(m_kernel));
-                core_mask != 0) {
+            // NOTE: We do not mask the "current core", because this code may not actually be
+            //       executing from the thread representing the "current core".
+            if (const u64 core_mask = m_physical_affinity_mask.GetAffinityMask(); core_mask != 0) {
                 Kernel::KInterruptManager::SendInterProcessorInterrupt(m_kernel, core_mask);
             }
         }