Merge branch 'charm' of charmgit:charm into charm
[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 // multiple mempool for different size allocation
18 typedef struct mempool_block_t
19 {
20     void                *mempool_ptr;
21     mem_handle_t    mem_hndl;
22     int                 size;
23     size_t              memblock_next;     // offset to next memblock
24 } mempool_block;
25
26
27 typedef struct mempool_header
28 {
29   int size;
30   mem_handle_t  mem_hndl;
31   size_t            next_free;
32 } mempool_header;
33
34 typedef void * (* mempool_newblockfn)(size_t *size, mem_handle_t *mem_hndl);
35 typedef void (* mempool_freeblock)(void *ptr, mem_handle_t mem_hndl);
36
37 // only at beginning of first block of mempool
38 typedef struct mempool_type
39 {
40   mempool_block      mempools_head;
41   mempool_newblockfn     newblockfn;
42   mempool_freeblock      freeblockfn;
43   size_t          freelist_head;
44   size_t          memblock_tail;
45 } mempool_type;
46
47 mempool_type *mempool_init(size_t pool_size, mempool_newblockfn newfn, mempool_freeblock freefn);
48 void  mempool_destroy(mempool_type *mptr);
49 void*  mempool_malloc(mempool_type *mptr, int size, int expand);
50 void mempool_free(mempool_type *mptr, void *ptr_free);
51
52 #if defined(__cplusplus)
53 extern "C" {
54 #endif
55
56 #if defined(__cplusplus)
57 }
58 #endif
59
60 #endif /* MEMPOOL.H */