Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions src/core/common/ojph_mem.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,29 @@

namespace ojph {

////////////////////////////////////////////////////////////////////////////
#ifdef OJPH_COMPILER_MSVC
inline void* ojph_aligned_malloc(size_t alignment, size_t size)
{
return _aligned_malloc(size, alignment);
}

inline void ojph_aligned_free(void* pointer)
{
return _aligned_free(pointer);
}
#else
inline void* ojph_aligned_malloc(size_t alignment, size_t size)
{
return aligned_alloc(alignment, size);
}

inline void ojph_aligned_free(void* pointer)
{
return free(pointer);
}
#endif

/////////////////////////////////////////////////////////////////////////////
class mem_fixed_allocator
{
Expand Down
33 changes: 27 additions & 6 deletions src/core/others/ojph_file.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@
#include <cassert>
#include <cstddef>

#include <stdlib.h>

#include "ojph_file.h"
#include "ojph_message.h"

Expand Down Expand Up @@ -110,7 +112,11 @@ namespace ojph {
mem_outfile::~mem_outfile()
{
if (buf)
#ifdef OJPH_OS_WINDOWS
_aligned_free(buf);
#else
free(buf);
#endif
is_open = clear_mem = false;
buf_size = used_size = 0;
buf = cur_ptr = NULL;
Expand Down Expand Up @@ -198,15 +204,30 @@ namespace ojph {
/** */
void mem_outfile::expand_storage(size_t needed_size, bool clear_all)
{
ui8 * new_buf = nullptr;
if (needed_size > buf_size)
{
needed_size += (needed_size + 1) >> 1; // x1.5
si64 used_size = tell(); // current used size

if (this->buf)
this->buf = (ui8*)realloc(this->buf, needed_size);
else
this->buf = (ui8*)malloc(needed_size);
needed_size = (needed_size + 4095) & (~4095); // align to 4096
size_t used_size = (size_t)tell(); // current used size

#ifdef OJPH_OS_WINDOWS
new_buf = (ui8*)_aligned_malloc(4096, needed_size);
#else
new_buf = (ui8*)aligned_alloc(4096, needed_size);
#endif
if (new_buf == nullptr)
OJPH_ERROR(0x00060004, "failed to allocate memory (%zu bytes)", needed_size);

if (this->buf != nullptr && this->buf != new_buf && !clear_all){
memcpy(new_buf, this->buf, used_size);
#ifdef OJPH_OS_WINDOWS
_aligned_free(this->buf);
#else
free(this->buf);
#endif
}
this->buf = new_buf;

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