mirror of
https://github.com/open62541/open62541.git
synced 2026-10-20 07:20:58 +08:00
67 lines
1.6 KiB
C
67 lines
1.6 KiB
C
/* 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;
|
|
}
|