00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #define CMK_ISOMALLOC_EXCLUDE_FORTRAN_CALLS 0
00011
00012 #if ! CMK_MEMORY_BUILD_OS
00013
00014 #include "memory-gnu.c"
00015 #endif
00016
00017 #include "memory-isomalloc.h"
00018
00019
00020 CpvStaticDeclare(CmiIsomallocBlockList *,isomalloc_blocklist);
00021 CpvStaticDeclare(CmiIsomallocBlockList *,pushed_blocklist);
00022
00023 #define ISOMALLOC_PUSH \
00024 CmiIsomallocBlockList *pushed_blocklist=CpvAccess(isomalloc_blocklist);\
00025 CpvAccess(isomalloc_blocklist)=NULL;\
00026 rank_holding_CmiMemLock=CmiMyRank();\
00027
00028 #define ISOMALLOC_POP \
00029 CpvAccess(isomalloc_blocklist)=pushed_blocklist;\
00030 rank_holding_CmiMemLock=-1;\
00031
00032
00033
00034
00035 void CmiDisableIsomalloc()
00036 {
00037 CpvAccess(pushed_blocklist)=CpvAccess(isomalloc_blocklist);
00038 CpvAccess(isomalloc_blocklist)=NULL;
00039 rank_holding_CmiMemLock=CmiMyRank();
00040 }
00041
00042 void CmiEnableIsomalloc()
00043 {
00044 CpvAccess(isomalloc_blocklist)=CpvAccess(pushed_blocklist);
00045 rank_holding_CmiMemLock=-1;
00046 }
00047
00048 #if CMK_HAS_TLS_VARIABLES
00049
00056 static __thread int isomalloc_thread = 0;
00057 #else
00058 #if BIGSIM_OUT_OF_CORE && BIGSIM_OOC_PREFETCH
00059 #error TLS support is required for bigsim out-of-core prefetch optimization
00060 #endif
00061 #endif
00062
00063 static int meta_inited = 0;
00064
00065 static void meta_init(char **argv)
00066 {
00067 CmiMemoryIs_flag|=CMI_MEMORY_IS_ISOMALLOC;
00068 CpvInitialize(CmiIsomallocBlockList *,isomalloc_blocklist);
00069 CpvInitialize(CmiIsomallocBlockList *,pushed_blocklist);
00070 #if CMK_HAS_TLS_VARIABLES
00071 isomalloc_thread = 1;
00072 #endif
00073 CmiNodeAllBarrier();
00074 meta_inited = 1;
00075 }
00076
00077 static void *meta_malloc(size_t size)
00078 {
00079 void *ret=NULL;
00080 #if CMK_HAS_TLS_VARIABLES
00081 int _isomalloc_thread = isomalloc_thread;
00082 if (CmiThreadIs(CMI_THREAD_IS_TLS)) _isomalloc_thread = 1;
00083 #endif
00084 if (meta_inited && CpvInitialized(isomalloc_blocklist) && CpvAccess(isomalloc_blocklist)
00085 #if CMK_HAS_TLS_VARIABLES
00086 && _isomalloc_thread
00087 #endif
00088 )
00089 {
00090 ISOMALLOC_PUSH
00091 #if CMK_ISOMALLOC_EXCLUDE_FORTRAN_CALLS
00092 if (CmiIsFortranLibraryCall()==1) {
00093 ret=mm_malloc(size);
00094 }
00095 else
00096 #endif
00097 ret=CmiIsomallocBlockListMalloc(pushed_blocklist,size);
00098 ISOMALLOC_POP
00099 }
00100 else
00101 ret=mm_malloc(size);
00102 return ret;
00103 }
00104
00105 static void meta_free(void *mem)
00106 {
00107 if (CmiIsomallocInRange(mem))
00108 {
00109 ISOMALLOC_PUSH
00110 CmiIsomallocBlockListFree(mem);
00111 ISOMALLOC_POP
00112 }
00113 else
00114 mm_free(mem);
00115 }
00116
00117 static void *meta_calloc(size_t nelem, size_t size)
00118 {
00119 void *ret=meta_malloc(nelem*size);
00120 if (ret != NULL) memset(ret,0,nelem*size);
00121 return ret;
00122 }
00123
00124 static void meta_cfree(void *mem)
00125 {
00126 meta_free(mem);
00127 }
00128
00129 static void *meta_realloc(void *oldBuffer, size_t newSize)
00130 {
00131 void *newBuffer;
00132
00133 if (!CmiIsomallocInRange(oldBuffer))
00134 return mm_realloc(oldBuffer,newSize);
00135
00136 newBuffer = meta_malloc(newSize);
00137 if ( newBuffer && oldBuffer ) {
00138
00139
00140 size_t size=CmiIsomallocLength(((CmiIsomallocBlockList *)oldBuffer)-1)-
00141 sizeof(CmiIsomallocBlockList);
00142 if (size>newSize) size=newSize;
00143 if (size > 0)
00144 memcpy(newBuffer, oldBuffer, size);
00145 }
00146 if (oldBuffer)
00147 meta_free(oldBuffer);
00148 return newBuffer;
00149 }
00150
00151 static void *meta_memalign(size_t align, size_t size)
00152 {
00153 void *ret=NULL;
00154 if (CpvInitialized(isomalloc_blocklist) && CpvAccess(isomalloc_blocklist))
00155 {
00156 ISOMALLOC_PUSH
00157 #if CMK_ISOMALLOC_EXCLUDE_FORTRAN_CALLS
00158 if (CmiIsFortranLibraryCall()==1) {
00159 ret=mm_memalign(align, size);
00160 }
00161 else
00162 #endif
00163 ret=CmiIsomallocBlockListMallocAlign(pushed_blocklist,align,size);
00164 ISOMALLOC_POP
00165 }
00166 else
00167 ret=mm_memalign(align, size);
00168 return ret;
00169 }
00170
00171 static void *meta_valloc(size_t size)
00172 {
00173 return meta_malloc(size);
00174 }
00175
00176 #define CMK_MEMORY_HAS_NOMIGRATE
00177
00178 void *malloc_nomigrate(size_t size) {
00179 void *result;
00180 CmiMemLock();
00181 result = mm_malloc(size);
00182 CmiMemUnlock();
00183 return result;
00184 }
00185
00186 void free_nomigrate(void *mem)
00187 {
00188 CmiMemLock();
00189 mm_free(mem);
00190 CmiMemUnlock();
00191 }
00192
00193 #define CMK_MEMORY_HAS_ISOMALLOC
00194
00195
00196
00197 CmiIsomallocBlockList *CmiIsomallocBlockListActivate(CmiIsomallocBlockList *l)
00198 {
00199 register CmiIsomallocBlockList **s=&CpvAccess(isomalloc_blocklist);
00200 CmiIsomallocBlockList *ret=*s;
00201 *s=l;
00202 return ret;
00203 }
00204
00205 CmiIsomallocBlockList *CmiIsomallocBlockListCurrent(){
00206 return CpvAccess(isomalloc_blocklist);
00207 }
00208
00209
00210
00211