summaryrefslogtreecommitdiff
path: root/src/memory.c
blob: a1e48faccb7e87d132096f0dcc17a934d93eddf0 (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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/* Memory management routines.
 *
 * (C) 2003-2012 Anope Team
 * Contact us at team@anope.org
 *
 * Please read COPYING and README for further details.
 *
 * Based on the original code of Epona by Lara.
 * Based on the original code of Services by Andy Church. 
 * 
 *
 */

#include "services.h"

/* smalloc, scalloc, srealloc, sstrdup:
 *	Versions of the memory allocation functions which will cause the
 *	program to terminate with an "Out of memory" error if the memory
 *	cannot be allocated.  (Hence, the return value from these functions
 *	is never NULL.)
 */

/*************************************************************************/

/**
 * malloc, replacement so we can trap for "out of memory"
 * @param size to allocate
 * @return void
 */
void *smalloc(long size)
{
    void *buf;

    if (!size) {
        size = 1;
    }
    buf = malloc(size);
    if (!buf)
#ifndef _WIN32
        raise(SIGUSR1);
#else
        abort();
#endif
    return buf;
}

/*************************************************************************/

/**
 * calloc, replacement so we can trap for "out of memory"
 * @param elsize to allocate
 * @param els size of members
 * @return void
 */
void *scalloc(long elsize, long els)
{
    void *buf;

    if (!elsize || !els) {
        elsize = els = 1;
    }
    buf = calloc(elsize, els);
    if (!buf)
#ifndef _WIN32
        raise(SIGUSR1);
#else
        abort();
#endif
    return buf;
}

/*************************************************************************/

/**
 * realloc, replacement so we can trap for "out of memory"
 * @param oldptr Old Pointer
 * @param newsize Size of new pointer
 * @return void
 */
void *srealloc(void *oldptr, long newsize)
{
    void *buf;

    if (!newsize) {
        newsize = 1;
    }
    buf = realloc(oldptr, newsize);
    if (!buf)
#ifndef _WIN32
        raise(SIGUSR1);
#else
        abort();
#endif
    return buf;
}

/*************************************************************************/

/**
 * strdup, replacement so we can trap for "out of memory"
 * @param oldptr Old Pointer
 * @param newsize Size of new pointer
 * @return void
 */
char *sstrdup(const char *src)
{
    char *ret = NULL;
    if (src) {
#ifdef __STRICT_ANSI__
        if ((ret = (char *) malloc(strlen(src) + 1))) {;
            strcpy(ret, src);
        }
#else
        ret = strdup(src);
#endif
        if (!ret)
#ifndef _WIN32
            raise(SIGUSR1);
#else
            abort();
#endif
    } else {
        alog("sstrdup() called with NULL-arg");
        if (debug)
            do_backtrace(0);
    }

    return ret;
}

/*************************************************************************/
/*************************************************************************/

/* In the future: malloc() replacements that tell us if we're leaking and
 * maybe do sanity checks too... */

/*************************************************************************/