OSDN Git Service

Fix leak in reused display lists
authorChet Haase <chet@google.com>
Fri, 4 Feb 2011 00:32:46 +0000 (16:32 -0800)
committerChet Haase <chet@google.com>
Fri, 4 Feb 2011 00:33:26 +0000 (16:33 -0800)
Change-Id: I32a9c41abf8f8cbcaaaa6fcc82d296800014a1b2

libs/hwui/DisplayListRenderer.cpp
libs/hwui/DisplayListRenderer.h

index 51c81b0..2df52ae 100644 (file)
@@ -68,6 +68,10 @@ DisplayList::DisplayList(const DisplayListRenderer& recorder) {
 }
 
 DisplayList::~DisplayList() {
+    clearResources();
+}
+
+void DisplayList::clearResources() {
     sk_free((void*) mReader.base());
 
     Caches& caches = Caches::getInstance();
@@ -98,7 +102,7 @@ DisplayList::~DisplayList() {
     mMatrices.clear();
 }
 
-void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder) {
+void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) {
     const SkWriter32& writer = recorder.writeStream();
     init();
 
@@ -106,6 +110,11 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde
         return;
     }
 
+    if (reusing) {
+        // re-using display list - clear out previous allocations
+        clearResources();
+    }
+
     size_t size = writer.size();
     void* buffer = sk_malloc_throw(size);
     writer.flatten(buffer);
@@ -531,7 +540,7 @@ DisplayList* DisplayListRenderer::getDisplayList() {
     if (mDisplayList == NULL) {
         mDisplayList = new DisplayList(*this);
     } else {
-        mDisplayList->initFromDisplayListRenderer(*this);
+        mDisplayList->initFromDisplayListRenderer(*this, true);
     }
     return mDisplayList;
 }
index e762dfb..2d0e30a 100644 (file)
@@ -102,13 +102,15 @@ public:
 
     static const char* OP_NAMES[];
 
-    void initFromDisplayListRenderer(const DisplayListRenderer& recorder);
+    void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false);
 
     bool replay(OpenGLRenderer& renderer, uint32_t level = 0);
 
 private:
     void init();
 
+    void clearResources();
+
     class TextContainer {
     public:
         size_t length() const {