utils::shm: Make map_self() atomic (#9578)

This commit is contained in:
Eladash 2021-01-12 18:53:18 +02:00 committed by GitHub
parent e1f95ceb54
commit c50b9bc4b4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 9 deletions

View file

@ -1,6 +1,7 @@
#pragma once
#include "util/types.hpp"
#include "util/atomic.hpp"
namespace utils
{
@ -52,7 +53,7 @@ namespace utils
#endif
u32 m_size;
u32 m_flags;
void* m_ptr;
atomic_t<void*> m_ptr;
public:
explicit shm(u32 size, u32 flags = 0);
@ -84,7 +85,7 @@ namespace utils
// Get memory mapped by map_self()
u8* get() const
{
return reinterpret_cast<u8*>(m_ptr);
return static_cast<u8*>(+m_ptr);
}
u32 size() const

View file

@ -218,7 +218,7 @@ namespace utils
shm::shm(u32 size, u32 flags)
: m_size(utils::align(size, 0x10000))
, m_flags(flags)
, m_ptr(0)
, m_ptr(nullptr)
{
#ifdef _WIN32
m_handle = ::CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_EXECUTE_READWRITE, 0, m_size, NULL);
@ -362,12 +362,21 @@ namespace utils
u8* shm::map_self(protection prot)
{
if (!m_ptr)
void* ptr = m_ptr;
if (!ptr)
{
m_ptr = this->map(nullptr, prot);
const auto mapped = this->map(nullptr, prot);
// Install mapped memory
if (!m_ptr.compare_exchange(ptr, mapped))
{
// Mapped already, nothing to do.
this->unmap(mapped);
}
}
return static_cast<u8*>(m_ptr);
return static_cast<u8*>(ptr);
}
void shm::unmap(void* ptr) const
@ -414,10 +423,9 @@ namespace utils
void shm::unmap_self()
{
if (m_ptr)
if (auto ptr = m_ptr.exchange(nullptr))
{
this->unmap(m_ptr);
m_ptr = nullptr;
this->unmap(ptr);
}
}
}