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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 block_t::used()
|
u32 block_t::imp_used(const vm::writer_lock&)
|
||||||
{
|
{
|
||||||
reader_lock lock;
|
|
||||||
|
|
||||||
u32 result = 0;
|
u32 result = 0;
|
||||||
|
|
||||||
for (auto& entry : m_map)
|
for (auto& entry : m_map)
|
||||||
|
@ -689,6 +687,13 @@ namespace vm
|
||||||
return result;
|
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)
|
std::shared_ptr<block_t> map(u32 addr, u32 size, u64 flags)
|
||||||
{
|
{
|
||||||
writer_lock lock(0);
|
writer_lock lock(0);
|
||||||
|
@ -734,7 +739,7 @@ namespace vm
|
||||||
{
|
{
|
||||||
if (*it && (*it)->addr == addr)
|
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;
|
return *it;
|
||||||
}
|
}
|
||||||
|
|
|
@ -156,6 +156,9 @@ namespace vm
|
||||||
// Unmap memory at specified location previously returned by alloc(), return size
|
// Unmap memory at specified location previously returned by alloc(), return size
|
||||||
u32 dealloc(u32 addr, u32* sup_out = nullptr);
|
u32 dealloc(u32 addr, u32* sup_out = nullptr);
|
||||||
|
|
||||||
|
// Internal
|
||||||
|
u32 imp_used(const vm::writer_lock&);
|
||||||
|
|
||||||
// Get allocated memory count
|
// Get allocated memory count
|
||||||
u32 used();
|
u32 used();
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue