a77ae9d38ffced4b8fd15a82ec63f2a8fb5c9c64
[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 #if CMK_CONVERSE_GEMINI_UGNI
9 #include "gni_pub.h"
10 #include "pmi.h"
11 typedef gni_mem_handle_t    mem_handle_t;
12 #else
13 // in uGNI, it is memory handler, other versions, this is an integer
14 // a unique integer to represent the memory block
15 typedef CmiInt8   mem_handle_t;
16 #endif
17
18 typedef void * (* mempool_newblockfn)(size_t *size, mem_handle_t *mem_hndl, int expand_flag);
19 typedef void (* mempool_freeblock)(void *ptr, mem_handle_t mem_hndl);
20
21 #define cutOffNum 25 
22
23 //given x as mptr get
24 #define   MEMPOOL_GetBlockHead(x)   (block_header*)&(x->block_head)     
25 //given x as block header, get ...
26 #define   MEMPOOL_GetBlockSize(x)    (((block_header*)x)->size)
27 #define   MEMPOOL_GetBlockMemHndl(x) (((block_header*)x)->mem_hndl)
28 #define   MEMPOOL_GetBlockNext(x)    (((block_header*)x)->block_next)     
29 //given x as user pointer, get mempool_header/slot_header
30 #define   MEMPOOL_GetMempoolHeader(x,align) \
31                                   ((mempool_header*)((char*)(x)-align))
32 //given x as mempool_header/slot_header, get ...
33 #define   MEMPOOL_GetBlockPtr(x)    ((block_header*)(x->block_ptr))
34 #define   MEMPOOL_GetMempoolPtr(x)  ((mempool_type*)(MEMPOOL_GetBlockPtr(x)->mptr))
35 #define   MEMPOOL_GetSize(x)      (MEMPOOL_GetBlockPtr(x)->size)
36 #define   MEMPOOL_GetMemHndl(x)   (MEMPOOL_GetBlockPtr(x)->mem_hndl)
37 #define   MEMPOOL_GetMsgInRecv(x) (MEMPOOL_GetBlockPtr(x)->msgs_in_recv)
38 #define   MEMPOOL_GetMsgInSend(x) (MEMPOOL_GetBlockPtr(x)->msgs_in_send)
39 #define   MEMPOOL_IncMsgInRecv(x) (MEMPOOL_GetBlockPtr(x)->msgs_in_recv)++
40 #define   MEMPOOL_DecMsgInRecv(x) (MEMPOOL_GetBlockPtr(x)->msgs_in_recv)--
41 #define   MEMPOOL_IncMsgInSend(x) (MEMPOOL_GetBlockPtr(x)->msgs_in_send)++
42 #define   MEMPOOL_DecMsgInSend(x) (MEMPOOL_GetBlockPtr(x)->msgs_in_send)--
43 #define   MEMPOOL_GetSlotGNext(x)     (x->gnext)
44 #define   MEMPOOL_GetSlotStatus(x)    (x->status)
45 #define   MEMPOOL_GetSlotSize(x)      (cutOffPoints[x->size])
46 struct block_header;
47 struct mempool_type;
48
49 //header of an free slot
50 typedef struct slot_header_
51 {
52   struct block_header  *block_ptr;     // block_header
53   int                   size,status;  //status is 1 for free, 0 for used
54   size_t                gprev,gnext;  //global slot list within a block
55   size_t                prev,next;    //link list for freelists slots
56 #if ! CMK_64BIT
57   size_t                padding;      // fix for 32 bit machines
58 #endif
59 } slot_header;
60
61 typedef struct used_header_
62 {
63   struct block_header  *block_ptr;     // block_header
64   int                   size,status;  //status is 1 for free, 0 for used
65   size_t                gprev,gnext;  //global slot list within a block
66 #if ! CMK_64BIT
67   size_t                padding;      // fix for 32 bit machines
68 #endif
69 } used_header;
70
71 typedef used_header mempool_header;
72
73 // multiple mempool for different size allocation
74 typedef struct block_header
75 {
76   mem_handle_t        mem_hndl;
77   int                 used;
78   size_t              size;
79   size_t              block_prev,block_next;   // offset to next memblock
80   size_t              freelists[cutOffNum];
81   struct mempool_type  *mptr;               // mempool_type
82 #if CMK_CONVERSE_GEMINI_UGNI
83   int                 msgs_in_send;
84   int                 msgs_in_recv;
85 #endif
86 #if ! CMK_64BIT
87   size_t              padding;              // fix for 32 bit machines
88 #endif
89 } block_header;
90
91 // only at beginning of first block of mempool, representing the mempool
92 typedef struct mempool_type
93 {
94   block_header           block_head;
95   mempool_newblockfn     newblockfn;
96   mempool_freeblock      freeblockfn;
97   size_t                 block_tail;
98   size_t                 limit;
99   size_t                 size;
100 #if CMK_USE_MEMPOOL_ISOMALLOC || (CMK_SMP && CMK_CONVERSE_GEMINI_UGNI)
101   CmiNodeLock            mempoolLock;
102 #endif
103 } mempool_type;
104
105 mempool_type *mempool_init(size_t pool_size, mempool_newblockfn newfn, mempool_freeblock freefn, size_t limit);
106 void  mempool_destroy(mempool_type *mptr);
107 void*  mempool_malloc(mempool_type *mptr, int size, int expand);
108 void mempool_free(mempool_type *mptr, void *ptr_free);
109 #if CMK_USE_MEMPOOL_ISOMALLOC || (CMK_SMP && CMK_CONVERSE_GEMINI_UGNI)
110 void mempool_free_thread(void *ptr_free);
111 #endif
112
113 #if CMK_CONVERSE_GEMINI_UGNI
114 void* getNextRegisteredPool();
115 #endif
116
117 #if defined(__cplusplus)
118 extern "C" {
119 #endif
120
121 #if defined(__cplusplus)
122 }
123 #endif
124
125 #endif /* MEMPOOL.H */