diff options
author | Thomas White <taw@physics.org> | 2024-01-16 12:00:20 +0100 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2024-02-06 16:59:34 +0100 |
commit | 5960cc81e3e35e4d38fdd720680c98bef070d695 (patch) | |
tree | 00e009da3728c4d7a8d306ae7dbea74d11e86c8f | |
parent | 9ad42732052c3e2ff41c00bed8b5cec013c8941e (diff) |
Add hooks for custom memory allocation in libcrystfel
-rw-r--r-- | libcrystfel/src/utils.c | 96 | ||||
-rw-r--r-- | libcrystfel/src/utils.h | 14 |
2 files changed, 91 insertions, 19 deletions
diff --git a/libcrystfel/src/utils.c b/libcrystfel/src/utils.c index 44faa7ee..04e028e9 100644 --- a/libcrystfel/src/utils.c +++ b/libcrystfel/src/utils.c @@ -375,6 +375,83 @@ void ERROR(const char *format, ...) } +/* ---------------------------- Memory management --------------------------- */ + +struct _mmconf { + void *(*malloc)(size_t size); + void (*free)(void *ptr); + void *(*calloc)(size_t nmemb, size_t size); + void *(*realloc)(void *ptr, size_t size); +} mm_conf = { malloc, free, calloc, realloc }; + +void *cfmalloc(size_t size) +{ + return mm_conf.malloc(size); +} + +void cffree(void *ptr) +{ + mm_conf.free(ptr); +} + +void *cfcalloc(size_t nmemb, size_t size) +{ + return mm_conf.calloc(nmemb, size); +} + +void *cfrealloc(void *ptr, size_t size) +{ + return mm_conf.realloc(ptr, size); +} + +int set_mm_funcs(void *(*cfmalloc)(size_t size), + void (*cffree)(void *ptr), + void *(*cfcalloc)(size_t nmemb, size_t size), + void *(*cfrealloc)(void *ptr, size_t size)) +{ + mm_conf.malloc = cfmalloc; + mm_conf.free = cffree; + mm_conf.calloc = cfcalloc; + mm_conf.realloc = cfrealloc; + return 0; +} + +char *cfstrdup(const char *s) +{ + size_t l = strlen(s); + char *r = cfmalloc(l+1); + if ( r == NULL ) return NULL; + strcpy(r, s); + return r; +} + +char *cfstrndup(const char *s, size_t n) +{ + char *r = cfmalloc(n+1); + if ( r == NULL ) return NULL; + strncpy(r, s, n); + r[n] = '\0'; + return r; +} + +void *srealloc(void *arr, size_t new_size) +{ + void *new_arr = realloc(arr, new_size); + if ( new_arr == NULL ) { + free(arr); + return NULL; + } else { + return new_arr; + } +} + +char *safe_strdup(const char *in) +{ + if ( in == NULL ) return NULL; + return strdup(in); +} + + /* ------------------------------ Useful functions ---------------------------- */ int convert_int(const char *str, int *pval) @@ -672,13 +749,6 @@ char *check_prefix(char *prefix) } -char *safe_strdup(const char *in) -{ - if ( in == NULL ) return NULL; - return strdup(in); -} - - char *safe_basename(const char *in) { int i; @@ -957,18 +1027,6 @@ int compare_double(const void *av, const void *bv) } -void *srealloc(void *arr, size_t new_size) -{ - void *new_arr = realloc(arr, new_size); - if ( new_arr == NULL ) { - free(arr); - return NULL; - } else { - return new_arr; - } -} - - /* -------------------------- libcrystfel features ------------------------ */ int crystfel_has_peakfinder9() diff --git a/libcrystfel/src/utils.h b/libcrystfel/src/utils.h index cb68069e..30a7c4ef 100644 --- a/libcrystfel/src/utils.h +++ b/libcrystfel/src/utils.h @@ -239,6 +239,20 @@ extern void set_log_message_func(LogMsgFunc new_log_msg_func, void *vp); +/* ---------------------------- Memory management --------------------------- */ + +extern void *cfmalloc(size_t size); +extern void cffree(void *ptr); +extern void *cfcalloc(size_t nmemb, size_t size); +extern void *cfrealloc(void *ptr, size_t size); +extern char *cfstrdup(const char *s); +extern char *cfstrndup(const char *s, size_t n); +extern int set_mm_funcs(void *(*cfmalloc)(size_t size), + void (*cffree)(void *ptr), + void *(*cfcalloc)(size_t nmemb, size_t size), + void *(*cfrealloc)(void *ptr, size_t size)); + + /* ------------------------------ File handling ----------------------------- */ extern char *check_prefix(char *prefix); |