mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-09 00:11:24 +12:00
sys_spu_thread_group_dis/connect_event Improvements
This commit is contained in:
parent
c3862b74b1
commit
a2c69e4a2e
1 changed files with 35 additions and 70 deletions
|
@ -1023,54 +1023,40 @@ error_code sys_spu_thread_group_connect_event(ppu_thread& ppu, u32 id, u32 eq, u
|
||||||
sys_spu.warning("sys_spu_thread_group_connect_event(id=0x%x, eq=0x%x, et=%d)", id, eq, et);
|
sys_spu.warning("sys_spu_thread_group_connect_event(id=0x%x, eq=0x%x, et=%d)", id, eq, et);
|
||||||
|
|
||||||
const auto group = idm::get<lv2_spu_group>(id);
|
const auto group = idm::get<lv2_spu_group>(id);
|
||||||
const auto queue = idm::get<lv2_obj, lv2_event_queue>(eq);
|
|
||||||
|
|
||||||
if (!group || !queue)
|
if (!group)
|
||||||
{
|
{
|
||||||
return CELL_ESRCH;
|
return CELL_ESRCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::lock_guard lock(group->mutex);
|
const auto ep =
|
||||||
|
et == SYS_SPU_THREAD_GROUP_EVENT_SYSTEM_MODULE ? &group->ep_sysmodule :
|
||||||
|
et == SYS_SPU_THREAD_GROUP_EVENT_EXCEPTION ? &group->ep_exception :
|
||||||
|
et == SYS_SPU_THREAD_GROUP_EVENT_RUN ? &group->ep_run :
|
||||||
|
nullptr;
|
||||||
|
|
||||||
switch (et)
|
if (!ep)
|
||||||
{
|
|
||||||
case SYS_SPU_THREAD_GROUP_EVENT_RUN:
|
|
||||||
{
|
|
||||||
if (!group->ep_run.expired())
|
|
||||||
{
|
|
||||||
return CELL_EBUSY;
|
|
||||||
}
|
|
||||||
|
|
||||||
group->ep_run = queue;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SYS_SPU_THREAD_GROUP_EVENT_EXCEPTION:
|
|
||||||
{
|
|
||||||
if (!group->ep_exception.expired())
|
|
||||||
{
|
|
||||||
return CELL_EBUSY;
|
|
||||||
}
|
|
||||||
|
|
||||||
group->ep_exception = queue;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SYS_SPU_THREAD_GROUP_EVENT_SYSTEM_MODULE:
|
|
||||||
{
|
|
||||||
if (!group->ep_sysmodule.expired())
|
|
||||||
{
|
|
||||||
return CELL_EBUSY;
|
|
||||||
}
|
|
||||||
|
|
||||||
group->ep_sysmodule = queue;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
{
|
{
|
||||||
sys_spu.error("sys_spu_thread_group_connect_event(): unknown event type (%d)", et);
|
sys_spu.error("sys_spu_thread_group_connect_event(): unknown event type (%d)", et);
|
||||||
return CELL_EINVAL;
|
return CELL_EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto queue = idm::get<lv2_obj, lv2_event_queue>(eq);
|
||||||
|
|
||||||
|
std::lock_guard lock(group->mutex);
|
||||||
|
|
||||||
|
if (!ep->expired())
|
||||||
|
{
|
||||||
|
return CELL_EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ESRCH of event queue after EBUSY
|
||||||
|
if (!queue)
|
||||||
|
{
|
||||||
|
return CELL_ESRCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
*ep = queue;
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1087,47 +1073,26 @@ error_code sys_spu_thread_group_disconnect_event(ppu_thread& ppu, u32 id, u32 et
|
||||||
return CELL_ESRCH;
|
return CELL_ESRCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::lock_guard lock(group->mutex);
|
const auto ep =
|
||||||
|
et == SYS_SPU_THREAD_GROUP_EVENT_SYSTEM_MODULE ? &group->ep_sysmodule :
|
||||||
|
et == SYS_SPU_THREAD_GROUP_EVENT_EXCEPTION ? &group->ep_exception :
|
||||||
|
et == SYS_SPU_THREAD_GROUP_EVENT_RUN ? &group->ep_run :
|
||||||
|
nullptr;
|
||||||
|
|
||||||
switch (et)
|
if (!ep)
|
||||||
{
|
|
||||||
case SYS_SPU_THREAD_GROUP_EVENT_RUN:
|
|
||||||
{
|
|
||||||
if (group->ep_run.expired())
|
|
||||||
{
|
|
||||||
return CELL_ENOTCONN;
|
|
||||||
}
|
|
||||||
|
|
||||||
group->ep_run.reset();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SYS_SPU_THREAD_GROUP_EVENT_EXCEPTION:
|
|
||||||
{
|
|
||||||
if (group->ep_exception.expired())
|
|
||||||
{
|
|
||||||
return CELL_ENOTCONN;
|
|
||||||
}
|
|
||||||
|
|
||||||
group->ep_exception.reset();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SYS_SPU_THREAD_GROUP_EVENT_SYSTEM_MODULE:
|
|
||||||
{
|
|
||||||
if (group->ep_sysmodule.expired())
|
|
||||||
{
|
|
||||||
return CELL_ENOTCONN;
|
|
||||||
}
|
|
||||||
|
|
||||||
group->ep_sysmodule.reset();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
{
|
{
|
||||||
sys_spu.error("sys_spu_thread_group_disconnect_event(): unknown event type (%d)", et);
|
sys_spu.error("sys_spu_thread_group_disconnect_event(): unknown event type (%d)", et);
|
||||||
return CELL_EINVAL;
|
return CELL_EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::lock_guard lock(group->mutex);
|
||||||
|
|
||||||
|
if (ep->expired())
|
||||||
|
{
|
||||||
|
return CELL_EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ep->reset();
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue