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

View File

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