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
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::clearResources() {
     sk_free((void*) mReader.base());
+    mReader.setMemory(NULL, 0);
 
     delete mTransformMatrix;
     delete mTransformCamera;
@@ -216,19 +217,19 @@
 
 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::init() {
     mSize = 0;
     mIsRenderable = true;
+    mFunctorCount = 0;
 }
 
 size_t DisplayList::getSize() {