Fixing some bugs, not perfect yet
[charm.git] / src / arch / util / mempool.h
index 64f2faae03fc674b522dce52f4993db0a22a9129..1f24020e1b5db7b7fce74a976d0b4e7825d5b232 100644 (file)
@@ -14,39 +14,58 @@ typedef gni_mem_handle_t    mem_handle_t;
 typedef size_t    mem_handle_t;
 #endif
 
-// multiple mempool for different size allocation
-typedef struct mempool_block_t
-{
-    void                *mempool_ptr;
-    mem_handle_t    mem_hndl;
-    int                 size;
-    size_t              memblock_next;     // offset to next memblock
-} mempool_block;
+typedef void * (* mempool_newblockfn)(size_t *size, mem_handle_t *mem_hndl, int expand_flag);
+typedef void (* mempool_freeblock)(void *ptr, mem_handle_t mem_hndl);
 
+#define cutOffNum 24 
 
-typedef struct mempool_header
+//header of an free slot
+typedef struct slot_header_
 {
-#if CMK_SMP
-  void*             pool_addr;
+#if CMK_SMP && CMK_CONVERSE_GEMINI_UGNI
+  void*                        pool_addr;
 #endif
-  mem_handle_t  mem_hndl;
-  size_t            next_free;
-  int size;
-} mempool_header;
+#if CMK_CONVERSE_GEMINI_UGNI
+  mem_handle_t         mem_hndl;
+#endif
+  int                  size,status;  //status is 1 for free, 0 for used
+  size_t               gprev,gnext;  //global slot list within a block
+  size_t               prev,next;    //link list for either freelists slots
+} slot_header;
 
-typedef void * (* mempool_newblockfn)(size_t *size, mem_handle_t *mem_hndl, int expand_flag);
-typedef void (* mempool_freeblock)(void *ptr, mem_handle_t mem_hndl);
+typedef struct used_header_
+{
+#if CMK_SMP && CMK_GEMINI_UGNI
+  void*                        pool_addr;
+#endif
+#if CMK_CONVERSE_GEMINI_UGNI
+  mem_handle_t         mem_hndl;
+#endif
+  int                  size,status;  //status is 1 for free, 0 for used
+  size_t               gprev,gnext;  //global slot list within a block
+} used_header;
+
+typedef used_header mempool_header;
+
+// multiple mempool for different size allocation
+typedef struct block_header_
+{
+    void                *mempool_ptr;
+    mem_handle_t        mem_hndl;
+    size_t              size;
+    size_t              block_next;     // offset to next memblock
+    size_t              freelists[cutOffNum];
+} block_header;
 
 // only at beginning of first block of mempool
 typedef struct mempool_type
 {
-  mempool_block      mempools_head;
+  block_header           block_head;
   mempool_newblockfn     newblockfn;
   mempool_freeblock      freeblockfn;
-  size_t          freelist_head;
-  size_t          memblock_tail;
-#if CMK_SMP
-  CmiNodeLock     mempoolLock;
+  size_t                 block_tail;
+#if CMK_SMP && CMK_CONVERSE_GEMINI_UGNI
+    CmiNodeLock                mempoolLock;
 #endif
 } mempool_type;
 
@@ -54,9 +73,10 @@ mempool_type *mempool_init(size_t pool_size, mempool_newblockfn newfn, mempool_f
 void  mempool_destroy(mempool_type *mptr);
 void*  mempool_malloc(mempool_type *mptr, int size, int expand);
 void mempool_free(mempool_type *mptr, void *ptr_free);
-#if CMK_SMP
+#if CMK_SMP && CMK_CONVERSE_GEMINI_UGNI
 void mempool_free_thread(void *ptr_free);
 #endif
+
 #if defined(__cplusplus)
 extern "C" {
 #endif