00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "cmipool.h"
00015
00016 CpvStaticDeclare(char **, bins);
00017 CpvStaticDeclare(int *, binLengths);
00018 CpvStaticDeclare(int, maxBin);
00019 CpvStaticDeclare(int, numKallocs);
00020 CpvStaticDeclare(int, numMallocs);
00021 CpvStaticDeclare(int, numOallocs);
00022 CpvStaticDeclare(int, numFrees);
00023 CpvStaticDeclare(int, numOFrees);
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 extern void *malloc_nomigrate(size_t size);
00040 extern void free_nomigrate(void *mem);
00041
00042 void CmiPoolAllocInit(int numBins)
00043 {
00044 int i;
00045 if (CpvInitialized(bins)) return;
00046 CpvInitialize(char **, bins);
00047 CpvInitialize(int *, binLengths);
00048 CpvInitialize(int, maxBin);
00049 CpvInitialize(int, numKallocs);
00050 CpvInitialize(int, numMallocs);
00051 CpvInitialize(int, numOFrees);
00052 CpvInitialize(int, numFrees);
00053
00054 CpvAccess(bins) = (char **) malloc_nomigrate( numBins*sizeof(char *));
00055 CpvAccess(binLengths) = (int *) malloc_nomigrate( numBins*sizeof(int));
00056 CpvAccess(maxBin) = numBins -1;
00057 for (i=0; i<numBins; i++) CpvAccess(bins)[i] = NULL;
00058 for (i=0; i<numBins; i++) CpvAccess(binLengths)[i] = 0;
00059
00060 CpvAccess(numKallocs) = CpvAccess(numMallocs) = CpvAccess(numFrees)=CpvAccess(numOFrees) = 0;
00061 }
00062
00063 void * CmiPoolAlloc(unsigned int numBytes)
00064 {
00065 char *p;
00066 int bin=0;
00067 int n=numBytes+CMI_POOL_HEADER_SIZE;
00068 CmiInt8 *header;
00069
00070 numBytes = n;
00071 while (n !=0)
00072 {
00073 n = n >> 1;
00074 bin++;
00075 }
00076
00077 if(bin<CpvAccess(maxBin))
00078 {
00079 CmiAssert(bin>0);
00080 if(CpvAccess(bins)[bin] != NULL)
00081 {
00082
00083 #if CMK_WITH_STATS
00084 CpvAccess(numKallocs)++;
00085 #endif
00086
00087 p = CpvAccess(bins)[bin];
00088
00089
00090
00091
00092
00093 #if CMK_WITH_STATS
00094 if(--CpvAccess(binLengths)[bin])
00095 CpvAccess(bins)[bin] = (char *) *((char **)(p -CMI_POOL_HEADER_SIZE));
00096 else
00097 CpvAccess(bins)[bin] = NULL;
00098 #else
00099 CpvAccess(bins)[bin] = (char *) *((char **)(p -CMI_POOL_HEADER_SIZE));
00100 #endif
00101 }
00102 else
00103 {
00104
00105 #if CMK_WITH_STATS
00106 CpvAccess(numMallocs)++;
00107 #endif
00108
00109 p =(char *) malloc_nomigrate(1 << bin) + CMI_POOL_HEADER_SIZE;
00110 }
00111 }
00112 else
00113 {
00114
00115
00116 #if CMK_WITH_STATS
00117 CpvAccess(numOallocs)++;
00118 #endif
00119 p = (char *) malloc_nomigrate(numBytes) + CMI_POOL_HEADER_SIZE;
00120 bin=0;
00121
00122 }
00123 header = (CmiInt8 *) (p-CMI_POOL_HEADER_SIZE);
00124 CmiAssert(header !=NULL);
00125 *header = bin;
00126 return p;
00127 }
00128
00129 void CmiPoolFree(void * p)
00130 {
00131 char **header = (char **)( (char*)p - CMI_POOL_HEADER_SIZE);
00132 int bin = *(CmiInt8 *)header;
00133
00134 if(bin==0)
00135 {
00136 #if CMK_WITH_STATS
00137 CpvAccess(numOFrees)++;
00138 #endif
00139 free_nomigrate(header);
00140 }
00141 else if(bin<CpvAccess(maxBin))
00142 {
00143 #if CMK_WITH_STATS
00144 CpvAccess(numFrees)++;
00145 #endif
00146
00147 *header = CpvAccess(bins)[bin];
00148 CpvAccess(bins)[bin] = p;
00149 #if CMK_WITH_STATS
00150 CpvAccess(binLengths)[bin]++;
00151 #endif
00152 }
00153 else
00154 CmiAbort("CmiPoolFree: Invalid Bin");
00155 }
00156
00157 void CmiPoolAllocStats()
00158 {
00159 int i;
00160 CmiPrintf("numKallocs: %d\n", CpvAccess(numKallocs));
00161 CmiPrintf("numMallocs: %d\n", CpvAccess(numMallocs));
00162 CmiPrintf("numOallocs: %d\n", CpvAccess(numOallocs));
00163 CmiPrintf("numOFrees: %d\n", CpvAccess(numOFrees));
00164 CmiPrintf("numFrees: %d\n", CpvAccess(numFrees));
00165 CmiPrintf("Bin:");
00166 for (i=0; i<=CpvAccess(maxBin); i++)
00167 if(CpvAccess(binLengths)[i])
00168 CmiPrintf("%d\t", i);
00169 CmiPrintf("\nVal:");
00170 for (i=0; i<=CpvAccess(maxBin); i++)
00171 if(CpvAccess(binLengths)[i])
00172 CmiPrintf("%d\t", CpvAccess(binLengths)[i]);
00173 CmiPrintf("\n");
00174 }
00175
00176 void CmiPoolPrintList(char *p)
00177 {
00178 CmiPrintf("Free list is: -----------\n");
00179 while (p != 0) {
00180 char ** header = (char **) p-CMI_POOL_HEADER_SIZE;
00181 CmiPrintf("next ptr is %p. ", p);
00182 CmiPrintf("header is at: %p, and contains: %p \n", header, *header);
00183 p = *header;
00184 }
00185 CmiPrintf("End of Free list: -----------\n");
00186
00187 }
00188
00189
00190