summaryrefslogtreecommitdiff
path: root/src/memory.c
diff options
context:
space:
mode:
authorsjaz <sjaz@5417fbe8-f217-4b02-8779-1006273d7864>2009-01-01 12:00:20 +0000
committersjaz <sjaz@5417fbe8-f217-4b02-8779-1006273d7864>2009-01-01 12:00:20 +0000
commitc777c8d9aa7cd5c2e9a399727a7fa9985a77fb1c (patch)
tree9e996ae4a1bbb833cec036c5cd4d87a590149e85 /src/memory.c
Anope Stable Branch
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/stable@1902 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'src/memory.c')
-rw-r--r--src/memory.c138
1 files changed, 138 insertions, 0 deletions
diff --git a/src/memory.c b/src/memory.c
new file mode 100644
index 000000000..056a29a76
--- /dev/null
+++ b/src/memory.c
@@ -0,0 +1,138 @@
+/* Memory management routines.
+ *
+ * (C) 2003-2008 Anope Team
+ * Contact us at info@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.
+ *
+ * $Id$
+ *
+ */
+
+#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... */
+
+/*************************************************************************/