Skip to content

Commit b7386c3

Browse files
committed
Use an aligned memory allocator for the memfile
1 parent be997ab commit b7386c3

File tree

1 file changed

+27
-6
lines changed

1 file changed

+27
-6
lines changed

src/core/others/ojph_file.cpp

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
#include <cassert>
4444
#include <cstddef>
4545

46+
#include <stdlib.h>
47+
4648
#include "ojph_file.h"
4749
#include "ojph_message.h"
4850

@@ -110,7 +112,11 @@ namespace ojph {
110112
mem_outfile::~mem_outfile()
111113
{
112114
if (buf)
115+
#ifdef OJPH_OS_WINDOWS
116+
_aligned_free(buf);
117+
#else
113118
free(buf);
119+
#endif
114120
is_open = clear_mem = false;
115121
buf_size = used_size = 0;
116122
buf = cur_ptr = NULL;
@@ -198,15 +204,30 @@ namespace ojph {
198204
/** */
199205
void mem_outfile::expand_storage(size_t needed_size, bool clear_all)
200206
{
207+
ui8 * new_buf = nullptr;
201208
if (needed_size > buf_size)
202209
{
203210
needed_size += (needed_size + 1) >> 1; // x1.5
204-
si64 used_size = tell(); // current used size
205-
206-
if (this->buf)
207-
this->buf = (ui8*)realloc(this->buf, needed_size);
208-
else
209-
this->buf = (ui8*)malloc(needed_size);
211+
needed_size = (needed_size + 4095) & (~4095); // align to 4096
212+
size_t used_size = (size_t)tell(); // current used size
213+
214+
#ifdef OJPH_OS_WINDOWS
215+
new_buf = (ui8*)_aligned_malloc(4096, needed_size);
216+
#else
217+
new_buf = (ui8*)aligned_alloc(4096, needed_size);
218+
#endif
219+
if (new_buf == nullptr)
220+
OJPH_ERROR(0x00060004, "failed to allocate memory (%zu bytes)", needed_size);
221+
222+
if (this->buf != nullptr && this->buf != new_buf && !clear_all){
223+
memcpy(new_buf, this->buf, used_size);
224+
#ifdef OJPH_OS_WINDOWS
225+
_aligned_free(this->buf);
226+
#else
227+
free(this->buf);
228+
#endif
229+
}
230+
this->buf = new_buf;
210231

211232
if (clear_mem && !clear_all) // will be cleared later
212233
memset(this->buf + buf_size, 0, needed_size - this->buf_size);

0 commit comments

Comments
 (0)