Merge branch 'charm' of charmgit:charm into isomalloc
[charm.git] / src / arch / util / mempool.h
1
2 #ifndef MEMPOOL_H
3 #define MEMPOOL_H  
4
5 #include "conv-config.h"
6 #include "converse.h"
7
8 #define USE_MEMPOOL_ISOMALLOC  1
9 #if CMK_CONVERSE_GEMINI_UGNI
10 #include "gni_pub.h"
11 #include "pmi.h"
12 typedef gni_mem_handle_t    mem_handle_t;
13 #else
14   // in uGNI, it is memory handler, other versions, this is an integer
15   // a unique integer to represent the memory block
16 typedef size_t    mem_handle_t;
17 #endif
18
19 typedef void * (* mempool_newblockfn)(size_t *size, mem_handle_t *mem_hndl, int expand_flag);
20 typedef void (* mempool_freeblock)(void *ptr, mem_handle_t mem_hndl);
21
22 #define cutOffNum 24 
23
24 //header of an free slot
25 typedef struct slot_header_
26 {
27 #if USE_MEMPOOL_ISOMALLOC ||  (CMK_SMP && CMK_CONVERSE_GEMINI_UGNI)
28   void*                 pool_addr;
29 #endif
30 #if CMK_CONVERSE_GEMINI_UGNI
31   mem_handle_t          mem_hndl;
32 #endif
33   int                   size,status;  //status is 1 for free, 0 for used
34   size_t                gprev,gnext;  //global slot list within a block
35   size_t                prev,next;    //link list for either freelists slots
36 } slot_header;
37
38 typedef struct used_header_
39 {
40 #if USE_MEMPOOL_ISOMALLOC || (CMK_SMP && CMK_GEMINI_UGNI)
41   void*                 pool_addr;
42 #endif
43 #if CMK_CONVERSE_GEMINI_UGNI
44   mem_handle_t          mem_hndl;
45 #endif
46   int                   size,status;  //status is 1 for free, 0 for used
47   size_t                gprev,gnext;  //global slot list within a block
48 } used_header;
49
50 typedef used_header mempool_header;
51
52 // multiple mempool for different size allocation
53 typedef struct block_header_
54 {
55     void                *mempool_ptr;
56     mem_handle_t        mem_hndl;
57     size_t              size;
58     size_t              block_next;     // offset to next memblock
59     size_t              freelists[cutOffNum];
60 } block_header;
61
62 // only at beginning of first block of mempool
63 typedef struct mempool_type
64 {
65   block_header           block_head;
66   mempool_newblockfn     newblockfn;
67   mempool_freeblock      freeblockfn;
68   size_t                 block_tail;
69 #if USE_MEMPOOL_ISOMALLOC || (CMK_SMP && CMK_CONVERSE_GEMINI_UGNI)
70     CmiNodeLock         mempoolLock;
71 #endif
72 } mempool_type;
73
74 mempool_type *mempool_init(size_t pool_size, mempool_newblockfn newfn, mempool_freeblock freefn);
75 void  mempool_destroy(mempool_type *mptr);
76 void*  mempool_malloc(mempool_type *mptr, int size, int expand);
77 void mempool_free(mempool_type *mptr, void *ptr_free);
78 #if USE_MEMPOOL_ISOMALLOC || (CMK_SMP && CMK_CONVERSE_GEMINI_UGNI)
79 void mempool_free_thread(void *ptr_free);
80 #endif
81
82 #if defined(__cplusplus)
83 extern "C" {
84 #endif
85
86 #if defined(__cplusplus)
87 }
88 #endif
89
90 #endif /* MEMPOOL.H */