Title: [270417] trunk/Source
Revision
270417
Author
[email protected]
Date
2020-12-03 16:24:28 -0800 (Thu, 03 Dec 2020)

Log Message

[GPU Process] Disconnect NativeImages from RemoteResourceCacheProxy when RemoteRenderingBackendProxy is destroyed
https://bugs.webkit.org/show_bug.cgi?id=219417

Reviewed by Tim Horton.

Source/WebCore:

Allow multiple observers for a single NativeImage. The NativeImage is
usually a frame of a CachedImage. The CachedImage can be referenced by
multiple pages and every page has its RemoteRenderingBackendProxy which
is a superclass of NativeImage::Observer.s

* platform/graphics/NativeImage.cpp:
(WebCore::NativeImage::~NativeImage):
* platform/graphics/NativeImage.h:
(WebCore::NativeImage::addObserver):
(WebCore::NativeImage::removeObserver):
(WebCore::NativeImage::setObserver): Deleted.
(): Deleted.

Source/WebKit:

If the WebPage is destroyed before destroying the CachedImages, a crash
may happen. The NativeImage will try to release itself from its observer,
which is RemoteResourceCacheProxy, after it has been freed.

* WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp:
(WebKit::RemoteResourceCacheProxy::~RemoteResourceCacheProxy):
(WebKit::RemoteResourceCacheProxy::cacheNativeImage):
* WebProcess/GPU/graphics/RemoteResourceCacheProxy.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (270416 => 270417)


--- trunk/Source/WebCore/ChangeLog	2020-12-04 00:07:04 UTC (rev 270416)
+++ trunk/Source/WebCore/ChangeLog	2020-12-04 00:24:28 UTC (rev 270417)
@@ -1,3 +1,23 @@
+2020-12-03  Said Abou-Hallawa  <[email protected]>
+
+        [GPU Process] Disconnect NativeImages from RemoteResourceCacheProxy when RemoteRenderingBackendProxy is destroyed
+        https://bugs.webkit.org/show_bug.cgi?id=219417
+
+        Reviewed by Tim Horton.
+
+        Allow multiple observers for a single NativeImage. The NativeImage is 
+        usually a frame of a CachedImage. The CachedImage can be referenced by
+        multiple pages and every page has its RemoteRenderingBackendProxy which
+        is a superclass of NativeImage::Observer.s
+
+        * platform/graphics/NativeImage.cpp:
+        (WebCore::NativeImage::~NativeImage):
+        * platform/graphics/NativeImage.h:
+        (WebCore::NativeImage::addObserver):
+        (WebCore::NativeImage::removeObserver):
+        (WebCore::NativeImage::setObserver): Deleted.
+        (): Deleted.
+
 2020-12-03  Simon Fraser  <[email protected]>
 
         Use red color for sync wheel event handler debug overlay text

Modified: trunk/Source/WebCore/platform/graphics/NativeImage.cpp (270416 => 270417)


--- trunk/Source/WebCore/platform/graphics/NativeImage.cpp	2020-12-04 00:07:04 UTC (rev 270416)
+++ trunk/Source/WebCore/platform/graphics/NativeImage.cpp	2020-12-04 00:24:28 UTC (rev 270417)
@@ -58,8 +58,8 @@
 
 NativeImage::~NativeImage()
 {
-    if (m_observer)
-        m_observer->releaseNativeImage(m_renderingResourceIdentifier);
+    for (auto observer : m_observers)
+        observer->releaseNativeImage(m_renderingResourceIdentifier);
 }
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/graphics/NativeImage.h (270416 => 270417)


--- trunk/Source/WebCore/platform/graphics/NativeImage.h	2020-12-04 00:07:04 UTC (rev 270416)
+++ trunk/Source/WebCore/platform/graphics/NativeImage.h	2020-12-04 00:24:28 UTC (rev 270417)
@@ -32,6 +32,7 @@
 #include "PlatformImage.h"
 #include "RenderingResourceIdentifier.h"
 #include <wtf/HashMap.h>
+#include <wtf/HashSet.h>
 #include <wtf/RefCounted.h>
 #include <wtf/WeakPtr.h>
 
@@ -60,7 +61,9 @@
     bool hasAlpha() const;
     Color singlePixelSolidColor() const;
 
-    void setObserver(Observer* observer) { m_observer = observer; }
+    void addObserver(Observer& observer) { m_observers.add(&observer); }
+    void removeObserver(Observer& observer) { m_observers.remove(&observer); }
+    
     void clearSubimages();
 
 private:
@@ -68,7 +71,7 @@
     NativeImage(const PlatformImagePtr&, RenderingResourceIdentifier);
 
     PlatformImagePtr m_platformImage;
-    Observer* m_observer { nullptr };
+    HashSet<Observer*> m_observers;
     RenderingResourceIdentifier m_renderingResourceIdentifier;
 };
 

Modified: trunk/Source/WebKit/ChangeLog (270416 => 270417)


--- trunk/Source/WebKit/ChangeLog	2020-12-04 00:07:04 UTC (rev 270416)
+++ trunk/Source/WebKit/ChangeLog	2020-12-04 00:24:28 UTC (rev 270417)
@@ -1,3 +1,19 @@
+2020-12-03  Said Abou-Hallawa  <[email protected]>
+
+        [GPU Process] Disconnect NativeImages from RemoteResourceCacheProxy when RemoteRenderingBackendProxy is destroyed
+        https://bugs.webkit.org/show_bug.cgi?id=219417
+
+        Reviewed by Tim Horton.
+
+        If the WebPage is destroyed before destroying the CachedImages, a crash
+        may happen. The NativeImage will try to release itself from its observer,
+        which is RemoteResourceCacheProxy, after it has been freed.
+
+        * WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp:
+        (WebKit::RemoteResourceCacheProxy::~RemoteResourceCacheProxy):
+        (WebKit::RemoteResourceCacheProxy::cacheNativeImage):
+        * WebProcess/GPU/graphics/RemoteResourceCacheProxy.h:
+
 2020-12-03  Chris Dumez  <[email protected]>
 
         Bad IPC from the WebProcess should not terminate the GPUProcess

Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp (270416 => 270417)


--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp	2020-12-04 00:07:04 UTC (rev 270416)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.cpp	2020-12-04 00:24:28 UTC (rev 270417)
@@ -38,6 +38,12 @@
 {
 }
 
+RemoteResourceCacheProxy::~RemoteResourceCacheProxy()
+{
+    for (auto& image : m_nativeImages.values())
+        image->removeObserver(*this);
+}
+
 void RemoteResourceCacheProxy::cacheImageBuffer(WebCore::ImageBuffer& imageBuffer)
 {
     auto addResult = m_imageBuffers.add(imageBuffer.renderingResourceIdentifier(), makeWeakPtr(imageBuffer));
@@ -60,7 +66,7 @@
     m_nativeImages.ensure(image.renderingResourceIdentifier(), [&]() {
         // Set itself as an observer to NativeImage, so releaseNativeImage()
         // gets called when NativeImage is being deleleted.
-        image.setObserver(this);
+        image.addObserver(*this);
 
         // Tell the GPU process to cache this resource.
         m_remoteRenderingBackendProxy.cacheNativeImage(image);

Modified: trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.h (270416 => 270417)


--- trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.h	2020-12-04 00:07:04 UTC (rev 270416)
+++ trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteResourceCacheProxy.h	2020-12-04 00:24:28 UTC (rev 270417)
@@ -42,6 +42,7 @@
 class RemoteResourceCacheProxy : public WebCore::NativeImage::Observer {
 public:
     RemoteResourceCacheProxy(RemoteRenderingBackendProxy&);
+    ~RemoteResourceCacheProxy();
 
     void cacheImageBuffer(WebCore::ImageBuffer&);
     WebCore::ImageBuffer* cachedImageBuffer(WebCore::RenderingResourceIdentifier);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to