bmalloc: tryFastMalloc shouldn't crash
authorggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 9 Mar 2015 18:43:08 +0000 (18:43 +0000)
committerggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 9 Mar 2015 18:43:08 +0000 (18:43 +0000)
https://bugs.webkit.org/show_bug.cgi?id=142443

Reviewed by Anders Carlsson.

Part 1: Stop using tryFastRealloc.

* Shared/ShareableBitmap.cpp:
(WebKit::ShareableBitmap::resize): Deleted.
* Shared/ShareableBitmap.h: Removed the resize function because it has
no clients.

* WebProcess/Plugins/PluginProxy.cpp:
(WebKit::PluginProxy::updateBackingStore): Changed to allocate a new
backing store instead of resizing the old one. This has three advantages:

(1) Might be more memory-efficient, since you don't have to keep the old
one around while allocating the new one.

(2) Avoids the overhead of realloc() copying the contents of the old
backing store even though we only want uninitialized memory.

(3) Makes resize failure consistent with initial allocation failure.
Previously, while initial allocation failure would set the backing store
to null, resize failure would keep the old wrong backing store and then
tell it not to paint. Now, resize failure also sets the backing store to
null.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@181272 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit2/ChangeLog
Source/WebKit2/Shared/ShareableBitmap.cpp
Source/WebKit2/Shared/ShareableBitmap.h
Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp

index cc06917..83f1dd1 100644 (file)
@@ -1,3 +1,33 @@
+2015-03-09  Geoffrey Garen  <ggaren@apple.com>
+
+        bmalloc: tryFastMalloc shouldn't crash
+        https://bugs.webkit.org/show_bug.cgi?id=142443
+
+        Reviewed by Anders Carlsson.
+
+        Part 1: Stop using tryFastRealloc.
+
+        * Shared/ShareableBitmap.cpp:
+        (WebKit::ShareableBitmap::resize): Deleted.
+        * Shared/ShareableBitmap.h: Removed the resize function because it has
+        no clients.
+
+        * WebProcess/Plugins/PluginProxy.cpp:
+        (WebKit::PluginProxy::updateBackingStore): Changed to allocate a new
+        backing store instead of resizing the old one. This has three advantages:
+
+        (1) Might be more memory-efficient, since you don't have to keep the old
+        one around while allocating the new one.
+
+        (2) Avoids the overhead of realloc() copying the contents of the old
+        backing store even though we only want uninitialized memory.
+
+        (3) Makes resize failure consistent with initial allocation failure.
+        Previously, while initial allocation failure would set the backing store
+        to null, resize failure would keep the old wrong backing store and then
+        tell it not to paint. Now, resize failure also sets the backing store to
+        null.
+
 2015-03-09  Martin Robinson  <mrobinson@igalia.com>
 
         [EFL] Move DispatchQueue to WTF
index 2a28ca5..2316611 100644 (file)
@@ -138,29 +138,6 @@ ShareableBitmap::~ShareableBitmap()
         fastFree(m_data);
 }
 
-bool ShareableBitmap::resize(const IntSize& size)
-{
-    // We can't resize backing stores that are backed by shared memory.
-    ASSERT(!isBackedBySharedMemory());
-
-    if (size == m_size)
-        return true;
-
-    size_t newNumBytes = numBytesForSize(size);
-    
-    // Try to resize.
-    char* newData = 0;
-    if (!tryFastRealloc(m_data, newNumBytes).getValue(newData)) {
-        // We failed, but the backing store is still kept in a consistent state.
-        return false;
-    }
-
-    m_size = size;
-    m_data = newData;
-
-    return true;
-}
-
 void* ShareableBitmap::data() const
 {
     if (isBackedBySharedMemory())
index b6a7d7c..a4a4305 100644 (file)
@@ -95,8 +95,6 @@ public:
     const WebCore::IntSize& size() const { return m_size; }
     WebCore::IntRect bounds() const { return WebCore::IntRect(WebCore::IntPoint(), size()); }
 
-    bool resize(const WebCore::IntSize& size);
-
     // Create a graphics context that can be used to paint into the backing store.
     std::unique_ptr<WebCore::GraphicsContext> createGraphicsContext();
 
index dd7f929..02c3ee4 100644 (file)
@@ -593,18 +593,15 @@ bool PluginProxy::updateBackingStore()
 
     IntSize backingStoreSize = m_pluginSize;
     backingStoreSize.scale(contentsScaleFactor());
-    
-    if (!m_backingStore) {
-        m_backingStore = ShareableBitmap::create(backingStoreSize, ShareableBitmap::SupportsAlpha);
-        return true;
-    }
 
-    if (backingStoreSize != m_backingStore->size()) {
-        // The backing store already exists, just resize it.
-        return m_backingStore->resize(backingStoreSize);
+    if (m_backingStore) {
+        if (m_backingStore->size() == backingStoreSize)
+            return false;
+        m_backingStore = nullptr; // Give malloc a chance to recycle our backing store.
     }
 
-    return false;
+    m_backingStore = ShareableBitmap::create(backingStoreSize, ShareableBitmap::SupportsAlpha);
+    return !!m_backingStore;
 }
 
 uint64_t PluginProxy::windowNPObjectID()