diff options
| author | 2020-03-10 13:13:39 -0400 | |
|---|---|---|
| committer | 2020-06-27 11:35:45 -0400 | |
| commit | d494b074e8afd3aff7b65afc7b977496be06ccc9 (patch) | |
| tree | 002cc29d32a9b1e44e61fb1aae122715556b36c5 /src/core/hle/kernel/thread.cpp | |
| parent | CPU_Manager: Unload/Reload threads on preemption on SingleCore (diff) | |
| download | yuzu-d494b074e8afd3aff7b65afc7b977496be06ccc9.tar.gz yuzu-d494b074e8afd3aff7b65afc7b977496be06ccc9.tar.xz yuzu-d494b074e8afd3aff7b65afc7b977496be06ccc9.zip | |
Kernel: Preempt Single core on redudant yields.
Diffstat (limited to 'src/core/hle/kernel/thread.cpp')
| -rw-r--r-- | src/core/hle/kernel/thread.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index fc6c0bc85..1c32552b1 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/src/core/hle/kernel/thread.cpp | |||
| @@ -435,28 +435,31 @@ ResultCode Thread::Sleep(s64 nanoseconds) { | |||
| 435 | return RESULT_SUCCESS; | 435 | return RESULT_SUCCESS; |
| 436 | } | 436 | } |
| 437 | 437 | ||
| 438 | ResultCode Thread::YieldSimple() { | 438 | std::pair<ResultCode, bool> Thread::YieldSimple() { |
| 439 | bool is_redundant = false; | ||
| 439 | { | 440 | { |
| 440 | SchedulerLock lock(kernel); | 441 | SchedulerLock lock(kernel); |
| 441 | kernel.GlobalScheduler().YieldThread(this); | 442 | is_redundant = kernel.GlobalScheduler().YieldThread(this); |
| 442 | } | 443 | } |
| 443 | return RESULT_SUCCESS; | 444 | return {RESULT_SUCCESS, is_redundant}; |
| 444 | } | 445 | } |
| 445 | 446 | ||
| 446 | ResultCode Thread::YieldAndBalanceLoad() { | 447 | std::pair<ResultCode, bool> Thread::YieldAndBalanceLoad() { |
| 448 | bool is_redundant = false; | ||
| 447 | { | 449 | { |
| 448 | SchedulerLock lock(kernel); | 450 | SchedulerLock lock(kernel); |
| 449 | kernel.GlobalScheduler().YieldThreadAndBalanceLoad(this); | 451 | is_redundant = kernel.GlobalScheduler().YieldThreadAndBalanceLoad(this); |
| 450 | } | 452 | } |
| 451 | return RESULT_SUCCESS; | 453 | return {RESULT_SUCCESS, is_redundant}; |
| 452 | } | 454 | } |
| 453 | 455 | ||
| 454 | ResultCode Thread::YieldAndWaitForLoadBalancing() { | 456 | std::pair<ResultCode, bool> Thread::YieldAndWaitForLoadBalancing() { |
| 457 | bool is_redundant = false; | ||
| 455 | { | 458 | { |
| 456 | SchedulerLock lock(kernel); | 459 | SchedulerLock lock(kernel); |
| 457 | kernel.GlobalScheduler().YieldThreadAndWaitForLoadBalancing(this); | 460 | is_redundant = kernel.GlobalScheduler().YieldThreadAndWaitForLoadBalancing(this); |
| 458 | } | 461 | } |
| 459 | return RESULT_SUCCESS; | 462 | return {RESULT_SUCCESS, is_redundant}; |
| 460 | } | 463 | } |
| 461 | 464 | ||
| 462 | void Thread::AddSchedulingFlag(ThreadSchedFlags flag) { | 465 | void Thread::AddSchedulingFlag(ThreadSchedFlags flag) { |