aboutsummaryrefslogtreecommitdiff
path: root/src/mem
diff options
context:
space:
mode:
authorMosder <xmosder12@gmail.com>2026-07-31 14:50:59 +0200
committerMosder <xmosder12@gmail.com>2026-07-31 14:50:59 +0200
commit4f4466155b6d9b5259ccd956551a675ad693e773 (patch)
treea6d1f2ebe2c8ac169b675e2ab6d4d8a3c3a09075 /src/mem
parentc5ed6021ca7715adafb5cac1a5d5581d69eb5589 (diff)
feat: created safe_malloc and safe_realloc
Diffstat (limited to 'src/mem')
-rw-r--r--src/mem/alloc.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/mem/alloc.c b/src/mem/alloc.c
index e69de29..7acea02 100644
--- a/src/mem/alloc.c
+++ b/src/mem/alloc.c
@@ -0,0 +1,44 @@
+#include "moslib/mem/alloc.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#define ERR_MESS(fl, ln, fn, msg) "%s:%d - error in function %s:\n%s\n", fl, ln, fn, msg
+
+void *safe_malloc_fn(size_t size, const char *file, int line, const char *func) {
+ for (size_t i = 0; i < MOSLIB_MAX_ALLOC_ATTEMPTS; i++) {
+ void *p = malloc(size);
+ if (p)
+ return p;
+ if (i < MOSLIB_MAX_ALLOC_ATTEMPTS - 1) {
+ fprintf(stderr, ERR_MESS(file, line, func, "malloc failed - retrying in 1s..."));
+ sleep(1);
+ }
+ }
+
+ char errmes[64];
+ sprintf(errmes, "FATAL: malloc failed %d times - exiting...", MOSLIB_MAX_ALLOC_ATTEMPTS);
+ fprintf(stderr, ERR_MESS(file, line, func, errmes));
+ exit(EXIT_FAILURE);
+}
+
+void *safe_realloc_fn(void *ptr, size_t size, const char *file, int line, const char *func) {
+ if (!ptr)
+ return safe_malloc_fn(size, file, line, func);
+
+ for (size_t i = 0; i < MOSLIB_MAX_ALLOC_ATTEMPTS; i++) {
+ void *p = realloc(ptr, size);
+ if (p)
+ return p;
+ if (i < MOSLIB_MAX_ALLOC_ATTEMPTS - 1) {
+ fprintf(stderr, ERR_MESS(file, line, func, "realloc failed - retrying in 1s..."));
+ sleep(1);
+ }
+ }
+
+ char errmes[64];
+ sprintf(errmes, "FATAL: realloc failed %d times - exiting...", MOSLIB_MAX_ALLOC_ATTEMPTS);
+ fprintf(stderr, ERR_MESS(file, line, func, errmes));
+ exit(EXIT_FAILURE);
+}