Wed Sep 11 12:53:28 CEST 2002 Paolo Molaro <lupus@ximian.com>
[mono.git] / mono / metadata / mempool.c
index 525cdd3a8525916e5b1bfc988ed4ccbfee6424ea..2347b45b661a81a657c544aff4b2ccd45f097e4e 100644 (file)
 #include <glib.h>
 #include <string.h>
 
-#include "jit.h"
+#include "mempool.h"
 
 /*
  * MonoMemPool is for fast allocation of memory. We free
  * all memory when the pool is destroyed.
  */
 
-#if SIZEOF_VOID_P > SIZEOF_LONG
-#define MEM_ALIGN     SIZEOF_VOID_P
-#else
-#define MEM_ALIGN     SIZEOF_LONG
-#endif
+#define MEM_ALIGN 8
 
 #define MONO_MEMPOOL_PAGESIZE 8192
 
@@ -33,6 +29,7 @@ struct _MonoMemPool {
        MonoMemPool *next;
        gint rest;
        gpointer pos;
+       double pad; /* to assure proper alignment */
 };
 
 /**
@@ -43,10 +40,10 @@ struct _MonoMemPool {
 MonoMemPool *
 mono_mempool_new ()
 {
-
        MonoMemPool *pool = g_malloc (MONO_MEMPOOL_PAGESIZE);
+
        pool->next = NULL;
-       pool->pos = (gpointer)pool + sizeof (MonoMemPool);
+       pool->pos = (char *)pool + sizeof (MonoMemPool);
        pool->rest = MONO_MEMPOOL_PAGESIZE - sizeof (MonoMemPool);
        return pool;
 }
@@ -87,26 +84,26 @@ mono_mempool_alloc (MonoMemPool *pool, guint size)
        
        g_assert (pool != NULL);
 
-       if (size >= 4096) {
-               MonoMemPool *np = g_malloc (sizeof (MonoMemPool) + size);
-               np->next = pool->next;
-               pool->next = np;
-               return (gpointer)np + sizeof (MonoMemPool);
-       }
-
        size = (size + MEM_ALIGN - 1) & ~(MEM_ALIGN - 1);
 
        if (pool->rest < size) {
-               MonoMemPool *np = g_malloc (MONO_MEMPOOL_PAGESIZE);
-               np->next = pool->next;
-               pool->next = np;
-               pool->pos = (gpointer)np + sizeof (MonoMemPool);
-               pool->rest = MONO_MEMPOOL_PAGESIZE - sizeof (MonoMemPool);
+               if (size >= 4096) {
+                       MonoMemPool *np = g_malloc (sizeof (MonoMemPool) + size);
+                       np->next = pool->next;
+                       pool->next = np;
+                       return (char *)np + sizeof (MonoMemPool);
+               } else {
+                       MonoMemPool *np = g_malloc (MONO_MEMPOOL_PAGESIZE);
+                       np->next = pool->next;
+                       pool->next = np;
+                       pool->pos = (char *)np + sizeof (MonoMemPool);
+                       pool->rest = MONO_MEMPOOL_PAGESIZE - sizeof (MonoMemPool);
+               }
        }
 
        rval = pool->pos;
        pool->rest -= size;
-       pool->pos += size;
+       pool->pos = (char *)pool->pos + size;
 
        return rval;
 }