00001 #include "flGlobal.h" 00002 00003 #if FL_MEMORY != 0 00004 #include <string.h> 00005 #include <stdio.h> 00006 #include <pspkernel.h> 00007 00008 #if FL_INCLUDE_ALL_C == 0 00009 #include "flMemoryPool.h" 00010 00011 #if FL_DEBUG != 0 00012 #include "flDebug.h" 00013 #endif 00014 #endif 00015 00016 MemoryPool* mempCreate(u32 inSize, u32 inType) { 00017 if(!inSize) { 00018 #if FL_DEBUG_WARNING != 0 00019 debugWarning("Cannot create memory pool.\nTrying to create a memory pool of size 0."); 00020 #endif 00021 return NULL; 00022 } 00023 if(!inType || (inType > 2)) { 00024 #if FL_DEBUG_WARNING != 0 00025 debugWarning("Cannot create memory pool.\nTrying to create a memory pool with an invalid type parameter."); 00026 #endif 00027 return NULL; 00028 } 00029 MemoryPool* tempOut = (MemoryPool*)memAlloc(inSize + sizeof(MemoryPool)); 00030 if(!tempOut) { 00031 #if FL_DEBUG_WARNING != 0 00032 debugWarning("Cannot allocate memory pool.\nProbably not enough free memory."); 00033 #endif 00034 return NULL; 00035 } 00036 while(inSize & 15) 00037 inSize++; 00038 tempOut->mempData = (void*)((u32)tempOut + sizeof(MemoryPool)); 00039 tempOut->mempSize = inSize; 00040 tempOut->mempType = inType; 00041 tempOut->mempAllocData = NULL; 00042 00043 return tempOut; 00044 } 00045 00046 void mempDestroy(MemoryPool* inMemPool) { 00047 if(!inMemPool) { 00048 #if FL_DEBUG_WARNING != 0 00049 debugWarning("Trying to destroy NULL memory pool."); 00050 #endif 00051 return; 00052 } 00053 if(inMemPool->mempType == MEMORY_POOL_TYPE_TABLE) 00054 memFree(inMemPool->mempAllocData); 00055 memFree(inMemPool); 00056 } 00057 00058 00059 00060 void* mempAlloc(MemoryPool* inMemPool, u32 inSize) { 00061 if(!inMemPool) { 00062 #if FL_DEBUG_WARNING != 0 00063 debugWarning("Trying to allocate from NULL memory pool."); 00064 #endif 00065 return NULL; 00066 } 00067 if(!inSize) { 00068 #if FL_DEBUG_WARNING != 0 00069 debugWarning("Trying to allocate 0 bytes from memory pool."); 00070 #endif 00071 return NULL; 00072 } 00073 if(inMemPool->mempType == MEMORY_POOL_TYPE_LINKLIST) { 00074 MemoryPoolHdrLL* tempHeader = NULL; 00075 MemoryPoolHdrLL* tempPrevHeader = NULL; 00076 if(!inMemPool->mempAllocData) { 00077 inMemPool->mempAllocData = inMemPool->mempData; 00078 tempHeader = (MemoryPoolHdrLL*)inMemPool->mempAllocData; 00079 } else { 00080 tempPrevHeader = (MemoryPoolHdrLL*)inMemPool->mempAllocData; 00081 while(tempPrevHeader->mempHLLNext != NULL) 00082 tempPrevHeader = (MemoryPoolHdrLL*)tempPrevHeader->mempHLLNext; 00083 tempHeader = (MemoryPoolHdrLL*)((u32)tempPrevHeader + sizeof(MemoryPoolHdrLL) + tempPrevHeader->mempHLLSize); 00084 tempPrevHeader->mempHLLNext = (void*)tempHeader; 00085 } 00086 tempHeader->mempHLLData = (void*)((u32)tempHeader + sizeof(MemoryPoolHdrLL)); 00087 tempHeader->mempHLLSize = inSize; 00088 tempHeader->mempHLLNext = NULL; 00089 tempHeader->mempHLLPrev = (void*)tempPrevHeader; 00090 00091 return tempHeader->mempHLLData; 00092 } 00093 00094 #if FL_DEBUG_WARNING != 0 00095 debugWarning("Trying to allocate from memory pool with an invalid type."); 00096 #endif 00097 return NULL; 00098 } 00099 00100 void* mempCalloc(MemoryPool* inMemPool, u32 inSize0, u32 inSize1) { 00101 void* tempOut = mempAlloc(inMemPool, (inSize0 * inSize1)); 00102 if(!tempOut) 00103 return NULL; 00104 memClear(tempOut, (inSize0 * inSize1)); 00105 return tempOut; 00106 } 00107 00108 void* mempRealloc(MemoryPool* inMemPool, void* inPtr, u32 inSize) { 00109 return NULL; 00110 } 00111 00112 void* mempAlign(MemoryPool* inMemPool, u32 inBoundry, u32 inSize) { 00113 return NULL; 00114 } 00115 00116 void mempFree(MemoryPool* inMemPool, void* inPtr) { 00117 00118 } 00119 00120 #endif