mirror of https://github.com/RPCS3/rpcs3.git
Fix deadlock in vm::unmap
This commit is contained in:
parent
0d9b89fb34
commit
af11ad6253
|
@ -675,10 +675,8 @@ namespace vm
|
|||
return 0;
|
||||
}
|
||||
|
||||
u32 block_t::used()
|
||||
u32 block_t::imp_used(const vm::writer_lock&)
|
||||
{
|
||||
reader_lock lock;
|
||||
|
||||
u32 result = 0;
|
||||
|
||||
for (auto& entry : m_map)
|
||||
|
@ -689,6 +687,13 @@ namespace vm
|
|||
return result;
|
||||
}
|
||||
|
||||
u32 block_t::used()
|
||||
{
|
||||
writer_lock lock(0);
|
||||
|
||||
return imp_used(lock);
|
||||
}
|
||||
|
||||
std::shared_ptr<block_t> map(u32 addr, u32 size, u64 flags)
|
||||
{
|
||||
writer_lock lock(0);
|
||||
|
@ -734,7 +739,7 @@ namespace vm
|
|||
{
|
||||
if (*it && (*it)->addr == addr)
|
||||
{
|
||||
if (must_be_empty && (!it->unique() || (*it)->used()))
|
||||
if (must_be_empty && (!it->unique() || (*it)->imp_used(lock)))
|
||||
{
|
||||
return *it;
|
||||
}
|
||||
|
|
|
@ -156,6 +156,9 @@ namespace vm
|
|||
// Unmap memory at specified location previously returned by alloc(), return size
|
||||
u32 dealloc(u32 addr, u32* sup_out = nullptr);
|
||||
|
||||
// Internal
|
||||
u32 imp_used(const vm::writer_lock&);
|
||||
|
||||
// Get allocated memory count
|
||||
u32 used();
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue