Minor change in mempool - saving size as power of two in slots
[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 24 
22 static int cutOffPoints[] = {64,128,256,512,1024,2048,4096, 8192,16384,32768,
23                       65536,131072,262144,524288,1048576,2097152,4194304,
24                       8388608,16777216,33554432,67108864,134217728,268435456,
25                       536870912};
26
27
28
29 //header of an free slot
30 typedef struct slot_header_
31 {
32 #if CMK_USE_MEMPOOL_ISOMALLOC ||  (CMK_SMP && CMK_CONVERSE_GEMINI_UGNI)
33   void*                 pool_addr;
34 #endif
35 #if CMK_CONVERSE_GEMINI_UGNI
36   void              *mempool_ptr;
37 #endif
38   int                   size,status;  //status is 1 for free, 0 for used
39   size_t                gprev,gnext;  //global slot list within a block
40   size_t                prev,next;    //link list for freelists slots
41   size_t          padding;    // fix for 32 bit machines
42 } slot_header;
43
44 typedef struct used_header_
45 {
46 #if CMK_USE_MEMPOOL_ISOMALLOC || (CMK_SMP && CMK_GEMINI_UGNI)
47   void*                 pool_addr;
48 #endif
49 #if CMK_CONVERSE_GEMINI_UGNI
50   void              *mempool_ptr;
51 #endif
52   int                   size,status;  //status is 1 for free, 0 for used
53   size_t                gprev,gnext;  //global slot list within a block
54   size_t          padding;    // fix for 32 bit machines
55 } used_header;
56
57 typedef used_header mempool_header;
58
59 // multiple mempool for different size allocation
60 typedef struct block_header_
61 {
62     mem_handle_t        mem_hndl;
63     size_t              size;
64     size_t              block_next;     // offset to next memblock
65     size_t              freelists[cutOffNum];
66     size_t          padding;    // fix for 32 bit machines
67 #if CMK_CONVERSE_GEMINI_UGNI
68     int                 msgs_in_flight;
69 #endif
70     void                *mempool_ptr;
71 } block_header;
72
73 // only at beginning of first block of mempool
74 typedef struct mempool_type
75 {
76   block_header           block_head;
77   mempool_newblockfn     newblockfn;
78   mempool_freeblock      freeblockfn;
79   size_t                 block_tail;
80 #if CMK_USE_MEMPOOL_ISOMALLOC || (CMK_SMP && CMK_CONVERSE_GEMINI_UGNI)
81     CmiNodeLock         mempoolLock;
82 #endif
83 } mempool_type;
84
85 mempool_type *mempool_init(size_t pool_size, mempool_newblockfn newfn, mempool_freeblock freefn);
86 void  mempool_destroy(mempool_type *mptr);
87 void*  mempool_malloc(mempool_type *mptr, int size, int expand);
88 void mempool_free(mempool_type *mptr, void *ptr_free);
89 #if CMK_USE_MEMPOOL_ISOMALLOC || (CMK_SMP && CMK_CONVERSE_GEMINI_UGNI)
90 void mempool_free_thread(void *ptr_free);
91 #endif
92
93 #if CMK_CONVERSE_GEMINI_UGNI
94 void* getNextRegisteredPool();
95 #endif
96
97 #if defined(__cplusplus)
98 extern "C" {
99 #endif
100
101 #if defined(__cplusplus)
102 }
103 #endif
104
105 #endif /* MEMPOOL.H */