Chromium Code Reviews| Index: xfa/fgas/crt/fgas_memory.cpp |
| diff --git a/xfa/fgas/crt/fgas_memory.cpp b/xfa/fgas/crt/fgas_memory.cpp |
| index 4334789cb7dd99805610d448c906c945f4b2427f..ad709af4905067ba25621374a258f06f6a44964d 100644 |
| --- a/xfa/fgas/crt/fgas_memory.cpp |
| +++ b/xfa/fgas/crt/fgas_memory.cpp |
| @@ -6,11 +6,15 @@ |
| #include "xfa/fgas/crt/fgas_memory.h" |
|
dsinclair
2016/05/03 20:43:52
I gather we shouldn't roll into chromium with this
Tom Sepez
2016/05/03 20:59:31
It only affects XFA, and we might just want to avo
|
| +#define MEMORY_TOOL_REPLACES_ALLOCATOR // Temporary, for CF testing. |
| + |
| #include <algorithm> |
| +#ifdef MEMORY_TOOL_REPLACES_ALLOCATOR |
| + |
| namespace { |
| -class CFX_DefStore : public IFX_MEMAllocator, public CFX_Target { |
| +class CFX_DefStore : public IFX_MemoryAllocator, public CFX_Target { |
| public: |
| CFX_DefStore() {} |
| ~CFX_DefStore() {} |
| @@ -23,19 +27,25 @@ class CFX_DefStore : public IFX_MEMAllocator, public CFX_Target { |
| virtual size_t GetCurrentDataSize() const { return 0; } |
| }; |
| -#if _FX_OS_ != _FX_ANDROID_ |
| -#pragma pack(push, 1) |
| -#endif |
| +} // namespace |
| + |
| +IFX_MemoryAllocator* IFX_MemoryAllocator::Create(FX_ALLOCTYPE eType, |
| + size_t chunkSize, |
| + size_t blockSize) { |
| + return new CFX_DefStore(); |
| +} |
| + |
| +#else // MEMORY_TOOL_REPLACES_ALLOCATOR |
| + |
| +namespace { |
| + |
| struct FX_STATICSTORECHUNK { |
| FX_STATICSTORECHUNK* pNextChunk; |
| size_t iChunkSize; |
| size_t iFreeSize; |
| }; |
| -#if _FX_OS_ != _FX_ANDROID_ |
| -#pragma pack(pop) |
| -#endif |
| -class CFX_StaticStore : public IFX_MEMAllocator, public CFX_Target { |
| +class CFX_StaticStore : public IFX_MemoryAllocator, public CFX_Target { |
| public: |
| CFX_StaticStore(size_t iDefChunkSize = 4096); |
| ~CFX_StaticStore(); |
| @@ -56,9 +66,6 @@ class CFX_StaticStore : public IFX_MEMAllocator, public CFX_Target { |
| FX_STATICSTORECHUNK* FindChunk(size_t size); |
| }; |
| -#if _FX_OS_ != _FX_ANDROID_ |
| -#pragma pack(push, 1) |
| -#endif |
| struct FX_FIXEDSTORECHUNK { |
| uint8_t* FirstFlag() { return reinterpret_cast<uint8_t*>(this + 1); } |
| uint8_t* FirstBlock() { return FirstFlag() + iChunkSize; } |
| @@ -67,11 +74,8 @@ struct FX_FIXEDSTORECHUNK { |
| size_t iChunkSize; |
| size_t iFreeNum; |
| }; |
| -#if _FX_OS_ != _FX_ANDROID_ |
| -#pragma pack(pop) |
| -#endif |
| -class CFX_FixedStore : public IFX_MEMAllocator, public CFX_Target { |
| +class CFX_FixedStore : public IFX_MemoryAllocator, public CFX_Target { |
| public: |
| CFX_FixedStore(size_t iBlockSize, size_t iBlockNumsInChunk); |
| virtual ~CFX_FixedStore(); |
| @@ -91,74 +95,29 @@ class CFX_FixedStore : public IFX_MEMAllocator, public CFX_Target { |
| FX_FIXEDSTORECHUNK* m_pChunk; |
| }; |
| -#if _FX_OS_ != _FX_ANDROID_ |
| -#pragma pack(push, 1) |
| -#endif |
| -struct FX_DYNAMICSTOREBLOCK { |
| - uint8_t* Data() { return reinterpret_cast<uint8_t*>(this + 1); } |
| - FX_DYNAMICSTOREBLOCK* NextBlock() { |
| - return reinterpret_cast<FX_DYNAMICSTOREBLOCK*>(Data() + iBlockSize); |
| - } |
| - size_t iBlockSize; |
| - FX_BOOL bUsed; |
| -}; |
| - |
| -struct FX_DYNAMICSTORECHUNK { |
| - FX_DYNAMICSTOREBLOCK* FirstBlock() { |
| - return reinterpret_cast<FX_DYNAMICSTOREBLOCK*>(this + 1); |
| - } |
| - FX_DYNAMICSTORECHUNK* pNextChunk; |
| - size_t iChunkSize; |
| - size_t iFreeSize; |
| -}; |
| -#if _FX_OS_ != _FX_ANDROID_ |
| -#pragma pack(pop) |
| -#endif |
| - |
| -class CFX_DynamicStore : public IFX_MEMAllocator, public CFX_Target { |
| - public: |
| - CFX_DynamicStore(size_t iDefChunkSize = 4096); |
| - virtual ~CFX_DynamicStore(); |
| - virtual void Release() { delete this; } |
| - virtual void* Alloc(size_t size); |
| - virtual void Free(void* pBlock); |
| - virtual size_t GetBlockSize() const { return 0; } |
| - virtual size_t GetDefChunkSize() const { return m_iDefChunkSize; } |
| - virtual size_t SetDefChunkSize(size_t size); |
| - virtual size_t GetCurrentDataSize() const { return 0; } |
| - |
| - protected: |
| - FX_DYNAMICSTORECHUNK* AllocChunk(size_t size); |
| - |
| - size_t m_iDefChunkSize; |
| - FX_DYNAMICSTORECHUNK* m_pChunk; |
| -}; |
| - |
| } // namespace |
| -#define FX_4BYTEALIGN(size) (((size) + 3) / 4 * 4) |
| +#define FX_4BYTEALIGN(size) (((size) + 3) & ~3) |
| -IFX_MEMAllocator* FX_CreateAllocator(FX_ALLOCTYPE eType, |
| - size_t chunkSize, |
| - size_t blockSize) { |
| +IFX_MemoryAllocator* IFX_MemoryAllocator::Create(FX_ALLOCTYPE eType, |
| + size_t chunkSize, |
| + size_t blockSize) { |
| switch (eType) { |
| - case FX_ALLOCTYPE_Dynamic: |
| - return new CFX_DynamicStore(chunkSize); |
| - case FX_ALLOCTYPE_Default: |
| - return new CFX_DefStore(); |
| case FX_ALLOCTYPE_Static: |
| return new CFX_StaticStore(chunkSize); |
| case FX_ALLOCTYPE_Fixed: |
| return new CFX_FixedStore(blockSize, chunkSize); |
| default: |
| - return NULL; |
| + ASSERT(0); |
| + return nullptr; |
| } |
| } |
| + |
| CFX_StaticStore::CFX_StaticStore(size_t iDefChunkSize) |
| : m_iAllocatedSize(0), |
| m_iDefChunkSize(iDefChunkSize), |
| - m_pChunk(NULL), |
| - m_pLastChunk(NULL) { |
| + m_pChunk(nullptr), |
| + m_pLastChunk(nullptr) { |
| ASSERT(m_iDefChunkSize != 0); |
| } |
| CFX_StaticStore::~CFX_StaticStore() { |
| @@ -175,8 +134,8 @@ FX_STATICSTORECHUNK* CFX_StaticStore::AllocChunk(size_t size) { |
| uint8_t, sizeof(FX_STATICSTORECHUNK) + size); |
| pChunk->iChunkSize = size; |
| pChunk->iFreeSize = size; |
| - pChunk->pNextChunk = NULL; |
| - if (m_pLastChunk == NULL) { |
| + pChunk->pNextChunk = nullptr; |
| + if (m_pLastChunk == nullptr) { |
|
dsinclair
2016/05/03 20:43:52
if (!m_pLastChunk)
Tom Sepez
2016/05/03 20:59:30
Done.
|
| m_pChunk = pChunk; |
| } else { |
| m_pLastChunk->pNextChunk = pChunk; |
| @@ -186,7 +145,7 @@ FX_STATICSTORECHUNK* CFX_StaticStore::AllocChunk(size_t size) { |
| } |
| FX_STATICSTORECHUNK* CFX_StaticStore::FindChunk(size_t size) { |
| ASSERT(size != 0); |
| - if (m_pLastChunk == NULL || m_pLastChunk->iFreeSize < size) { |
| + if (m_pLastChunk == nullptr || m_pLastChunk->iFreeSize < size) { |
|
dsinclair
2016/05/03 20:43:52
if (!m_pLastChunk
Tom Sepez
2016/05/03 20:59:30
Done.
|
| return AllocChunk(std::max(m_iDefChunkSize, size)); |
| } |
| return m_pLastChunk; |
| @@ -211,7 +170,7 @@ size_t CFX_StaticStore::SetDefChunkSize(size_t size) { |
| CFX_FixedStore::CFX_FixedStore(size_t iBlockSize, size_t iBlockNumsInChunk) |
| : m_iBlockSize(FX_4BYTEALIGN(iBlockSize)), |
| m_iDefChunkSize(FX_4BYTEALIGN(iBlockNumsInChunk)), |
| - m_pChunk(NULL) { |
| + m_pChunk(nullptr) { |
| ASSERT(m_iBlockSize != 0 && m_iDefChunkSize != 0); |
| } |
| CFX_FixedStore::~CFX_FixedStore() { |
| @@ -227,8 +186,8 @@ FX_FIXEDSTORECHUNK* CFX_FixedStore::AllocChunk() { |
| m_iBlockSize * m_iDefChunkSize; |
| FX_FIXEDSTORECHUNK* pChunk = |
| (FX_FIXEDSTORECHUNK*)FX_Alloc(uint8_t, iTotalSize); |
| - if (pChunk == NULL) { |
| - return NULL; |
| + if (pChunk == nullptr) { |
|
dsinclair
2016/05/03 20:43:51
if (!pChunk)
Tom Sepez
2016/05/03 20:59:31
Done.
|
| + return nullptr; |
| } |
| FXSYS_memset(pChunk->FirstFlag(), 0, m_iDefChunkSize); |
| pChunk->pNextChunk = m_pChunk; |
| @@ -239,19 +198,19 @@ FX_FIXEDSTORECHUNK* CFX_FixedStore::AllocChunk() { |
| } |
| void* CFX_FixedStore::Alloc(size_t size) { |
| if (size > m_iBlockSize) { |
| - return NULL; |
| + return nullptr; |
| } |
| FX_FIXEDSTORECHUNK* pChunk = m_pChunk; |
| - while (pChunk != NULL) { |
| + while (pChunk != nullptr) { |
|
dsinclair
2016/05/03 20:43:52
while (pChunk)
Tom Sepez
2016/05/03 20:59:31
Done.
|
| if (pChunk->iFreeNum > 0) { |
| break; |
| } |
| pChunk = pChunk->pNextChunk; |
| } |
| - if (pChunk == NULL) { |
| + if (pChunk == nullptr) { |
|
dsinclair
2016/05/03 20:43:52
if (!pChunk)
Tom Sepez
2016/05/03 20:59:31
Done.
|
| pChunk = AllocChunk(); |
| } |
| - ASSERT(pChunk != NULL); |
| + ASSERT(pChunk != nullptr); |
|
dsinclair
2016/05/03 20:43:52
ASSERT(pChunk)
Tom Sepez
2016/05/03 20:59:30
Pointless, removed.
|
| uint8_t* pFlags = pChunk->FirstFlag(); |
| size_t i = 0; |
| for (; i < pChunk->iChunkSize; i++) |
| @@ -264,12 +223,12 @@ void* CFX_FixedStore::Alloc(size_t size) { |
| return pChunk->FirstBlock() + i * m_iBlockSize; |
| } |
| void CFX_FixedStore::Free(void* pBlock) { |
| - ASSERT(pBlock != NULL); |
| - FX_FIXEDSTORECHUNK* pPrior = NULL; |
| + ASSERT(pBlock != nullptr); |
|
dsinclair
2016/05/03 20:43:52
ASSERT(pBlock)
Tom Sepez
2016/05/03 20:59:30
removed.
|
| + FX_FIXEDSTORECHUNK* pPrior = nullptr; |
| FX_FIXEDSTORECHUNK* pChunk = m_pChunk; |
| - uint8_t* pStart = NULL; |
| + uint8_t* pStart = nullptr; |
| uint8_t* pEnd; |
| - while (pChunk != NULL) { |
| + while (pChunk != nullptr) { |
|
dsinclair
2016/05/03 20:43:52
while (pChunk)
Tom Sepez
2016/05/03 20:59:30
Done.
|
| pStart = pChunk->FirstBlock(); |
| if (pBlock >= pStart) { |
| pEnd = pStart + m_iBlockSize * pChunk->iChunkSize; |
| @@ -279,7 +238,7 @@ void CFX_FixedStore::Free(void* pBlock) { |
| } |
| pPrior = pChunk, pChunk = pChunk->pNextChunk; |
| } |
| - ASSERT(pChunk != NULL); |
| + ASSERT(pChunk != nullptr); |
|
dsinclair
2016/05/03 20:43:51
ASSERT(pChunk)
Tom Sepez
2016/05/03 20:59:30
Done.
|
| size_t iPos = ((uint8_t*)pBlock - pStart) / m_iBlockSize; |
| ASSERT(iPos < pChunk->iChunkSize); |
| uint8_t* pFlags = pChunk->FirstFlag(); |
| @@ -289,7 +248,7 @@ void CFX_FixedStore::Free(void* pBlock) { |
| pFlags[iPos] = 0; |
| pChunk->iFreeNum++; |
| if (pChunk->iFreeNum == pChunk->iChunkSize) { |
| - if (pPrior == NULL) { |
| + if (pPrior == nullptr) { |
|
dsinclair
2016/05/03 20:43:52
if (!pPrior)
Tom Sepez
2016/05/03 20:59:30
Done.
|
| m_pChunk = pChunk->pNextChunk; |
| } else { |
| pPrior->pNextChunk = pChunk->pNextChunk; |
| @@ -303,144 +262,5 @@ size_t CFX_FixedStore::SetDefChunkSize(size_t iChunkSize) { |
| m_iDefChunkSize = FX_4BYTEALIGN(iChunkSize); |
| return v; |
| } |
| -CFX_DynamicStore::CFX_DynamicStore(size_t iDefChunkSize) |
| - : m_iDefChunkSize(iDefChunkSize), m_pChunk(NULL) { |
| - ASSERT(m_iDefChunkSize != 0); |
| -} |
| -CFX_DynamicStore::~CFX_DynamicStore() { |
| - FX_DYNAMICSTORECHUNK* pChunk = m_pChunk; |
| - while (pChunk) { |
| - FX_DYNAMICSTORECHUNK* pNext = pChunk->pNextChunk; |
| - FX_Free(pChunk); |
| - pChunk = pNext; |
| - } |
| -} |
| -FX_DYNAMICSTORECHUNK* CFX_DynamicStore::AllocChunk(size_t size) { |
| - ASSERT(size != 0); |
| - FX_DYNAMICSTORECHUNK* pChunk = (FX_DYNAMICSTORECHUNK*)FX_Alloc( |
| - uint8_t, |
| - sizeof(FX_DYNAMICSTORECHUNK) + sizeof(FX_DYNAMICSTOREBLOCK) * 2 + size); |
| - if (pChunk == NULL) { |
| - return NULL; |
| - } |
| - pChunk->iChunkSize = size; |
| - pChunk->iFreeSize = size; |
| - FX_DYNAMICSTOREBLOCK* pBlock = pChunk->FirstBlock(); |
| - pBlock->iBlockSize = size; |
| - pBlock->bUsed = FALSE; |
| - pBlock = pBlock->NextBlock(); |
| - pBlock->iBlockSize = 0; |
| - pBlock->bUsed = TRUE; |
| - if (m_pChunk != NULL && size >= m_iDefChunkSize) { |
| - FX_DYNAMICSTORECHUNK* pLast = m_pChunk; |
| - while (pLast->pNextChunk != NULL) { |
| - pLast = pLast->pNextChunk; |
| - } |
| - pLast->pNextChunk = pChunk; |
| - pChunk->pNextChunk = NULL; |
| - } else { |
| - pChunk->pNextChunk = m_pChunk; |
| - m_pChunk = pChunk; |
| - } |
| - return pChunk; |
| -} |
| -void* CFX_DynamicStore::Alloc(size_t size) { |
| - size = FX_4BYTEALIGN(size); |
| - ASSERT(size != 0); |
| - FX_DYNAMICSTORECHUNK* pChunk = m_pChunk; |
| - FX_DYNAMICSTOREBLOCK* pBlock = NULL; |
| - while (pChunk != NULL) { |
| - if (pChunk->iFreeSize >= size) { |
| - pBlock = pChunk->FirstBlock(); |
| - FX_BOOL bFind = FALSE; |
| - while (pBlock->iBlockSize != 0) { |
| - if (!pBlock->bUsed && pBlock->iBlockSize >= size) { |
| - bFind = TRUE; |
| - break; |
| - } |
| - pBlock = pBlock->NextBlock(); |
| - } |
| - if (bFind) { |
| - break; |
| - } |
| - } |
| - pChunk = pChunk->pNextChunk; |
| - } |
| - if (pChunk == NULL) { |
| - pChunk = AllocChunk(std::max(m_iDefChunkSize, size)); |
| - pBlock = pChunk->FirstBlock(); |
| - } |
| - ASSERT(pChunk != NULL && pBlock != NULL); |
| - size_t m = size + sizeof(FX_DYNAMICSTOREBLOCK); |
| - pBlock->bUsed = TRUE; |
| - if (pBlock->iBlockSize > m) { |
| - size_t n = pBlock->iBlockSize; |
| - pBlock->iBlockSize = size; |
| - FX_DYNAMICSTOREBLOCK* pNextBlock = pBlock->NextBlock(); |
| - pNextBlock->bUsed = FALSE; |
| - pNextBlock->iBlockSize = n - size - sizeof(FX_DYNAMICSTOREBLOCK); |
| - pChunk->iFreeSize -= size + sizeof(FX_DYNAMICSTOREBLOCK); |
| - } else { |
| - pChunk->iFreeSize -= pBlock->iBlockSize; |
| - } |
| - return pBlock->Data(); |
| -} |
| -void CFX_DynamicStore::Free(void* pBlock) { |
| - ASSERT(pBlock != NULL); |
| - FX_DYNAMICSTORECHUNK* pPriorChunk = NULL; |
| - FX_DYNAMICSTORECHUNK* pChunk = m_pChunk; |
| - while (pChunk != NULL) { |
| - if (pBlock > pChunk && |
| - pBlock <= ((uint8_t*)pChunk + sizeof(FX_DYNAMICSTORECHUNK) + |
| - pChunk->iChunkSize)) { |
| - break; |
| - } |
| - pPriorChunk = pChunk, pChunk = pChunk->pNextChunk; |
| - } |
| - ASSERT(pChunk != NULL); |
| - FX_DYNAMICSTOREBLOCK* pPriorBlock = NULL; |
| - FX_DYNAMICSTOREBLOCK* pFindBlock = pChunk->FirstBlock(); |
| - while (pFindBlock->iBlockSize != 0) { |
| - if (pBlock == (void*)pFindBlock->Data()) { |
| - break; |
| - } |
| - pPriorBlock = pFindBlock; |
| - pFindBlock = pFindBlock->NextBlock(); |
| - } |
| - ASSERT(pFindBlock->iBlockSize != 0 && pFindBlock->bUsed && |
| - pBlock == (void*)pFindBlock->Data()); |
| - pFindBlock->bUsed = FALSE; |
| - pChunk->iFreeSize += pFindBlock->iBlockSize; |
| - if (pPriorBlock == NULL) { |
| - pPriorBlock = pChunk->FirstBlock(); |
| - } else if (pPriorBlock->bUsed) { |
| - pPriorBlock = pFindBlock; |
| - } |
| - pFindBlock = pPriorBlock; |
| - size_t sizeFree = 0; |
| - size_t sizeBlock = 0; |
| - while (pFindBlock->iBlockSize != 0 && !pFindBlock->bUsed) { |
| - if (pFindBlock != pPriorBlock) { |
| - sizeFree += sizeof(FX_DYNAMICSTOREBLOCK); |
| - sizeBlock += sizeof(FX_DYNAMICSTOREBLOCK); |
| - } |
| - sizeBlock += pFindBlock->iBlockSize; |
| - pFindBlock = pFindBlock->NextBlock(); |
| - } |
| - pPriorBlock->iBlockSize = sizeBlock; |
| - pChunk->iFreeSize += sizeFree; |
| - if (pChunk->iFreeSize == pChunk->iChunkSize) { |
| - if (pPriorChunk == NULL) { |
| - m_pChunk = pChunk->pNextChunk; |
| - } else { |
| - pPriorChunk->pNextChunk = pChunk->pNextChunk; |
| - } |
| - FX_Free(pChunk); |
| - } |
| -} |
| -size_t CFX_DynamicStore::SetDefChunkSize(size_t size) { |
| - ASSERT(size != 0); |
| - size_t v = m_iDefChunkSize; |
| - m_iDefChunkSize = size; |
| - return v; |
| -} |
| + |
| +#endif // MEMORY_TOOL_REPLACES_ALLOCATOR |