summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2012-09-27 19:01:55 -0700
committerRomain Guy <romainguy@google.com>2012-09-27 19:01:55 -0700
commit034de6b1ec561797a2422314e6ef03e3cd3e08e0 (patch)
tree72951205d3982380572e13aa7044f6417cfbc6fc /libs
parent6ed9e43879039ce0cbead08d304edbce79a88ced (diff)
downloadframeworks_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.cpp14
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() {