mirror of https://github.com/RPCS3/rpcs3.git
Remove slow vm::writer_lock usage from SPUThread.cpp
This commit is contained in:
parent
7a3cbf1876
commit
fcbeb2fa22
|
@ -3944,19 +3944,23 @@ s64 spu_thread::get_ch_value(u32 ch)
|
||||||
|
|
||||||
state += cpu_flag::wait;
|
state += cpu_flag::wait;
|
||||||
|
|
||||||
using resrv_ptr = std::add_pointer_t<decltype(rdata)>;
|
using resrv_ptr = std::add_pointer_t<const decltype(rdata)>;
|
||||||
|
|
||||||
resrv_ptr resrv_mem{};
|
resrv_ptr resrv_mem = vm::get_super_ptr<decltype(rdata)>(raddr);
|
||||||
std::shared_ptr<utils::shm> rdata_shm;
|
std::shared_ptr<utils::shm> rdata_shm;
|
||||||
|
|
||||||
if (raddr && mask1 & SPU_EVENT_LR)
|
// Does not need to safe-access reservation if LR is the only event masked
|
||||||
|
// Because it's either an access violation or a livelock if an invalid memory is passed
|
||||||
|
if (raddr && mask1 > SPU_EVENT_LR)
|
||||||
{
|
{
|
||||||
auto area = vm::get(vm::any, raddr);
|
auto area = vm::get(vm::any, raddr);
|
||||||
|
|
||||||
if (area && (area->flags & vm::preallocated) && vm::check_addr(raddr))
|
if (area && (area->flags & vm::preallocated))
|
||||||
{
|
{
|
||||||
// Obtain pointer to pre-allocated storage
|
if (!vm::check_addr(raddr))
|
||||||
resrv_mem = vm::get_super_ptr<decltype(rdata)>(raddr);
|
{
|
||||||
|
resrv_mem = nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (area)
|
else if (area)
|
||||||
{
|
{
|
||||||
|
@ -3967,7 +3971,7 @@ s64 spu_thread::get_ch_value(u32 ch)
|
||||||
{
|
{
|
||||||
const u32 data_offs = raddr - base_addr;
|
const u32 data_offs = raddr - base_addr;
|
||||||
rdata_shm = std::move(shm_);
|
rdata_shm = std::move(shm_);
|
||||||
vm::writer_lock{}, resrv_mem = reinterpret_cast<resrv_ptr>(rdata_shm->map_self() + data_offs);
|
resrv_mem = reinterpret_cast<resrv_ptr>(rdata_shm->get() + data_offs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -698,7 +698,7 @@ namespace vm
|
||||||
{
|
{
|
||||||
utils::memory_protect(g_base_addr + addr, size, prot);
|
utils::memory_protect(g_base_addr + addr, size, prot);
|
||||||
}
|
}
|
||||||
else if (shm->map_critical(g_base_addr + addr, prot) != g_base_addr + addr || shm->map_critical(g_sudo_addr + addr) != g_sudo_addr + addr)
|
else if (shm->map_critical(g_base_addr + addr, prot) != g_base_addr + addr || shm->map_critical(g_sudo_addr + addr) != g_sudo_addr + addr || !shm->map_self())
|
||||||
{
|
{
|
||||||
fmt::throw_exception("Memory mapping failed - blame Windows (addr=0x%x, size=0x%x, flags=0x%x)", addr, size, flags);
|
fmt::throw_exception("Memory mapping failed - blame Windows (addr=0x%x, size=0x%x, flags=0x%x)", addr, size, flags);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue