diff --git a/src/core/Buffer.cc b/src/core/Buffer.cc index 928d07e..49aeeb7 100644 --- a/src/core/Buffer.cc +++ b/src/core/Buffer.cc @@ -4,6 +4,20 @@ #include "File.h" #include "FileLoader.h" +Buffer::Buffer() +{ + m_file_buffer = nullptr; + m_file_buffer_size = 0u; +} + +Buffer::~Buffer() +{ + if (m_file_buffer != nullptr) + { + free_file_buffer(); + } +} + bool Buffer::load_from_file(const char * filename) { File file; @@ -18,23 +32,22 @@ bool Buffer::load_from_file(const char * filename) return false; } - unsigned long file_buffer_size = ((unsigned long)file_size + System::page_size - 1u) & System::page_base_mask; - uint8_t * file_buffer = (uint8_t *)System::alloc_pages(file_buffer_size >> System::page_size_log); - if (file_buffer == NULL) + m_file_buffer_size = ((unsigned long)file_size + System::page_size - 1u) & System::page_base_mask; + m_file_buffer = (uint8_t *)System::alloc_pages(m_file_buffer_size >> System::page_size_log); + if (m_file_buffer == NULL) { return false; } - if (!file.read(file_buffer, file_size)) + if (!file.read(m_file_buffer, file_size)) { - System::free_pages(file_buffer, file_buffer_size >> System::page_size_log); + free_file_buffer(); return false; } - /* TODO: record file_buffer for freeing */ /* TODO: remove FileLoader */ FileLoader fl; - fl.load_buf(file_buffer, file_size); + fl.load_buf(m_file_buffer, file_size); for (size_t i = 0, num_lines = fl.num_lines(); i < num_lines; i++) { m_lines.push_back(fl.get_line(i)); @@ -42,3 +55,10 @@ bool Buffer::load_from_file(const char * filename) return true; } + +void Buffer::free_file_buffer() +{ + System::free_pages(m_file_buffer, m_file_buffer_size >> System::page_size_log); + m_file_buffer = nullptr; + m_file_buffer_size = 0u; +} diff --git a/src/core/Buffer.h b/src/core/Buffer.h index 04c1de1..b6ad56a 100644 --- a/src/core/Buffer.h +++ b/src/core/Buffer.h @@ -8,6 +8,8 @@ class Buffer { public: + Buffer(); + ~Buffer(); bool load_from_file(const char * filename); typedef std::shared_ptr LineType; @@ -26,6 +28,10 @@ public: protected: LinesType m_lines; + uint8_t * m_file_buffer; + unsigned long m_file_buffer_size; + + void free_file_buffer(); }; #endif