SCC: Small corrections to CancelSynchronization

This commit is contained in:
Fernando Sahmkow 2020-03-07 10:24:46 -04:00
parent 44cb9997b3
commit a66c61ca2d
3 changed files with 14 additions and 2 deletions

View file

@ -74,7 +74,9 @@ std::pair<ResultCode, Handle> Synchronization::WaitFor(
thread->SetSynchronizationObjects(&sync_objects);
thread->SetSynchronizationResults(nullptr, RESULT_TIMEOUT);
thread->SetStatus(ThreadStatus::WaitSynch);
thread->SetWaitingSync(true);
}
thread->SetWaitingSync(false);
if (event_handle != InvalidHandle) {
auto& time_manager = kernel.TimeManager();

View file

@ -139,13 +139,14 @@ ResultCode Thread::Start() {
void Thread::CancelWait() {
SchedulerLock lock(kernel);
if (GetSchedulingStatus() != ThreadSchedStatus::Paused) {
if (GetSchedulingStatus() != ThreadSchedStatus::Paused || !is_waiting_on_sync) {
is_sync_cancelled = true;
return;
}
//TODO(Blinkhawk): Implement cancel of server session
is_sync_cancelled = false;
SetSynchronizationResults(nullptr, ERR_SYNCHRONIZATION_CANCELED);
ResumeFromWait();
SetStatus(ThreadStatus::Ready);
}
static void ResetThreadContext32(Core::ARM_Interface::ThreadContext32& context, u32 stack_top,

View file

@ -556,6 +556,14 @@ public:
waiting_for_arbitration = set;
}
bool IsWaitingSync() const {
return is_waiting_on_sync;
}
void SetWaitingSync(bool is_waiting) {
is_waiting_on_sync = is_waiting;
}
private:
friend class GlobalScheduler;
friend class Scheduler;
@ -650,6 +658,7 @@ private:
u32 scheduling_state = 0;
bool is_running = false;
bool is_waiting_on_sync = false;
bool is_sync_cancelled = false;
bool will_be_terminated{};