diff options
author | Romain Guy <romainguy@google.com> | 2012-09-27 19:01:55 -0700 |
---|---|---|
committer | Romain Guy <romainguy@google.com> | 2012-09-27 19:01:55 -0700 |
commit | 034de6b1ec561797a2422314e6ef03e3cd3e08e0 (patch) | |
tree | 72951205d3982380572e13aa7044f6417cfbc6fc /libs | |
parent | 6ed9e43879039ce0cbead08d304edbce79a88ced (diff) | |
download | frameworks_base-034de6b1ec561797a2422314e6ef03e3cd3e08e0.zip frameworks_base-034de6b1ec561797a2422314e6ef03e3cd3e08e0.tar.gz frameworks_base-034de6b1ec561797a2422314e6ef03e3cd3e08e0.tar.bz2 |
Plug memory leak that happens when reusing display lists
Bug #7195815
We did not reclaim resources when reusing an existing DisplayList to
record a new empty list of commands. This would lead to various memory
leaks: bitmaps, paints, paths, matrices, etc.
This is not a common case but some apps run into this situation,
such as Launcher.
Change-Id: I2eb14ac86a212123f8edbe42b70a7c1c51fa4145
Diffstat (limited to 'libs')
-rw-r--r-- | libs/hwui/DisplayListRenderer.cpp | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/libs/hwui/DisplayListRenderer.cpp b/libs/hwui/DisplayListRenderer.cpp index 6aff8d4..6ca70a4 100644 --- a/libs/hwui/DisplayListRenderer.cpp +++ b/libs/hwui/DisplayListRenderer.cpp @@ -143,6 +143,7 @@ void DisplayList::destroyDisplayListDeferred(DisplayList* displayList) { void DisplayList::clearResources() { sk_free((void*) mReader.base()); + mReader.setMemory(NULL, 0); delete mTransformMatrix; delete mTransformCamera; @@ -216,19 +217,19 @@ void DisplayList::clearResources() { void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) { const SkWriter32& writer = recorder.writeStream(); - init(); - - if (writer.size() == 0) { - mFunctorCount = 0; - return; - } if (reusing) { // re-using display list - clear out previous allocations clearResources(); } + + init(); initProperties(); + if (writer.size() == 0) { + return; + } + mSize = writer.size(); void* buffer = sk_malloc_throw(mSize); writer.flatten(buffer); @@ -301,6 +302,7 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde void DisplayList::init() { mSize = 0; mIsRenderable = true; + mFunctorCount = 0; } size_t DisplayList::getSize() { |