diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-04-03 13:51:49 +0200 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-04-03 13:51:49 +0200 |
commit | 3dc3754cdebd369fea0e57d899bf0e4ee2debc2b (patch) | |
tree | 16a868b3060243f8f003843b4c249f5df9d770b8 | |
parent | ab6bd3872bd4024a008746dc2c36a59ff8522d2c (diff) | |
download | serenity-3dc3754cdebd369fea0e57d899bf0e4ee2debc2b.zip |
Font: Clean up AK::MappedFile and use it for mapping font files.
-rw-r--r-- | AK/MappedFile.cpp | 45 | ||||
-rw-r--r-- | AK/MappedFile.h | 5 | ||||
-rw-r--r-- | LibC/Makefile | 1 | ||||
-rw-r--r-- | SharedGraphics/Font.cpp | 27 | ||||
-rw-r--r-- | SharedGraphics/Font.h | 7 |
5 files changed, 48 insertions, 37 deletions
diff --git a/AK/MappedFile.cpp b/AK/MappedFile.cpp index 3cf7570bc1..e279ad12e8 100644 --- a/AK/MappedFile.cpp +++ b/AK/MappedFile.cpp @@ -1,15 +1,16 @@ -#include "MappedFile.h" +#include <AK/MappedFile.h> #include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> -#include <cstdio> +#include <unistd.h> +#include <stdio.h> namespace AK { -MappedFile::MappedFile(String&& file_name) - : m_file_name(std::move(file_name)) +MappedFile::MappedFile(const String& file_name) + : m_file_name(file_name) { - m_file_length = 1024; + m_file_length = PAGE_SIZE; m_fd = open(m_file_name.characters(), O_RDONLY); if (m_fd != -1) { @@ -22,19 +23,29 @@ MappedFile::MappedFile(String&& file_name) perror(""); } - printf("MappedFile{%s} := { m_fd=%d, m_file_length=%zu, m_map=%p }\n", m_file_name.characters(), m_fd, m_file_length, m_map); + dbgprintf("MappedFile{%s} := { m_fd=%d, m_file_length=%zu, m_map=%p }\n", m_file_name.characters(), m_fd, m_file_length, m_map); } MappedFile::~MappedFile() { - if (m_map != (void*)-1) { - ASSERT(m_fd != -1); - munmap(m_map, m_file_length); - } + unmap(); +} + +void MappedFile::unmap() +{ + if (!is_valid()) + return; + ASSERT(m_fd != -1); + int rc = munmap(m_map, m_file_length); + ASSERT(rc == 0); + m_file_name = { }; + m_file_length = 0; + m_fd = -1; + m_map = (void*)-1; } MappedFile::MappedFile(MappedFile&& other) - : m_file_name(std::move(other.m_file_name)) + : m_file_name(move(other.m_file_name)) , m_file_length(other.m_file_length) , m_fd(other.m_fd) , m_map(other.m_map) @@ -44,5 +55,17 @@ MappedFile::MappedFile(MappedFile&& other) other.m_map = (void*)-1; } +MappedFile& MappedFile::operator=(MappedFile&& other) +{ + if (this == &other) + return *this; + unmap(); + swap(m_file_name, other.m_file_name); + swap(m_file_length, other.m_file_length); + swap(m_fd, other.m_fd); + swap(m_map, other.m_map); + return *this; +} + } diff --git a/AK/MappedFile.h b/AK/MappedFile.h index 5eee9ed939..246913a27d 100644 --- a/AK/MappedFile.h +++ b/AK/MappedFile.h @@ -7,11 +7,14 @@ namespace AK { class MappedFile { public: MappedFile() { } - explicit MappedFile(String&& file_name); + explicit MappedFile(const String& file_name); MappedFile(MappedFile&&); ~MappedFile(); + MappedFile& operator=(MappedFile&&); + bool is_valid() const { return m_map != (void*)-1; } + void unmap(); void* pointer() { return m_map; } const void* pointer() const { return m_map; } diff --git a/LibC/Makefile b/LibC/Makefile index d75ef1f585..6910d70cab 100644 --- a/LibC/Makefile +++ b/LibC/Makefile @@ -4,6 +4,7 @@ AK_OBJS = \ ../AK/StringBuilder.o \ ../AK/FileSystemPath.o \ ../AK/StdLibExtras.o \ + ../AK/MappedFile.o \ ../AK/kmalloc.o LIBC_OBJS = \ diff --git a/SharedGraphics/Font.cpp b/SharedGraphics/Font.cpp index a2aea930b5..a7748a930a 100644 --- a/SharedGraphics/Font.cpp +++ b/SharedGraphics/Font.cpp @@ -2,7 +2,7 @@ #include <AK/kmalloc.h> #include <AK/BufferStream.h> #include <AK/StdLibExtras.h> - +#include <AK/MappedFile.h> #include <LibC/unistd.h> #include <LibC/stdio.h> #include <LibC/fcntl.h> @@ -90,10 +90,6 @@ Font::Font(const String& name, unsigned* rows, byte* widths, bool is_fixed_width Font::~Font() { - if (m_mmap_ptr) { - int rc = munmap(m_mmap_ptr, 4096 * 3); - ASSERT(rc == 0); - } } RetainPtr<Font> Font::load_from_memory(const byte* data) @@ -119,25 +115,12 @@ RetainPtr<Font> Font::load_from_memory(const byte* data) RetainPtr<Font> Font::load_from_file(const String& path) { - int fd = open(path.characters(), O_RDONLY, 0644); - if (fd < 0) { - dbgprintf("open(%s) got fd=%d, failed: %s\n", path.characters(), fd, strerror(errno)); - perror("open"); + MappedFile mapped_file(path); + if (!mapped_file.is_valid()) return nullptr; - } - auto* mapped_file = (byte*)mmap(nullptr, 4096 * 3, PROT_READ, MAP_SHARED, fd, 0); - if (mapped_file == MAP_FAILED) { - int rc = close(fd); - ASSERT(rc == 0); - return nullptr; - } - - auto font = load_from_memory(mapped_file); - font->m_mmap_ptr = mapped_file; - - int rc = close(fd); - ASSERT(rc == 0); + auto font = load_from_memory((const byte*)mapped_file.pointer()); + font->m_mapped_file = move(mapped_file); return font; } diff --git a/SharedGraphics/Font.h b/SharedGraphics/Font.h index e972974c78..5919bbebe7 100644 --- a/SharedGraphics/Font.h +++ b/SharedGraphics/Font.h @@ -4,6 +4,7 @@ #include <AK/Retainable.h> #include <AK/RetainPtr.h> #include <AK/AKString.h> +#include <AK/MappedFile.h> #include <AK/Types.h> // FIXME: Make a MutableGlyphBitmap buddy class for FontEditor instead? @@ -47,8 +48,6 @@ public: RetainPtr<Font> clone() const; - static RetainPtr<Font> load_from_memory(const byte*); - static RetainPtr<Font> load_from_file(const String& path); bool write_to_file(const String& path); @@ -78,11 +77,13 @@ public: private: Font(const String& name, unsigned* rows, byte* widths, bool is_fixed_width, byte glyph_width, byte glyph_height); + static RetainPtr<Font> load_from_memory(const byte*); + String m_name; unsigned* m_rows { nullptr }; byte* m_glyph_widths { nullptr }; - void* m_mmap_ptr { nullptr }; + MappedFile m_mapped_file; byte m_glyph_width { 0 }; byte m_glyph_height { 0 }; |