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