+unsigned int qmalloctotal_alloc, qmalloctotal_alloccount, qmalloctotal_free, qmalloctotal_freecount;
+
+void *qmalloc(unsigned int size)
+{
+ unsigned int *mem;
+ qmalloctotal_alloc += size;
+ qmalloctotal_alloccount++;
+ mem = malloc(size+sizeof(unsigned int));
+ *mem = size;
+ return (void *)(mem + 1);
+}
+
+void qfree(void *mem)
+{
+ unsigned int *m;
+ m = mem;
+ m--; // back up to size
+ qmalloctotal_free += *m; // size
+ qmalloctotal_freecount++;
+ free(m);
+}
+
+void GL_TextureStats_PrintTotal(void);
+extern int hunk_low_used, hunk_high_used, hunk_size;
+void COM_Memstats_f(void)
+{
+ Con_Printf("%i malloc calls totalling %i bytes (%.4gMB)\n%i free calls totalling %i bytes (%.4gMB)\n%i bytes (%.4gMB) currently allocated\n", qmalloctotal_alloccount, qmalloctotal_alloc, qmalloctotal_alloc / 1048576.0, qmalloctotal_freecount, qmalloctotal_free, qmalloctotal_free / 1048576.0, qmalloctotal_alloc - qmalloctotal_free, (qmalloctotal_alloc - qmalloctotal_free) / 1048576.0);
+ GL_TextureStats_PrintTotal();
+ Con_Printf ("%i bytes (%.4gMB) of %.4gMB hunk in use\n", hunk_low_used + hunk_high_used, (hunk_low_used + hunk_high_used) / 1048576.0, hunk_size / 1048576.0);
+}
+
+