00001
00002 #ifndef MEMPOOL_H
00003 #define MEMPOOL_H
00004
00005 #include "conv-config.h"
00006 #include "converse.h"
00007
00008 #if CMK_CONVERSE_GEMINI_UGNI
00009 #include "gni_pub.h"
00010 #include "pmi.h"
00011 typedef gni_mem_handle_t mem_handle_t;
00012 #else
00013
00014
00015 typedef CmiInt8 mem_handle_t;
00016 #endif
00017
00018 typedef void * (* mempool_newblockfn)(size_t *size, mem_handle_t *mem_hndl, int expand_flag);
00019 typedef void (* mempool_freeblock)(void *ptr, mem_handle_t mem_hndl);
00020
00021 #define cutOffNum 25
00022
00023
00024 #define MEMPOOL_GetBlockHead(x) (block_header*)&(x->block_head)
00025
00026 #define MEMPOOL_GetBlockSize(x) (((block_header*)x)->size)
00027 #define MEMPOOL_GetBlockMemHndl(x) (((block_header*)x)->mem_hndl)
00028 #define MEMPOOL_GetBlockNext(x) (((block_header*)x)->block_next)
00029
00030 #define MEMPOOL_GetMempoolHeader(x,align) \
00031 ((mempool_header*)((char*)(x)-align))
00032
00033 #define MEMPOOL_GetBlockPtr(x) ((block_header*)(x->block_ptr))
00034 #define MEMPOOL_GetMempoolPtr(x) ((mempool_type*)(MEMPOOL_GetBlockPtr(x)->mptr))
00035 #define MEMPOOL_GetSize(x) (MEMPOOL_GetBlockPtr(x)->size)
00036 #define MEMPOOL_GetMemHndl(x) (MEMPOOL_GetBlockPtr(x)->mem_hndl)
00037 #define MEMPOOL_GetMsgInRecv(x) (MEMPOOL_GetBlockPtr(x)->msgs_in_recv)
00038 #define MEMPOOL_GetMsgInSend(x) (MEMPOOL_GetBlockPtr(x)->msgs_in_send)
00039 #define MEMPOOL_IncMsgInRecv(x) (MEMPOOL_GetBlockPtr(x)->msgs_in_recv)++
00040 #define MEMPOOL_DecMsgInRecv(x) (MEMPOOL_GetBlockPtr(x)->msgs_in_recv)--
00041 #define MEMPOOL_IncMsgInSend(x) (MEMPOOL_GetBlockPtr(x)->msgs_in_send)++
00042 #define MEMPOOL_DecMsgInSend(x) (MEMPOOL_GetBlockPtr(x)->msgs_in_send)--
00043 #define MEMPOOL_GetSlotGNext(x) (x->gnext)
00044 #define MEMPOOL_GetSlotStatus(x) (x->status)
00045 #define MEMPOOL_GetSlotSize(x) (cutOffPoints[x->size])
00046 struct block_header;
00047 struct mempool_type;
00048
00049
00050 typedef struct slot_header_
00051 {
00052 struct block_header *block_ptr;
00053 int size,status;
00054 size_t gprev,gnext;
00055 size_t prev,next;
00056 #if ! CMK_64BIT
00057 size_t padding;
00058 #endif
00059 } slot_header;
00060
00061 typedef struct used_header_
00062 {
00063 struct block_header *block_ptr;
00064 int size,status;
00065 size_t gprev,gnext;
00066 #if ! CMK_64BIT
00067 size_t padding;
00068 #endif
00069 } used_header;
00070
00071 typedef used_header mempool_header;
00072
00073
00074 typedef struct block_header
00075 {
00076 mem_handle_t mem_hndl;
00077 size_t size, used;
00078 size_t block_prev,block_next;
00079 size_t freelists[cutOffNum];
00080 struct mempool_type *mptr;
00081 #if CMK_CONVERSE_GEMINI_UGNI
00082 int msgs_in_send;
00083 int msgs_in_recv;
00084 #endif
00085 #if ! CMK_64BIT
00086 size_t padding;
00087 #endif
00088 } block_header;
00089
00090
00091 typedef struct mempool_type
00092 {
00093 block_header block_head;
00094 mempool_newblockfn newblockfn;
00095 mempool_freeblock freeblockfn;
00096 size_t block_tail;
00097 size_t limit;
00098 size_t size;
00099 #if CMK_USE_MEMPOOL_ISOMALLOC || (CMK_SMP && CMK_CONVERSE_GEMINI_UGNI)
00100 CmiNodeLock mempoolLock;
00101 #endif
00102 } mempool_type;
00103
00104 mempool_type *mempool_init(size_t pool_size, mempool_newblockfn newfn, mempool_freeblock freefn, size_t limit);
00105 void mempool_destroy(mempool_type *mptr);
00106 void* mempool_malloc(mempool_type *mptr, int size, int expand);
00107 void mempool_free(mempool_type *mptr, void *ptr_free);
00108 #if CMK_USE_MEMPOOL_ISOMALLOC || (CMK_SMP && CMK_CONVERSE_GEMINI_UGNI)
00109 void mempool_free_thread(void *ptr_free);
00110 #endif
00111
00112 #if CMK_CONVERSE_GEMINI_UGNI
00113 void* getNextRegisteredPool();
00114 #endif
00115
00116 #if defined(__cplusplus)
00117 extern "C" {
00118 #endif
00119
00120 #if defined(__cplusplus)
00121 }
00122 #endif
00123
00124 #endif