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 #if CMK_SMP
33   void*             pool_addr;
34 #endif
35 } mempool_header;
36
37 typedef void * (* mempool_newblockfn)(size_t *size, mem_handle_t *mem_hndl, int expand_flag);
38 typedef void (* mempool_freeblock)(void *ptr, mem_handle_t mem_hndl);
39
40 // only at beginning of first block of mempool
41 typedef struct mempool_type
42 {
43   mempool_block      mempools_head;
44   mempool_newblockfn     newblockfn;
45   mempool_freeblock      freeblockfn;
46   size_t          freelist_head;
47   size_t          memblock_tail;
48 #if CMK_SMP
49   CmiNodeLock     mempoolLock;
50 #endif
51 } mempool_type;
52
53 mempool_type *mempool_init(size_t pool_size, mempool_newblockfn newfn, mempool_freeblock freefn);
54 void  mempool_destroy(mempool_type *mptr);
55 void*  mempool_malloc(mempool_type *mptr, int size, int expand);
56 void mempool_free(mempool_type *mptr, void *ptr_free);
57 #if CMK_SMP
58 void mempool_free_thread(void *ptr_free);
59 #endif
60 #if defined(__cplusplus)
61 extern "C" {
62 #endif
63
64 #if defined(__cplusplus)
65 }
66 #endif
67
68 #endif /* MEMPOOL.H */