aboutsummaryrefslogtreecommitdiff
path: root/analyzer/utils/memory.c
blob: 3e29671fdcc412a8a1e3155d061ef2186d3ccc9a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "memory.h"

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void *safe_malloc(size_t size) {
    for (size_t i = 0; i < MAX_ALLOC_ATTEMPTS; i++) {
        void *p = malloc(size);
        if (p)
            return p;
        if (i < MAX_ALLOC_ATTEMPTS - 1) {
            fprintf(stderr, "Failed malloc. Retrying in 1s...\n");
            sleep(1);
        }
    }

    fprintf(stderr, "FATAL: Failed malloc %d times. Exiting...", MAX_ALLOC_ATTEMPTS);
    exit(EXIT_FAILURE);
}

void *safe_realloc(void *ptr, size_t size) {
    if (!ptr)
        return safe_malloc(size);

    for (size_t i = 0; i < MAX_ALLOC_ATTEMPTS; i++) {
        void *p = realloc(ptr, size);
        if (p)
            return p;
        if (i < MAX_ALLOC_ATTEMPTS - 1) {
            fprintf(stderr, "Failed realloc. Retrying in 1s...\n");
            sleep(1);
        }
    }

    fprintf(stderr, "FATAL: Failed realloc %d times. Exiting...", MAX_ALLOC_ATTEMPTS);
    exit(EXIT_FAILURE);
}