summaryrefslogtreecommitdiff
path: root/src/common/memmgr.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/memmgr.h')
-rw-r--r--src/common/memmgr.h89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/common/memmgr.h b/src/common/memmgr.h
new file mode 100644
index 000000000..b194c7cf3
--- /dev/null
+++ b/src/common/memmgr.h
@@ -0,0 +1,89 @@
+// Copyright (c) Athena Dev Teams - Licensed under GNU GPL
+// For more information, see LICENCE in the main folder
+
+#ifndef COMMON_MALLOC_H
+#define COMMON_MALLOC_H
+
+#include "common/hercules.h"
+
+#define ALC_MARK __FILE__, __LINE__, __func__
+
+
+// default use of the built-in memory manager
+#if !defined(NO_MEMMGR) && !defined(USE_MEMMGR)
+#if defined(MEMWATCH) || defined(DMALLOC) || defined(GCOLLECT)
+// disable built-in memory manager when using another memory library
+#define NO_MEMMGR
+#else
+// use built-in memory manager by default
+#define USE_MEMMGR
+#endif
+#endif
+
+
+//////////////////////////////////////////////////////////////////////
+// Enable memory manager logging by default
+#define LOG_MEMMGR
+
+// no logging for minicore
+#if defined(MINICORE) && defined(LOG_MEMMGR)
+ #undef LOG_MEMMGR
+#endif
+
+# define aMalloc(n) (iMalloc->malloc((n),ALC_MARK))
+# define aCalloc(m,n) (iMalloc->calloc((m),(n),ALC_MARK))
+# define aRealloc(p,n) (iMalloc->realloc((p),(n),ALC_MARK))
+# define aReallocz(p,n) (iMalloc->reallocz((p),(n),ALC_MARK))
+# define aStrdup(p) (iMalloc->astrdup((p),ALC_MARK))
+# define aFree(p) (iMalloc->free((p),ALC_MARK))
+
+/////////////// Buffer Creation /////////////////
+// Full credit for this goes to Shinomori [Ajarn]
+
+#ifdef __GNUC__ // GCC has variable length arrays
+
+#define CREATE_BUFFER(name, type, size) type name[size]
+#define DELETE_BUFFER(name)
+
+#else // others don't, so we emulate them
+
+#define CREATE_BUFFER(name, type, size) type *name = (type *) aCalloc((size), sizeof(type))
+#define DELETE_BUFFER(name) aFree(name)
+
+#endif
+
+////////////// Others //////////////////////////
+// should be merged with any of above later
+#define CREATE(result, type, number) ((result) = (type *) aCalloc((number), sizeof(type)))
+#define RECREATE(result, type, number) ((result) = (type *) aReallocz((result), sizeof(type) * (number)))
+
+////////////////////////////////////////////////
+
+struct malloc_interface {
+ void (*init) (void);
+ void (*final) (void);
+ /* */
+ void* (*malloc)(size_t size, const char *file, int line, const char *func);
+ void* (*calloc)(size_t num, size_t size, const char *file, int line, const char *func);
+ void* (*realloc)(void *p, size_t size, const char *file, int line, const char *func);
+ void* (*reallocz)(void *p, size_t size, const char *file, int line, const char *func);
+ char* (*astrdup)(const char *p, const char *file, int line, const char *func);
+ void (*free)(void *p, const char *file, int line, const char *func);
+ /* */
+ void (*memory_check)(void);
+ bool (*verify_ptr)(void* ptr);
+ size_t (*usage) (void);
+ /* */
+ void (*post_shutdown) (void);
+ void (*init_messages) (void);
+};
+
+#ifdef HERCULES_CORE
+void malloc_defaults(void);
+
+void memmgr_report(int extra);
+#endif // HERCULES_CORE
+
+HPShared struct malloc_interface *iMalloc;
+
+#endif /* COMMON_MALLOC_H */