|
|
@@ -228,12 +228,15 @@ void KProcess::PinCurrentThread() {
|
|
|
const s32 core_id = GetCurrentCoreId(kernel);
|
|
|
KThread* cur_thread = GetCurrentThreadPointer(kernel);
|
|
|
|
|
|
- // Pin it.
|
|
|
- PinThread(core_id, cur_thread);
|
|
|
- cur_thread->Pin();
|
|
|
+ // If the thread isn't terminated, pin it.
|
|
|
+ if (!cur_thread->IsTerminationRequested()) {
|
|
|
+ // Pin it.
|
|
|
+ PinThread(core_id, cur_thread);
|
|
|
+ cur_thread->Pin();
|
|
|
|
|
|
- // An update is needed.
|
|
|
- KScheduler::SetSchedulerUpdateNeeded(kernel);
|
|
|
+ // An update is needed.
|
|
|
+ KScheduler::SetSchedulerUpdateNeeded(kernel);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
void KProcess::UnpinCurrentThread() {
|
|
|
@@ -251,6 +254,20 @@ void KProcess::UnpinCurrentThread() {
|
|
|
KScheduler::SetSchedulerUpdateNeeded(kernel);
|
|
|
}
|
|
|
|
|
|
+void KProcess::UnpinThread(KThread* thread) {
|
|
|
+ ASSERT(kernel.GlobalSchedulerContext().IsLocked());
|
|
|
+
|
|
|
+ // Get the thread's core id.
|
|
|
+ const auto core_id = thread->GetActiveCore();
|
|
|
+
|
|
|
+ // Unpin it.
|
|
|
+ UnpinThread(core_id, thread);
|
|
|
+ thread->Unpin();
|
|
|
+
|
|
|
+ // An update is needed.
|
|
|
+ KScheduler::SetSchedulerUpdateNeeded(kernel);
|
|
|
+}
|
|
|
+
|
|
|
ResultCode KProcess::AddSharedMemory(KSharedMemory* shmem, [[maybe_unused]] VAddr address,
|
|
|
[[maybe_unused]] size_t size) {
|
|
|
// Lock ourselves, to prevent concurrent access.
|