diff options
author | Chris Craik <ccraik@android.com> | 2014-03-25 20:27:52 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-03-25 20:27:52 +0000 |
commit | 6fe434a41b378c601189c70cbe209171588d92c4 (patch) | |
tree | fdc1c144e69a14dde6cdc5d89d0f0e75336b8925 /libs | |
parent | bdaafaf2b59af08d75d86b2e124a866f09683c5b (diff) | |
parent | 4118480aabb4a7b332e289ebb71d2e4f9bc05d7e (diff) | |
download | frameworks_base-6fe434a41b378c601189c70cbe209171588d92c4.zip frameworks_base-6fe434a41b378c601189c70cbe209171588d92c4.tar.gz frameworks_base-6fe434a41b378c601189c70cbe209171588d92c4.tar.bz2 |
am 4118480a: am 80470cdf: Merge "Solve three memory leaks related to PatchCache"
* commit '4118480aabb4a7b332e289ebb71d2e4f9bc05d7e':
Solve three memory leaks related to PatchCache
Diffstat (limited to 'libs')
-rw-r--r-- | libs/hwui/Patch.cpp | 1 | ||||
-rw-r--r-- | libs/hwui/PatchCache.cpp | 17 |
2 files changed, 16 insertions, 2 deletions
diff --git a/libs/hwui/Patch.cpp b/libs/hwui/Patch.cpp index b2148b0..442e9ba 100644 --- a/libs/hwui/Patch.cpp +++ b/libs/hwui/Patch.cpp @@ -36,6 +36,7 @@ Patch::Patch(): vertices(NULL), verticesCount(0), indexCount(0), hasEmptyQuads(f } Patch::~Patch() { + delete[] vertices; } /////////////////////////////////////////////////////////////////////////////// diff --git a/libs/hwui/PatchCache.cpp b/libs/hwui/PatchCache.cpp index 8a44604..2f2debc 100644 --- a/libs/hwui/PatchCache.cpp +++ b/libs/hwui/PatchCache.cpp @@ -119,6 +119,17 @@ void PatchCache::remove(Vector<patch_pair_t>& patchesToRemove, Res_png_9patch* p void PatchCache::removeDeferred(Res_png_9patch* patch) { Mutex::Autolock _l(mLock); + + // Assert that patch is not already garbage + size_t count = mGarbage.size(); + for (size_t i = 0; i < count; i++) { + if (patch == mGarbage[i]) { + patch = NULL; + break; + } + } + LOG_ALWAYS_FATAL_IF(patch == NULL); + mGarbage.push(patch); } @@ -143,8 +154,8 @@ void PatchCache::clearGarbage() { for (size_t i = 0; i < patchesToRemove.size(); i++) { const patch_pair_t& pair = patchesToRemove[i]; - // Add a new free block to the list - const Patch* patch = pair.getSecond(); + // Release the patch and mark the space in the free list + Patch* patch = pair.getSecond(); BufferBlock* block = new BufferBlock(patch->offset, patch->getSize()); block->next = mFreeBlocks; mFreeBlocks = block; @@ -152,6 +163,7 @@ void PatchCache::clearGarbage() { mSize -= patch->getSize(); mCache.remove(*pair.getFirst()); + delete patch; } #if DEBUG_PATCHES @@ -216,6 +228,7 @@ void PatchCache::setupMesh(Patch* newMesh, TextureVertex* vertices) { } else { mFreeBlocks = block->next; } + delete block; } else { // Resize the block now that it's occupied block->offset += size; |