/* 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; }