diff options
| author | Mosder <xmosder12@gmail.com> | 2026-07-31 14:50:59 +0200 |
|---|---|---|
| committer | Mosder <xmosder12@gmail.com> | 2026-07-31 14:50:59 +0200 |
| commit | 4f4466155b6d9b5259ccd956551a675ad693e773 (patch) | |
| tree | a6d1f2ebe2c8ac169b675e2ab6d4d8a3c3a09075 /src | |
| parent | c5ed6021ca7715adafb5cac1a5d5581d69eb5589 (diff) | |
feat: created safe_malloc and safe_realloc
Diffstat (limited to 'src')
| -rw-r--r-- | src/mem/alloc.c | 44 |
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); +} |
