Buffer owns the file buffer

This commit is contained in:
Josh Holtrop 2016-07-14 20:06:22 -04:00
parent 5f8bbcfca4
commit cae0b581a2
2 changed files with 33 additions and 7 deletions

View File

@ -4,6 +4,20 @@
#include "File.h" #include "File.h"
#include "FileLoader.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) bool Buffer::load_from_file(const char * filename)
{ {
File file; File file;
@ -18,23 +32,22 @@ bool Buffer::load_from_file(const char * filename)
return false; return false;
} }
unsigned long file_buffer_size = ((unsigned long)file_size + System::page_size - 1u) & System::page_base_mask; m_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); m_file_buffer = (uint8_t *)System::alloc_pages(m_file_buffer_size >> System::page_size_log);
if (file_buffer == NULL) if (m_file_buffer == NULL)
{ {
return false; 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; return false;
} }
/* TODO: record file_buffer for freeing */
/* TODO: remove FileLoader */ /* TODO: remove FileLoader */
FileLoader fl; 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++) for (size_t i = 0, num_lines = fl.num_lines(); i < num_lines; i++)
{ {
m_lines.push_back(fl.get_line(i)); m_lines.push_back(fl.get_line(i));
@ -42,3 +55,10 @@ bool Buffer::load_from_file(const char * filename)
return true; 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;
}

View File

@ -8,6 +8,8 @@
class Buffer class Buffer
{ {
public: public:
Buffer();
~Buffer();
bool load_from_file(const char * filename); bool load_from_file(const char * filename);
typedef std::shared_ptr<Text> LineType; typedef std::shared_ptr<Text> LineType;
@ -26,6 +28,10 @@ public:
protected: protected:
LinesType m_lines; LinesType m_lines;
uint8_t * m_file_buffer;
unsigned long m_file_buffer_size;
void free_file_buffer();
}; };
#endif #endif