summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-04-03 13:51:49 +0200
committerAndreas Kling <awesomekling@gmail.com>2019-04-03 13:51:49 +0200
commit3dc3754cdebd369fea0e57d899bf0e4ee2debc2b (patch)
tree16a868b3060243f8f003843b4c249f5df9d770b8
parentab6bd3872bd4024a008746dc2c36a59ff8522d2c (diff)
downloadserenity-3dc3754cdebd369fea0e57d899bf0e4ee2debc2b.zip
Font: Clean up AK::MappedFile and use it for mapping font files.
-rw-r--r--AK/MappedFile.cpp45
-rw-r--r--AK/MappedFile.h5
-rw-r--r--LibC/Makefile1
-rw-r--r--SharedGraphics/Font.cpp27
-rw-r--r--SharedGraphics/Font.h7
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 };