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