blob: 015b6e78cb7d3cb49e0e5ccdb8aa3b719352d38f [file] [log] [blame]
/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
* See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
*
* Copyright 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
*/
#include "bufmalloc.h"
#define MALLOCMEMBUFSIZE 16384
/* Every element has the memory layout [length (size_t) | buf (length * sizeof(char)) ... ].
* The pointer to buf is returned. */
static char membuf[MALLOCMEMBUFSIZE];
static size_t pos;
static void * membufMalloc(size_t size) {
if(pos + size + sizeof(size_t) > MALLOCMEMBUFSIZE)
return NULL;
char *begin = &membuf[pos];
*((size_t*)begin) = size;
pos += size + sizeof(size_t);
return &begin[sizeof(size_t)];
}
static void membufFree(void *ptr) {
/* Don't do anyting */
}
static void * membufCalloc(size_t nelem, size_t elsize) {
size_t total = nelem * elsize;
void *mem = membufMalloc(total);
if(!mem)
return NULL;
memset(mem, 0, total);
return mem;
}
static void * (membufRealloc)(void *ptr, size_t size) {
size_t orig_size = ((size_t*)ptr)[-1];
if(size <= orig_size)
return ptr;
void *mem = membufMalloc(size);
if(!mem)
return NULL;
memcpy(mem, ptr, orig_size);
return mem;
}
void resetMembuf(void) {
pos = 0;
}
void useMembufAlloc(void) {
pos = 0;
UA_globalMalloc = membufMalloc;
UA_globalFree = membufFree;
UA_globalCalloc = membufCalloc;
UA_globalRealloc = membufRealloc;
}
void useNormalAlloc(void) {
UA_globalMalloc = malloc;
UA_globalFree = free;
UA_globalCalloc = calloc;
UA_globalRealloc = realloc;
}