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