Browse Source
Merge pull request #7648 from bunnei/thread-pinning
Merge pull request #7648 from bunnei/thread-pinning
core: hle: kernel: Implement thread pinning.nce_cpp
committed by
GitHub
10 changed files with 140 additions and 14 deletions
-
2src/core/CMakeLists.txt
-
6src/core/hle/kernel/global_scheduler_context.cpp
-
34src/core/hle/kernel/k_interrupt_manager.cpp
-
17src/core/hle/kernel/k_interrupt_manager.h
-
12src/core/hle/kernel/k_process.cpp
-
4src/core/hle/kernel/k_process.h
-
8src/core/hle/kernel/k_scheduler.cpp
-
44src/core/hle/kernel/k_thread.cpp
-
6src/core/hle/kernel/k_thread.h
-
21src/core/hle/kernel/svc.cpp
@ -0,0 +1,34 @@ |
|||
// Copyright 2021 yuzu Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include "core/hle/kernel/k_interrupt_manager.h"
|
|||
#include "core/hle/kernel/k_process.h"
|
|||
#include "core/hle/kernel/k_scheduler.h"
|
|||
#include "core/hle/kernel/k_thread.h"
|
|||
#include "core/hle/kernel/kernel.h"
|
|||
|
|||
namespace Kernel::KInterruptManager { |
|||
|
|||
void HandleInterrupt(KernelCore& kernel, s32 core_id) { |
|||
auto* process = kernel.CurrentProcess(); |
|||
if (!process) { |
|||
return; |
|||
} |
|||
|
|||
auto& scheduler = kernel.Scheduler(core_id); |
|||
auto& current_thread = *scheduler.GetCurrentThread(); |
|||
|
|||
// If the user disable count is set, we may need to pin the current thread.
|
|||
if (current_thread.GetUserDisableCount() && !process->GetPinnedThread(core_id)) { |
|||
KScopedSchedulerLock sl{kernel}; |
|||
|
|||
// Pin the current thread.
|
|||
process->PinCurrentThread(core_id); |
|||
|
|||
// Set the interrupt flag for the thread.
|
|||
scheduler.GetCurrentThread()->SetInterruptFlag(); |
|||
} |
|||
} |
|||
|
|||
} // namespace Kernel::KInterruptManager
|
|||
@ -0,0 +1,17 @@ |
|||
// Copyright 2021 yuzu Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include "common/common_types.h" |
|||
|
|||
namespace Kernel { |
|||
|
|||
class KernelCore; |
|||
|
|||
namespace KInterruptManager { |
|||
void HandleInterrupt(KernelCore& kernel, s32 core_id); |
|||
} |
|||
|
|||
} // namespace Kernel |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue