Skip to content

Commit f55566f

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

File tree

1 file changed

+26
-6
lines changed

1 file changed

+26
-6
lines changed

src/core/others/ojph_file.cpp

Lines changed: 26 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,29 @@ namespace ojph {
198204
/** */
199205
void mem_outfile::expand_storage(size_t needed_size, bool clear_all)
200206
{
207+
u8 * 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+
size_t used_size = (size_t)tell(); // current used size
212+
213+
#ifdef OJPH_OS_WINDOWS
214+
new_buf = (ui8*)_aligned_malloc(4096, needed_size);
215+
#else
216+
new_buf = (ui8*)aligned_alloc(4096, needed_size);
217+
#endif
218+
if (new_buf == nullptr)
219+
OJPH_ERROR(0x00060004, "failed to allocate memory (%zu bytes)", needed_size);
220+
221+
if (this->buf != nullptr && this->buf != new_buf && !clear_all){
222+
memcpy(new_buf, this->buf, used_size);
223+
#ifdef OJPH_OS_WINDOWS
224+
_aligned_free(this->buf);
225+
#else
226+
free(this->buf);
227+
#endif
228+
}
229+
this->buf = new_buf;
210230

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

0 commit comments

Comments
 (0)