diff options
author | Sergey Bugaev <bugaevc@gmail.com> | 2019-08-05 15:26:56 +0300 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-08-05 16:04:31 +0200 |
commit | 55d7810fab79efbc9fad62566fe1f12be80856e8 (patch) | |
tree | f7d4bcb3eb36611702727e9c1dab1c73387260e6 /AK/MappedFile.cpp | |
parent | 837b4762839861ff5968c326d9661ce4f132becb (diff) | |
download | serenity-55d7810fab79efbc9fad62566fe1f12be80856e8.zip |
AK: Do not keep an open FD in MmappedFile
We only need an open FD while establishing the mapping,
and can close it immediately after mmap() call.
Diffstat (limited to 'AK/MappedFile.cpp')
-rw-r--r-- | AK/MappedFile.cpp | 32 |
1 files changed, 15 insertions, 17 deletions
diff --git a/AK/MappedFile.cpp b/AK/MappedFile.cpp index 83baecfaa4..73265c5a7f 100644 --- a/AK/MappedFile.cpp +++ b/AK/MappedFile.cpp @@ -13,21 +13,26 @@ namespace AK { MappedFile::MappedFile(const StringView& file_name) { m_size = PAGE_SIZE; - m_fd = open_with_path_length(file_name.characters_without_null_termination(), file_name.length(), O_RDONLY | O_CLOEXEC, 0); + int fd = open_with_path_length(file_name.characters_without_null_termination(), file_name.length(), O_RDONLY | O_CLOEXEC, 0); - if (m_fd != -1) { - struct stat st; - fstat(m_fd, &st); - m_size = st.st_size; - m_map = mmap(nullptr, m_size, PROT_READ, MAP_SHARED, m_fd, 0); - - if (m_map == MAP_FAILED) - perror(""); + if (fd == -1) { + perror("open"); + return; } + struct stat st; + fstat(fd, &st); + m_size = st.st_size; + m_map = mmap(nullptr, m_size, PROT_READ, MAP_SHARED, fd, 0); + + if (m_map == MAP_FAILED) + perror("mmap"); + #ifdef DEBUG_MAPPED_FILE - dbgprintf("MappedFile{%s} := { m_fd=%d, m_size=%u, m_map=%p }\n", file_name.characters(), m_fd, m_size, m_map); + dbgprintf("MappedFile{%s} := { fd=%d, m_size=%u, m_map=%p }\n", file_name.characters(), fd, m_size, m_map); #endif + + close(fd); } MappedFile::~MappedFile() @@ -39,23 +44,17 @@ void MappedFile::unmap() { if (!is_valid()) return; - ASSERT(m_fd != -1); int rc = munmap(m_map, m_size); ASSERT(rc == 0); - rc = close(m_fd); - ASSERT(rc == 0); m_size = 0; - m_fd = -1; m_map = (void*)-1; } MappedFile::MappedFile(MappedFile&& other) : m_size(other.m_size) - , m_fd(other.m_fd) , m_map(other.m_map) { other.m_size = 0; - other.m_fd = -1; other.m_map = (void*)-1; } @@ -65,7 +64,6 @@ MappedFile& MappedFile::operator=(MappedFile&& other) return *this; unmap(); swap(m_size, other.m_size); - swap(m_fd, other.m_fd); swap(m_map, other.m_map); return *this; } |