LV2: Minor optimization regarding signal flag

This commit is contained in:
Eladash 2022-07-21 16:53:49 +03:00 committed by Ivan
parent dc851a729e
commit 2eebbd307d
11 changed files with 24 additions and 26 deletions

View File

@ -4860,9 +4860,9 @@ bool spu_thread::stop_and_signal(u32 code)
} }
} }
while (auto old = state.fetch_sub(cpu_flag::signal)) while (auto old = +state)
{ {
if (old & cpu_flag::signal) if (old & cpu_flag::signal && state.test_and_reset(cpu_flag::signal))
{ {
break; break;
} }

View File

@ -348,9 +348,9 @@ error_code sys_cond_wait(ppu_thread& ppu, u32 cond_id, u64 timeout)
return CELL_EPERM; return CELL_EPERM;
} }
while (auto state = ppu.state.fetch_sub(cpu_flag::signal)) while (auto state = +ppu.state)
{ {
if (state & cpu_flag::signal) if (state & cpu_flag::signal && ppu.state.test_and_reset(cpu_flag::signal))
{ {
break; break;
} }

View File

@ -451,9 +451,9 @@ error_code sys_event_queue_receive(ppu_thread& ppu, u32 equeue_id, vm::ptr<sys_e
} }
// If cancelled, gpr[3] will be non-zero. Other registers must contain event data. // If cancelled, gpr[3] will be non-zero. Other registers must contain event data.
while (auto state = ppu.state.fetch_sub(cpu_flag::signal)) while (auto state = +ppu.state)
{ {
if (state & cpu_flag::signal) if (state & cpu_flag::signal && ppu.state.test_and_reset(cpu_flag::signal))
{ {
break; break;
} }

View File

@ -191,9 +191,9 @@ error_code sys_event_flag_wait(ppu_thread& ppu, u32 id, u64 bitptn, u32 mode, vm
return CELL_OK; return CELL_OK;
} }
while (auto state = ppu.state.fetch_sub(cpu_flag::signal)) while (auto state = +ppu.state)
{ {
if (state & cpu_flag::signal) if (state & cpu_flag::signal && ppu.state.test_and_reset(cpu_flag::signal))
{ {
break; break;
} }

View File

@ -400,9 +400,9 @@ error_code _sys_lwcond_queue_wait(ppu_thread& ppu, u32 lwcond_id, u32 lwmutex_id
return CELL_OK; return CELL_OK;
} }
while (auto state = ppu.state.fetch_sub(cpu_flag::signal)) while (auto state = +ppu.state)
{ {
if (state & cpu_flag::signal) if (state & cpu_flag::signal && ppu.state.test_and_reset(cpu_flag::signal))
{ {
break; break;
} }

View File

@ -184,9 +184,9 @@ error_code _sys_lwmutex_lock(ppu_thread& ppu, u32 lwmutex_id, u64 timeout)
return not_an_error(ppu.gpr[3]); return not_an_error(ppu.gpr[3]);
} }
while (auto state = ppu.state.fetch_sub(cpu_flag::signal)) while (auto state = +ppu.state)
{ {
if (state & cpu_flag::signal) if (state & cpu_flag::signal && ppu.state.test_and_reset(cpu_flag::signal))
{ {
break; break;
} }

View File

@ -175,9 +175,9 @@ error_code sys_mutex_lock(ppu_thread& ppu, u32 mutex_id, u64 timeout)
ppu.gpr[3] = CELL_OK; ppu.gpr[3] = CELL_OK;
while (auto state = ppu.state.fetch_sub(cpu_flag::signal)) while (auto state = +ppu.state)
{ {
if (state & cpu_flag::signal) if (state & cpu_flag::signal && ppu.state.test_and_reset(cpu_flag::signal))
{ {
break; break;
} }

View File

@ -150,9 +150,9 @@ error_code sys_rwlock_rlock(ppu_thread& ppu, u32 rw_lock_id, u64 timeout)
ppu.gpr[3] = CELL_OK; ppu.gpr[3] = CELL_OK;
while (auto state = ppu.state.fetch_sub(cpu_flag::signal)) while (auto state = +ppu.state)
{ {
if (state & cpu_flag::signal) if (state & cpu_flag::signal && ppu.state.test_and_reset(cpu_flag::signal))
{ {
break; break;
} }
@ -378,9 +378,9 @@ error_code sys_rwlock_wlock(ppu_thread& ppu, u32 rw_lock_id, u64 timeout)
ppu.gpr[3] = CELL_OK; ppu.gpr[3] = CELL_OK;
while (auto state = ppu.state.fetch_sub(cpu_flag::signal)) while (auto state = +ppu.state)
{ {
if (state & cpu_flag::signal) if (state & cpu_flag::signal && ppu.state.test_and_reset(cpu_flag::signal))
{ {
break; break;
} }

View File

@ -147,9 +147,9 @@ error_code sys_semaphore_wait(ppu_thread& ppu, u32 sem_id, u64 timeout)
ppu.gpr[3] = CELL_OK; ppu.gpr[3] = CELL_OK;
while (auto state = ppu.state.fetch_sub(cpu_flag::signal)) while (auto state = +ppu.state)
{ {
if (state & cpu_flag::signal) if (state & cpu_flag::signal && ppu.state.test_and_reset(cpu_flag::signal))
{ {
break; break;
} }

View File

@ -1408,11 +1408,9 @@ error_code sys_spu_thread_group_join(ppu_thread& ppu, u32 id, vm::ptr<u32> cause
lv2_obj::sleep(ppu); lv2_obj::sleep(ppu);
lock.unlock(); lock.unlock();
while (true) while (auto state = +ppu.state)
{ {
const auto state = ppu.state.fetch_sub(cpu_flag::signal); if (state & cpu_flag::signal && ppu.state.test_and_reset(cpu_flag::signal))
if (state & cpu_flag::signal)
{ {
break; break;
} }

View File

@ -860,9 +860,9 @@ error_code sys_usbd_receive_event(ppu_thread& ppu, u32 handle, vm::ptr<u64> arg1
usbh.sq.emplace_back(&ppu); usbh.sq.emplace_back(&ppu);
} }
while (auto state = ppu.state.fetch_sub(cpu_flag::signal)) while (auto state = +ppu.state)
{ {
if (state & cpu_flag::signal) if (state & cpu_flag::signal && ppu.state.test_and_reset(cpu_flag::signal))
{ {
sys_usbd.trace("Received event(queued): arg1=0x%x arg2=0x%x arg3=0x%x", ppu.gpr[4], ppu.gpr[5], ppu.gpr[6]); sys_usbd.trace("Received event(queued): arg1=0x%x arg2=0x%x arg3=0x%x", ppu.gpr[4], ppu.gpr[5], ppu.gpr[6]);
break; break;