diff options
author | Steve Bennett <steveb@workware.net.au> | 2016-04-01 08:56:23 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2023-02-13 10:43:00 +1000 |
commit | db26fe46ea9a35d403067498f4b85eee82b431b0 (patch) | |
tree | 594a0c3f670ea91500c763220d4aca65d8bc53fc | |
parent | d30183cbf77bce87ed5d96c1021e9521ac10c015 (diff) | |
download | jimtcl-db26fe46ea9a35d403067498f4b85eee82b431b0.zip jimtcl-db26fe46ea9a35d403067498f4b85eee82b431b0.tar.gz jimtcl-db26fe46ea9a35d403067498f4b85eee82b431b0.tar.bz2 |
jim: make the Jim memory allocator replaceable
Allows for a specialised allocator or debugging allocator.
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r-- | jim.c | 25 | ||||
-rw-r--r-- | jim.h | 16 |
2 files changed, 25 insertions, 16 deletions
@@ -660,24 +660,25 @@ static void JimPanicDump(int condition, const char *fmt, ...) * Memory allocation * ---------------------------------------------------------------------------*/ -void *Jim_Alloc(int size) +void *JimDefaultAllocator(void *ptr, size_t size) { - return size ? malloc(size) : NULL; -} - -void Jim_Free(void *ptr) -{ - free(ptr); + if (size == 0) { + free(ptr); + return NULL; + } + else if (ptr) { + return realloc(ptr, size); + } + else { + return malloc(size); + } } -void *Jim_Realloc(void *ptr, int size) -{ - return realloc(ptr, size); -} +void *(*Jim_Allocator)(void *ptr, size_t size) = JimDefaultAllocator; char *Jim_StrDup(const char *s) { - return strdup(s); + return Jim_StrDupLen(s, strlen(s)); } char *Jim_StrDupLen(const char *s, int l) @@ -627,12 +627,20 @@ typedef struct Jim_Reference { #define Jim_NewEmptyStringObj(i) Jim_NewStringObj(i, "", 0) #define Jim_FreeHashTableIterator(iter) Jim_Free(iter) -#define JIM_EXPORT +#define JIM_EXPORT extern /* Memory allocation */ -JIM_EXPORT void *Jim_Alloc (int size); -JIM_EXPORT void *Jim_Realloc(void *ptr, int size); -JIM_EXPORT void Jim_Free (void *ptr); + +/* The default Jim Allocator can be replaced by assigning to Jim_Allocator. + * This function does malloc/realloc/free depending on the arguments. + * If size is 0, ptr is freed. + * Otherwise malloc or realloc is done depending on whether ptr is NULL. + */ +JIM_EXPORT void *(*Jim_Allocator)(void *ptr, size_t size); + +#define Jim_Free(P) Jim_Allocator((P), 0) +#define Jim_Realloc(P, S) Jim_Allocator((P), (S)) +#define Jim_Alloc(S) Jim_Allocator(NULL, (S)) JIM_EXPORT char * Jim_StrDup (const char *s); JIM_EXPORT char *Jim_StrDupLen(const char *s, int l); |