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