mirror of
https://git.h3cjp.net/H3cJP/citra.git
synced 2024-12-02 00:42:51 +00:00
Kernel: Correct Cancel Synchronization.
This commit corrects the behavior of cancel synchronization when the thread is running/ready and ensures the next wait is cancelled as it's suppose to.
This commit is contained in:
parent
bb31df62bb
commit
7d16b2d2dd
|
@ -505,6 +505,11 @@ static ResultCode WaitSynchronization(Core::System& system, Handle* index, VAddr
|
|||
return RESULT_TIMEOUT;
|
||||
}
|
||||
|
||||
if (thread->IsSyncCancelled()) {
|
||||
thread->SetSyncCancelled(false);
|
||||
return ERR_SYNCHRONIZATION_CANCELED;
|
||||
}
|
||||
|
||||
for (auto& object : objects) {
|
||||
object->AddWaitingThread(thread);
|
||||
}
|
||||
|
|
|
@ -132,8 +132,11 @@ void Thread::ResumeFromWait() {
|
|||
}
|
||||
|
||||
void Thread::CancelWait() {
|
||||
ASSERT(GetStatus() == ThreadStatus::WaitSynch);
|
||||
ClearWaitObjects();
|
||||
if (GetSchedulingStatus() != ThreadSchedStatus::Paused) {
|
||||
is_sync_cancelled = true;
|
||||
return;
|
||||
}
|
||||
is_sync_cancelled = false;
|
||||
SetWaitSynchronizationResult(ERR_SYNCHRONIZATION_CANCELED);
|
||||
ResumeFromWait();
|
||||
}
|
||||
|
|
|
@ -440,6 +440,14 @@ public:
|
|||
is_running = value;
|
||||
}
|
||||
|
||||
bool IsSyncCancelled() const {
|
||||
return is_sync_cancelled;
|
||||
}
|
||||
|
||||
void SetSyncCancelled(bool value) {
|
||||
is_sync_cancelled = value;
|
||||
}
|
||||
|
||||
private:
|
||||
explicit Thread(KernelCore& kernel);
|
||||
~Thread() override;
|
||||
|
@ -524,6 +532,7 @@ private:
|
|||
|
||||
u32 scheduling_state = 0;
|
||||
bool is_running = false;
|
||||
bool is_sync_cancelled = false;
|
||||
|
||||
std::string name;
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue