Set group status INIT on last thread stopped

this fixes the group status after sys_spu_thread_exit when not joining the spu group
This commit is contained in:
eladash 2018-11-15 05:56:28 +02:00 committed by Ivan
parent 7c74bafaf3
commit 653a4ef0df
2 changed files with 6 additions and 17 deletions

View File

@ -486,9 +486,13 @@ void spu_thread::cpu_stop()
{
if (verify(HERE, group->running--) == 1)
{
{
group->stop_count++;
std::lock_guard lock(group->mutex);
group->run_state = SPU_THREAD_GROUP_STATUS_INITIALIZED;
}
// Notify on last thread stopped
group->stop_count++;
group->mutex.lock_unlock();
group->cond.notify_all();
}
}
@ -2359,7 +2363,6 @@ bool spu_thread::stop_and_signal(u32 code)
}
}
group->run_state = SPU_THREAD_GROUP_STATUS_INITIALIZED;
group->exit_status = value;
group->join_state |= SPU_TGJSF_GROUP_EXIT;

View File

@ -329,12 +329,6 @@ error_code sys_spu_thread_group_destroy(u32 id)
const auto group = idm::withdraw<lv2_spu_group>(id, [](lv2_spu_group& group) -> CellError
{
if (group.running)
{
// Cannot destroy while threads are running
return CELL_EBUSY;
}
const auto _old = group.run_state.compare_and_swap(SPU_THREAD_GROUP_STATUS_INITIALIZED, SPU_THREAD_GROUP_STATUS_NOT_INITIALIZED);
if (_old > SPU_THREAD_GROUP_STATUS_INITIALIZED)
@ -375,12 +369,6 @@ error_code sys_spu_thread_group_start(ppu_thread& ppu, u32 id)
const auto group = idm::get<lv2_spu_group>(id, [](lv2_spu_group& group)
{
if (group.running)
{
// Can't start while threads are (still) running
return false;
}
// SPU_THREAD_GROUP_STATUS_READY state is not used
return group.run_state.compare_and_swap_test(SPU_THREAD_GROUP_STATUS_INITIALIZED, SPU_THREAD_GROUP_STATUS_RUNNING);
});
@ -618,7 +606,6 @@ error_code sys_spu_thread_group_terminate(u32 id, s32 value)
}
}
group->run_state = SPU_THREAD_GROUP_STATUS_INITIALIZED;
group->exit_status = value;
group->join_state |= SPU_TGJSF_TERMINATED;
@ -680,7 +667,6 @@ error_code sys_spu_thread_group_join(ppu_thread& ppu, u32 id, vm::ptr<u32> cause
join_state = group->join_state;
exit_value = group->exit_status;
group->join_state &= ~SPU_TGJSF_IS_JOINING;
group->run_state = SPU_THREAD_GROUP_STATUS_INITIALIZED; // hack
}
if (ppu.test_stopped())