Title: [139236] trunk/Source/WebCore
Revision
139236
Author
[email protected]
Date
2013-01-09 13:51:10 -0800 (Wed, 09 Jan 2013)

Log Message

SVG-as-image: Throw out cached bitmap renderings after they sit unused for some time.
<http://webkit.org/b/106484>
<rdar://problem/12983216>

Reviewed by Antti Koivisto.

Add a one-shot timer to SVGImageCache to self-clear the bitmap cache 30 seconds after last access.
This prevents us from keeping huge ImageBuffers around in memory for the lifetime of the elements
referencing that particular SVG file. (The ownership model is actually a bit more complicated
but that's irrelevant to this issue.)

10234kB progression on Membuster3.

* svg/graphics/SVGImageCache.cpp:
(WebCore::SVGImageCache::SVGImageCache):
(WebCore::SVGImageCache::~SVGImageCache):
(WebCore::SVGImageCache::clearBitmapCache):
(WebCore::SVGImageCache::cacheClearTimerFired):
(WebCore::SVGImageCache::lookupOrCreateBitmapImageForRenderer):
* svg/graphics/SVGImageCache.h:
(SVGImageCache):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (139235 => 139236)


--- trunk/Source/WebCore/ChangeLog	2013-01-09 21:48:01 UTC (rev 139235)
+++ trunk/Source/WebCore/ChangeLog	2013-01-09 21:51:10 UTC (rev 139236)
@@ -1,3 +1,27 @@
+2013-01-09  Andreas Kling  <[email protected]>
+
+        SVG-as-image: Throw out cached bitmap renderings after they sit unused for some time.
+        <http://webkit.org/b/106484>
+        <rdar://problem/12983216>
+
+        Reviewed by Antti Koivisto.
+
+        Add a one-shot timer to SVGImageCache to self-clear the bitmap cache 30 seconds after last access.
+        This prevents us from keeping huge ImageBuffers around in memory for the lifetime of the elements
+        referencing that particular SVG file. (The ownership model is actually a bit more complicated
+        but that's irrelevant to this issue.)
+
+        10234kB progression on Membuster3.
+
+        * svg/graphics/SVGImageCache.cpp:
+        (WebCore::SVGImageCache::SVGImageCache):
+        (WebCore::SVGImageCache::~SVGImageCache):
+        (WebCore::SVGImageCache::clearBitmapCache):
+        (WebCore::SVGImageCache::cacheClearTimerFired):
+        (WebCore::SVGImageCache::lookupOrCreateBitmapImageForRenderer):
+        * svg/graphics/SVGImageCache.h:
+        (SVGImageCache):
+
 2013-01-09  Alexey Proskuryakov  <[email protected]>
 
         Assertion failure in SubresourceLoader::didFail when reloading

Modified: trunk/Source/WebCore/svg/graphics/SVGImageCache.cpp (139235 => 139236)


--- trunk/Source/WebCore/svg/graphics/SVGImageCache.cpp	2013-01-09 21:48:01 UTC (rev 139235)
+++ trunk/Source/WebCore/svg/graphics/SVGImageCache.cpp	2013-01-09 21:51:10 UTC (rev 139236)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2011 Research In Motion Limited. All rights reserved.
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -31,9 +32,12 @@
 
 namespace WebCore {
 
+static const int timeToKeepCachedBitmapsAfterLastUseInSeconds = 30;
+
 SVGImageCache::SVGImageCache(SVGImage* svgImage)
     : m_svgImage(svgImage)
     , m_redrawTimer(this, &SVGImageCache::redrawTimerFired)
+    , m_cacheClearTimer(this, &SVGImageCache::cacheClearTimerFired, timeToKeepCachedBitmapsAfterLastUseInSeconds)
 {
     ASSERT(m_svgImage);
 }
@@ -41,7 +45,11 @@
 SVGImageCache::~SVGImageCache()
 {
     m_sizeAndScalesMap.clear();
+    clearBitmapCache();
+}
 
+void SVGImageCache::clearBitmapCache()
+{
     ImageDataMap::iterator end = m_imageDataMap.end();
     for (ImageDataMap::iterator it = m_imageDataMap.begin(); it != end; ++it) {
         // Checks if the client (it->key) is still valid. The client should remove itself from this
@@ -125,6 +133,11 @@
        redraw();
 }
 
+void SVGImageCache::cacheClearTimerFired(DeferrableOneShotTimer<SVGImageCache>*)
+{
+    clearBitmapCache();
+}
+
 Image* SVGImageCache::lookupOrCreateBitmapImageForRenderer(const RenderObject* renderer)
 {
     if (!renderer)
@@ -148,6 +161,9 @@
 
     ASSERT(!size.isEmpty());
 
+    // (Re)schedule the oneshot timer to throw out all the cached ImageBuffers if they remain unused for too long.
+    m_cacheClearTimer.restart();
+
     // Lookup image for client in cache and eventually update it.
     ImageDataMap::iterator it = m_imageDataMap.find(client);
     if (it != m_imageDataMap.end()) {

Modified: trunk/Source/WebCore/svg/graphics/SVGImageCache.h (139235 => 139236)


--- trunk/Source/WebCore/svg/graphics/SVGImageCache.h	2013-01-09 21:48:01 UTC (rev 139235)
+++ trunk/Source/WebCore/svg/graphics/SVGImageCache.h	2013-01-09 21:51:10 UTC (rev 139236)
@@ -84,6 +84,8 @@
     SVGImageCache(SVGImage*);
     void redraw();
     void redrawTimerFired(Timer<SVGImageCache>*);
+    void cacheClearTimerFired(DeferrableOneShotTimer<SVGImageCache>*);
+    void clearBitmapCache();
 
     struct ImageData {
         ImageData()
@@ -114,6 +116,7 @@
     SizeAndScalesMap m_sizeAndScalesMap;
     ImageDataMap m_imageDataMap;
     Timer<SVGImageCache> m_redrawTimer;
+    DeferrableOneShotTimer<SVGImageCache> m_cacheClearTimer;
 };
 
 } // namespace WebCore
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to