aboutsummaryrefslogtreecommitdiff
path: root/libcrystfel
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2024-01-16 12:00:20 +0100
committerThomas White <taw@physics.org>2024-02-06 16:59:34 +0100
commit5960cc81e3e35e4d38fdd720680c98bef070d695 (patch)
tree00e009da3728c4d7a8d306ae7dbea74d11e86c8f /libcrystfel
parent9ad42732052c3e2ff41c00bed8b5cec013c8941e (diff)
Add hooks for custom memory allocation in libcrystfel
Diffstat (limited to 'libcrystfel')
-rw-r--r--libcrystfel/src/utils.c96
-rw-r--r--libcrystfel/src/utils.h14
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);