aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/memmgr/api_memmgr.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/api/memmgr/api_memmgr.h')
-rw-r--r--Src/Wasabi/api/memmgr/api_memmgr.h78
1 files changed, 78 insertions, 0 deletions
diff --git a/Src/Wasabi/api/memmgr/api_memmgr.h b/Src/Wasabi/api/memmgr/api_memmgr.h
new file mode 100644
index 00000000..301d8baa
--- /dev/null
+++ b/Src/Wasabi/api/memmgr/api_memmgr.h
@@ -0,0 +1,78 @@
+#ifndef __API_MEMMGR_H
+#define __API_MEMMGR_H
+
+#include <bfc/dispatch.h>
+#include <bfc/platform/types.h>
+#include <new>
+class NOVTABLE api_memmgr : public Dispatchable
+{
+protected:
+ api_memmgr() {}
+ ~api_memmgr() {}
+
+public:
+ void *sysMalloc(size_t size);
+ void sysFree(void *ptr);
+ void *sysRealloc(void *ptr, size_t newsize);
+ void sysMemChanged(void *ptr);
+
+ DISPATCH_CODES
+ {
+ API_MEMMGR_SYSMALLOC = 0,
+ API_MEMMGR_SYSFREE = 10,
+ API_MEMMGR_SYSREALLOC = 20,
+ API_MEMMGR_SYSMEMCHANGED = 30,
+ };
+
+ // Some helper templates to new and delete objects with the memory manager
+ // you need to be cautious with Delete() and inheritance, particularly if you're dealing with a base class
+ // as the pointer to the derived class might not equal to the pointer to the base class, particularly with multiple inheritance
+ // e.g. class C : public A, public B {}; C c; assert((A*)&c == (B*)&c); will likely fail
+
+ template <class Class>
+ void New(Class **obj)
+ {
+ size_t toAlloc = sizeof(Class);
+ void *mem = sysMalloc(toAlloc);
+ *obj = new (mem) Class;
+ }
+
+ template <class Class>
+ void Delete(Class *obj)
+ {
+ if (obj)
+ {
+ obj->~Class();
+ sysFree(obj);
+ }
+ }
+};
+
+inline void *api_memmgr::sysMalloc(size_t size)
+{
+ return _call(API_MEMMGR_SYSMALLOC, (void *)NULL, size);
+}
+
+inline void api_memmgr::sysFree(void *ptr)
+{
+ _voidcall(API_MEMMGR_SYSFREE, ptr);
+}
+
+inline void *api_memmgr::sysRealloc(void *ptr, size_t newsize)
+{
+ return _call(API_MEMMGR_SYSREALLOC, (void *)NULL, ptr, newsize);
+}
+
+inline void api_memmgr::sysMemChanged(void *ptr)
+{
+ _voidcall(API_MEMMGR_SYSMEMCHANGED, ptr);
+}
+
+
+// {000CF46E-4DF6-4a43-BBE7-40E7A3EA02ED}
+static const GUID memMgrApiServiceGuid =
+{ 0xcf46e, 0x4df6, 0x4a43, { 0xbb, 0xe7, 0x40, 0xe7, 0xa3, 0xea, 0x2, 0xed } };
+
+extern api_memmgr *memmgrApi;
+
+#endif