Fix deadlock in vm::unmap

This commit is contained in:
Nekotekina 2017-08-09 02:52:28 +03:00
parent 0d9b89fb34
commit af11ad6253
2 changed files with 12 additions and 4 deletions

View File

@ -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;
}

View File

@ -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();
};