Enabled g_mem_set_vtable through the configure option --with-overridable-allocators...
[mono.git] / eglib / src / gmem.c
index 93c041ccb6d1ff0482bda1752de19addcda02310..93276ed28345caf0c43a5b370c2ed7837538c7c7 100644 (file)
 #include <string.h>
 #include <glib.h>
 
+#if defined (G_OVERRIDABLE_ALLOCATORS)
+
+static GMemVTable sGMemVTable = { malloc, realloc, free, calloc };
+
+void
+g_mem_set_vtable (GMemVTable* vtable)
+{
+       sGMemVTable.calloc = vtable->calloc ? vtable->calloc : calloc;
+       sGMemVTable.realloc = vtable->realloc ? vtable->realloc : realloc;
+       sGMemVTable.malloc = vtable->malloc ? vtable->malloc : malloc;
+       sGMemVTable.free = vtable->free ? vtable->free : free;
+}
+#define G_FREE_INTERNAL sGMemVTable.free
+#define G_REALLOC_INTERNAL sGMemVTable.realloc
+#define G_CALLOC_INTERNAL sGMemVTable.calloc
+#define G_MALLOC_INTERNAL sGMemVTable.malloc
+#else
+#define G_FREE_INTERNAL free
+#define G_REALLOC_INTERNAL realloc
+#define G_CALLOC_INTERNAL calloc
+#define G_MALLOC_INTERNAL malloc
+#endif
+void
+g_free (void *ptr)
+{
+       if (ptr != NULL)
+               G_FREE_INTERNAL (ptr);
+}
+
 gpointer
 g_memdup (gconstpointer mem, guint byte_size)
 {
@@ -44,3 +73,59 @@ g_memdup (gconstpointer mem, guint byte_size)
        return ptr;
 }
 
+gpointer g_realloc (gpointer obj, gsize size)
+{
+       gpointer ptr;
+       if (!size) {
+               g_free (obj);
+               return 0;
+       }
+       ptr = G_REALLOC_INTERNAL (obj, size);
+       if (ptr)
+               return ptr;
+       g_error ("Could not allocate %i bytes", size);
+}
+
+gpointer 
+g_malloc (gsize x) 
+{ 
+       gpointer ptr;
+       if (!x)
+               return 0;
+       ptr = G_MALLOC_INTERNAL (x);
+       if (ptr) 
+               return ptr;
+       g_error ("Could not allocate %i bytes", x);
+}
+
+gpointer g_calloc (gsize n, gsize x)
+{
+       gpointer ptr;
+       if (!x || !n)
+               return 0;
+               ptr = G_CALLOC_INTERNAL (n, x);
+       if (ptr)
+               return ptr;
+       g_error ("Could not allocate %i (%i * %i) bytes", x*n, n, x);
+}
+gpointer g_malloc0 (gsize x) 
+{ 
+       return g_calloc (1,x);
+}
+
+gpointer g_try_malloc (gsize x) 
+{
+       if (x)
+               return G_MALLOC_INTERNAL (x);
+       return 0;
+}
+
+
+gpointer g_try_realloc (gpointer obj, gsize size)
+{ 
+       if (!size) {
+               G_FREE_INTERNAL (obj);
+               return 0;
+       } 
+       return G_REALLOC_INTERNAL (obj, size);
+}