diff options
Diffstat (limited to 'src/core/hle/kernel/thread.cpp')
| -rw-r--r-- | src/core/hle/kernel/thread.cpp | 38 |
1 files changed, 18 insertions, 20 deletions
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index 8cb3593db..d9e610272 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/src/core/hle/kernel/thread.cpp | |||
| @@ -56,12 +56,6 @@ void Thread::Stop() { | |||
| 56 | SetStatus(ThreadStatus::Dead); | 56 | SetStatus(ThreadStatus::Dead); |
| 57 | Signal(); | 57 | Signal(); |
| 58 | 58 | ||
| 59 | // Clean up any dangling references in objects that this thread was waiting for | ||
| 60 | for (auto& wait_object : wait_objects) { | ||
| 61 | wait_object->RemoveWaitingThread(SharedFrom(this)); | ||
| 62 | } | ||
| 63 | wait_objects.clear(); | ||
| 64 | |||
| 65 | owner_process->UnregisterThread(this); | 59 | owner_process->UnregisterThread(this); |
| 66 | 60 | ||
| 67 | // Mark the TLS slot in the thread's page as free. | 61 | // Mark the TLS slot in the thread's page as free. |
| @@ -138,6 +132,12 @@ void Thread::OnWakeUp() { | |||
| 138 | SetStatus(ThreadStatus::Ready); | 132 | SetStatus(ThreadStatus::Ready); |
| 139 | } | 133 | } |
| 140 | 134 | ||
| 135 | ResultCode Thread::Start() { | ||
| 136 | SchedulerLock lock(kernel); | ||
| 137 | SetStatus(ThreadStatus::Ready); | ||
| 138 | return RESULT_SUCCESS; | ||
| 139 | } | ||
| 140 | |||
| 141 | void Thread::CancelWait() { | 141 | void Thread::CancelWait() { |
| 142 | if (GetSchedulingStatus() != ThreadSchedStatus::Paused) { | 142 | if (GetSchedulingStatus() != ThreadSchedStatus::Paused) { |
| 143 | is_sync_cancelled = true; | 143 | is_sync_cancelled = true; |
| @@ -188,7 +188,7 @@ ResultVal<std::shared_ptr<Thread>> Thread::Create(Core::System& system, ThreadTy | |||
| 188 | void* thread_start_parameter) { | 188 | void* thread_start_parameter) { |
| 189 | auto& kernel = system.Kernel(); | 189 | auto& kernel = system.Kernel(); |
| 190 | // Check if priority is in ranged. Lowest priority -> highest priority id. | 190 | // Check if priority is in ranged. Lowest priority -> highest priority id. |
| 191 | if (priority > THREADPRIO_LOWEST && (type_flags & THREADTYPE_IDLE == 0)) { | 191 | if (priority > THREADPRIO_LOWEST && ((type_flags & THREADTYPE_IDLE) == 0)) { |
| 192 | LOG_ERROR(Kernel_SVC, "Invalid thread priority: {}", priority); | 192 | LOG_ERROR(Kernel_SVC, "Invalid thread priority: {}", priority); |
| 193 | return ERR_INVALID_THREAD_PRIORITY; | 193 | return ERR_INVALID_THREAD_PRIORITY; |
| 194 | } | 194 | } |
| @@ -416,7 +416,7 @@ void Thread::SetActivity(ThreadActivity value) { | |||
| 416 | } | 416 | } |
| 417 | } | 417 | } |
| 418 | 418 | ||
| 419 | void Thread::Sleep(s64 nanoseconds) { | 419 | ResultCode Thread::Sleep(s64 nanoseconds) { |
| 420 | Handle event_handle{}; | 420 | Handle event_handle{}; |
| 421 | { | 421 | { |
| 422 | SchedulerLockAndSleep lock(kernel, event_handle, this, nanoseconds); | 422 | SchedulerLockAndSleep lock(kernel, event_handle, this, nanoseconds); |
| @@ -427,33 +427,31 @@ void Thread::Sleep(s64 nanoseconds) { | |||
| 427 | auto& time_manager = kernel.TimeManager(); | 427 | auto& time_manager = kernel.TimeManager(); |
| 428 | time_manager.UnscheduleTimeEvent(event_handle); | 428 | time_manager.UnscheduleTimeEvent(event_handle); |
| 429 | } | 429 | } |
| 430 | return RESULT_SUCCESS; | ||
| 430 | } | 431 | } |
| 431 | 432 | ||
| 432 | bool Thread::YieldSimple() { | 433 | ResultCode Thread::YieldSimple() { |
| 433 | bool result{}; | ||
| 434 | { | 434 | { |
| 435 | SchedulerLock lock(kernel); | 435 | SchedulerLock lock(kernel); |
| 436 | result = kernel.GlobalScheduler().YieldThread(this); | 436 | kernel.GlobalScheduler().YieldThread(this); |
| 437 | } | 437 | } |
| 438 | return result; | 438 | return RESULT_SUCCESS; |
| 439 | } | 439 | } |
| 440 | 440 | ||
| 441 | bool Thread::YieldAndBalanceLoad() { | 441 | ResultCode Thread::YieldAndBalanceLoad() { |
| 442 | bool result{}; | ||
| 443 | { | 442 | { |
| 444 | SchedulerLock lock(kernel); | 443 | SchedulerLock lock(kernel); |
| 445 | result = kernel.GlobalScheduler().YieldThreadAndBalanceLoad(this); | 444 | kernel.GlobalScheduler().YieldThreadAndBalanceLoad(this); |
| 446 | } | 445 | } |
| 447 | return result; | 446 | return RESULT_SUCCESS; |
| 448 | } | 447 | } |
| 449 | 448 | ||
| 450 | bool Thread::YieldAndWaitForLoadBalancing() { | 449 | ResultCode Thread::YieldAndWaitForLoadBalancing() { |
| 451 | bool result{}; | ||
| 452 | { | 450 | { |
| 453 | SchedulerLock lock(kernel); | 451 | SchedulerLock lock(kernel); |
| 454 | result = kernel.GlobalScheduler().YieldThreadAndWaitForLoadBalancing(this); | 452 | kernel.GlobalScheduler().YieldThreadAndWaitForLoadBalancing(this); |
| 455 | } | 453 | } |
| 456 | return result; | 454 | return RESULT_SUCCESS; |
| 457 | } | 455 | } |
| 458 | 456 | ||
| 459 | void Thread::SetSchedulingStatus(ThreadSchedStatus new_status) { | 457 | void Thread::SetSchedulingStatus(ThreadSchedStatus new_status) { |