Merge branch 'charm' of charmgit:charm into isomalloc
[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 #else
11   // in uGNI, it is memory handler, other versions, this is an integer
12   // a unique integer to represent the memory block
13 typedef size_t   gni_mem_handle_t;
14 #endif
15
16 // multiple mempool for different size allocation
17 typedef struct mempool_block_t
18 {
19     void                *mempool_ptr;
20     gni_mem_handle_t    mem_hndl;
21     int                 size;
22     struct              mempool_block_t *next;
23 } mempool_block;
24
25
26 typedef struct mempool_header
27 {
28   int size;
29   gni_mem_handle_t  mem_hndl;
30   size_t            next_free;
31 } mempool_header;
32
33 typedef void * (* mempool_newblockfn)(size_t *size, gni_mem_handle_t *mem_hndl);
34 typedef void (* mempool_freeblock)(void *ptr, gni_mem_handle_t mem_hndl);
35
36 // only at beginning of first block of mempool
37 typedef struct mempool_type
38 {
39   mempool_block      mempools_head;
40   mempool_newblockfn     newblockfn;
41   mempool_freeblock      freeblockfn;
42   size_t          freelist_head;
43 } mempool_type;
44
45 mempool_type *mempool_init(size_t pool_size, mempool_newblockfn newfn, mempool_freeblock freefn);
46 void  mempool_destroy(mempool_type *mptr);
47 void*  mempool_malloc(mempool_type *mptr, int size, int expand);
48 void mempool_free(mempool_type *mptr, void *ptr_free);
49
50 #if defined(__cplusplus)
51 extern "C" {
52 #endif
53
54 #if defined(__cplusplus)
55 }
56 #endif
57
58 #endif /* MEMPOOL.H */