aa14b4f9ecc43e3bb4fc674ab6e8f1d8e8826405
[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 struct block_header;
24 struct mempool_type;
25
26 //header of an free slot
27 typedef struct slot_header_
28 {
29   struct block_header  *block_ptr;     // block_header
30   int                   size,status;  //status is 1 for free, 0 for used
31   size_t                gprev,gnext;  //global slot list within a block
32   size_t                prev,next;    //link list for freelists slots
33 #if ! CMK_64BIT
34   size_t                padding;      // fix for 32 bit machines
35 #endif
36 } slot_header;
37
38 typedef struct used_header_
39 {
40   struct block_header  *block_ptr;     // block_header
41   int                   size,status;  //status is 1 for free, 0 for used
42   size_t                gprev,gnext;  //global slot list within a block
43 #if ! CMK_64BIT
44   size_t                padding;      // fix for 32 bit machines
45 #endif
46 } used_header;
47
48 typedef used_header mempool_header;
49
50 // multiple mempool for different size allocation
51 typedef struct block_header
52 {
53   mem_handle_t        mem_hndl;
54   size_t              size, used;
55   size_t              block_prev,block_next;   // offset to next memblock
56   size_t              freelists[cutOffNum];
57   struct mempool_type  *mptr;               // mempool_type
58 #if CMK_CONVERSE_GEMINI_UGNI
59   int                 msgs_in_send;
60   int                 msgs_in_recv;
61 #endif
62 #if ! CMK_64BIT
63   size_t              padding;              // fix for 32 bit machines
64 #endif
65 } block_header;
66
67 // only at beginning of first block of mempool, representing the mempool
68 typedef struct mempool_type
69 {
70   block_header           block_head;
71   mempool_newblockfn     newblockfn;
72   mempool_freeblock      freeblockfn;
73   size_t                 block_tail;
74   size_t                 limit;
75   size_t                 size;
76 #if CMK_USE_MEMPOOL_ISOMALLOC || (CMK_SMP && CMK_CONVERSE_GEMINI_UGNI)
77   CmiNodeLock            mempoolLock;
78 #endif
79 } mempool_type;
80
81 mempool_type *mempool_init(size_t pool_size, mempool_newblockfn newfn, mempool_freeblock freefn, size_t limit);
82 void  mempool_destroy(mempool_type *mptr);
83 void*  mempool_malloc(mempool_type *mptr, int size, int expand);
84 void mempool_free(mempool_type *mptr, void *ptr_free);
85 #if CMK_USE_MEMPOOL_ISOMALLOC || (CMK_SMP && CMK_CONVERSE_GEMINI_UGNI)
86 void mempool_free_thread(void *ptr_free);
87 #endif
88
89 #if CMK_CONVERSE_GEMINI_UGNI
90 void* getNextRegisteredPool();
91 #endif
92
93 #if defined(__cplusplus)
94 extern "C" {
95 #endif
96
97 #if defined(__cplusplus)
98 }
99 #endif
100
101 #endif /* MEMPOOL.H */