mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-11 01:08:39 +12:00
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:
parent
7c74bafaf3
commit
653a4ef0df
2 changed files with 6 additions and 17 deletions
|
@ -486,9 +486,13 @@ void spu_thread::cpu_stop()
|
||||||
{
|
{
|
||||||
if (verify(HERE, group->running--) == 1)
|
if (verify(HERE, group->running--) == 1)
|
||||||
{
|
{
|
||||||
// Notify on last thread stopped
|
{
|
||||||
group->stop_count++;
|
group->stop_count++;
|
||||||
group->mutex.lock_unlock();
|
std::lock_guard lock(group->mutex);
|
||||||
|
group->run_state = SPU_THREAD_GROUP_STATUS_INITIALIZED;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notify on last thread stopped
|
||||||
group->cond.notify_all();
|
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->exit_status = value;
|
||||||
group->join_state |= SPU_TGJSF_GROUP_EXIT;
|
group->join_state |= SPU_TGJSF_GROUP_EXIT;
|
||||||
|
|
||||||
|
|
|
@ -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
|
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);
|
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)
|
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)
|
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
|
// 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);
|
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->exit_status = value;
|
||||||
group->join_state |= SPU_TGJSF_TERMINATED;
|
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;
|
join_state = group->join_state;
|
||||||
exit_value = group->exit_status;
|
exit_value = group->exit_status;
|
||||||
group->join_state &= ~SPU_TGJSF_IS_JOINING;
|
group->join_state &= ~SPU_TGJSF_IS_JOINING;
|
||||||
group->run_state = SPU_THREAD_GROUP_STATUS_INITIALIZED; // hack
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ppu.test_stopped())
|
if (ppu.test_stopped())
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue