mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-11 06:22:44 +08:00
76 lines
1.9 KiB
C++
76 lines
1.9 KiB
C++
//----------------------------------------------------------------------------
|
|
// Mem func. - Version 0.1.1 - 18-11-2004
|
|
// Marlon Mircevski
|
|
//----------------------------------------------------------------------------
|
|
#include "stdafx.h"
|
|
#include "ap_Mem.h"
|
|
|
|
namespace Aggplus
|
|
{
|
|
|
|
//Malloc func
|
|
void *ap_malloc_Aligned(size_t size, BYTE alignment)
|
|
{
|
|
BYTE *mem_ptr;
|
|
|
|
if(!alignment)
|
|
{
|
|
// We have not to satisfy any alignment
|
|
if((mem_ptr = (BYTE *) malloc(size + 1)) != NULL)
|
|
{
|
|
// Store (mem_ptr - "real allocated memory") in *(mem_ptr-1)
|
|
*mem_ptr = 0;
|
|
// Return the mem_ptr pointer
|
|
return (void *) mem_ptr++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
BYTE *tmp;
|
|
// Allocate the required size memory + alignment so we
|
|
// can realign the data if necessary
|
|
|
|
if((tmp = (BYTE *) malloc(size + alignment)) != NULL)
|
|
{
|
|
// Align the tmp pointer
|
|
mem_ptr = (BYTE *)((DWORD)(tmp + alignment - 1)&(~(DWORD)(alignment - 1)));
|
|
|
|
// Special case where malloc have already satisfied the alignment
|
|
// We must add alignment to mem_ptr because we must store
|
|
// (mem_ptr - tmp) in *(mem_ptr-1)
|
|
// If we do not add alignment to mem_ptr then *(mem_ptr-1) points
|
|
// to a forbidden memory space
|
|
|
|
if(mem_ptr == tmp) mem_ptr += alignment;
|
|
|
|
// (mem_ptr - tmp) is stored in *(mem_ptr-1) so we are able to retrieve
|
|
// the real malloc block allocated and free it in x_free
|
|
|
|
*(mem_ptr - 1) = (BYTE)(mem_ptr - tmp);
|
|
|
|
// Return the aligned pointer
|
|
return (void *) mem_ptr;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
// memory alloc
|
|
void *ap_malloc16(int size)
|
|
{
|
|
void *ptr = ap_malloc_Aligned(size, 16);
|
|
if(!ptr)
|
|
return NULL;
|
|
memset(ptr, 0, size);
|
|
return ptr;
|
|
}
|
|
|
|
// NOTE: ptr = NULL is explicetly allowed
|
|
void ap_free(void *ptr)
|
|
{
|
|
if(ptr)
|
|
free((BYTE*)ptr - *((BYTE*)ptr - 1));
|
|
}
|
|
|
|
}
|