//----------------------------------------------------------------- void* StackMemoryManager::growObject( size_t amount ) { size_t currentSize = getTopObjectSize(); size_t newSize = currentSize + amount; size_t oldCurrentPos = mFrames[ mActiveFrame ].mCurrentPosition; size_t newDataSizePos = (mFrames[ mActiveFrame ].mCurrentPosition + amount) - sizeof(newSize); size_t newCurrentPos = newDataSizePos + sizeof(newSize); if ( newCurrentPos > mFrames[ mActiveFrame ].mMaxMemoryBlob ) { size_t numOfAllocs = 0; while ( newCurrentPos > mFrames[ mActiveFrame ].mMaxMemoryBlob ) { if (!allocateMoreMemory()) return 0; newDataSizePos = mFrames[ mActiveFrame ].mCurrentPosition + newSize; newCurrentPos = newDataSizePos + sizeof(newSize); numOfAllocs++; } void* source = mFrames[ mActiveFrame-numOfAllocs ].mMemoryBlob + oldCurrentPos - currentSize - sizeof(currentSize); memcpy(mFrames[ mActiveFrame ].mMemoryBlob, source, currentSize); // delete last object in last frame mFrames[ mActiveFrame-numOfAllocs ].mCurrentPosition -= ( currentSize + sizeof(mFrames[ mActiveFrame-numOfAllocs ].mCurrentPosition) ); } mFrames[ mActiveFrame ].mCurrentPosition = newCurrentPos; writeNewObjectSize(newDataSizePos, newSize); return top(); }
//----------------------------------------------------------------- void StackMemoryManager::growObject( size_t amount ) { size_t currentSize = getTopObjectSize(); size_t newSize = currentSize + amount; size_t newDataSizePos = mCurrentPosition + newSize; mCurrentPosition = newDataSizePos + sizeof(newSize); // TODO check if new size exceeds allocated memory !!! writeNewObjectSize(newDataSizePos, newSize); }
//-------------------------------------------------------------------- void* StackMemoryManager::newObject( size_t objectSize ) { size_t newDataPos = mCurrentPosition; size_t newDataSizePos = mCurrentPosition + objectSize; // objectSize will be written at newDataSizePos mCurrentPosition = newDataSizePos + sizeof(objectSize); if (mCurrentPosition >= mMaxMemoryBlob) { // assert(false); //realloc(); } writeNewObjectSize(newDataSizePos, objectSize); return mMemoryBlob + newDataPos; }
//-------------------------------------------------------------------- void* StackMemoryManager::newObject( size_t objectSize ) { size_t newDataPos = mFrames[ mActiveFrame ].mCurrentPosition; size_t newDataSizePos = mFrames[ mActiveFrame ].mCurrentPosition + objectSize; size_t newCurrentPos = newDataSizePos + sizeof(objectSize); while ( newCurrentPos > mFrames[ mActiveFrame ].mMaxMemoryBlob ) { if (!allocateMoreMemory()) return 0; newDataPos = mFrames[ mActiveFrame ].mCurrentPosition; newDataSizePos = mFrames[ mActiveFrame ].mCurrentPosition + objectSize; newCurrentPos = newDataSizePos + sizeof(objectSize); } // objectSize will be written at newDataSizePos mFrames[ mActiveFrame ].mCurrentPosition = newCurrentPos; writeNewObjectSize(newDataSizePos, objectSize); return mFrames[ mActiveFrame ].mMemoryBlob + newDataPos; }