Fix for mempool unaligned addressess on 32 bit machines, not tested
[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   size_t          padding;    // fix for 32 bit machines
36 } slot_header;
37
38 typedef struct used_header_
39 {
40 #if USE_MEMPOOL_ISOMALLOC || (CMK_SMP && CMK_GEMINI_UGNI)
41   void*                 pool_addr;
42 #endif
43 #if CMK_CONVERSE_GEMINI_UGNI
44   mem_handle_t          mem_hndl;
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     void                *mempool_ptr;
57     mem_handle_t        mem_hndl;
58     size_t              size;
59     size_t              block_next;     // offset to next memblock
60     size_t              freelists[cutOffNum];
61 } block_header;
62
63 // only at beginning of first block of mempool
64 typedef struct mempool_type
65 {
66   block_header           block_head;
67   mempool_newblockfn     newblockfn;
68   mempool_freeblock      freeblockfn;
69   size_t                 block_tail;
70 #if USE_MEMPOOL_ISOMALLOC || (CMK_SMP && CMK_CONVERSE_GEMINI_UGNI)
71     CmiNodeLock         mempoolLock;
72 #endif
73 } mempool_type;
74
75 mempool_type *mempool_init(size_t pool_size, mempool_newblockfn newfn, mempool_freeblock freefn);
76 void  mempool_destroy(mempool_type *mptr);
77 void*  mempool_malloc(mempool_type *mptr, int size, int expand);
78 void mempool_free(mempool_type *mptr, void *ptr_free);
79 #if USE_MEMPOOL_ISOMALLOC || (CMK_SMP && CMK_CONVERSE_GEMINI_UGNI)
80 void mempool_free_thread(void *ptr_free);
81 #endif
82
83 #if defined(__cplusplus)
84 extern "C" {
85 #endif
86
87 #if defined(__cplusplus)
88 }
89 #endif
90
91 #endif /* MEMPOOL.H */