Title: [282754] trunk/Source/WebKit
Revision
282754
Author
cdu...@apple.com
Date
2021-09-20 10:12:38 -0700 (Mon, 20 Sep 2021)

Log Message

Fix race in RemoteRenderingBackend::allowsExitUnderMemoryPressure()
https://bugs.webkit.org/show_bug.cgi?id=229870
<rdar://82459484>

Reviewed by Simon Fraser.

RemoteRenderingBackend::allowsExitUnderMemoryPressure() gets called on the main thread while
RemoteResourceCache is always modified on a work queue. Introduce a std::atomic<bool> on
the RemoteResourceCache that RemoteRenderingBackend::allowsExitUnderMemoryPressure() can
safely query from the main thread.

* GPUProcess/graphics/RemoteRenderingBackend.cpp:
(WebKit::RemoteRenderingBackend::updateRenderingResourceRequest):
(WebKit::RemoteRenderingBackend::allowsExitUnderMemoryPressure const):
* GPUProcess/graphics/RemoteResourceCache.cpp:
(WebKit::RemoteResourceCache::RemoteResourceCache):
(WebKit::RemoteResourceCache::cacheImageBuffer):
(WebKit::RemoteResourceCache::cacheNativeImage):
(WebKit::RemoteResourceCache::maybeRemoveResource):
(WebKit::RemoteResourceCache::updateHasActiveDrawables):
* GPUProcess/graphics/RemoteResourceCache.h:
(WebKit::RemoteResourceCache::hasActiveDrawables const):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (282753 => 282754)


--- trunk/Source/WebKit/ChangeLog	2021-09-20 16:56:42 UTC (rev 282753)
+++ trunk/Source/WebKit/ChangeLog	2021-09-20 17:12:38 UTC (rev 282754)
@@ -1,3 +1,28 @@
+2021-09-20  Chris Dumez  <cdu...@apple.com>
+
+        Fix race in RemoteRenderingBackend::allowsExitUnderMemoryPressure()
+        https://bugs.webkit.org/show_bug.cgi?id=229870
+        <rdar://82459484>
+
+        Reviewed by Simon Fraser.
+
+        RemoteRenderingBackend::allowsExitUnderMemoryPressure() gets called on the main thread while
+        RemoteResourceCache is always modified on a work queue. Introduce a std::atomic<bool> on
+        the RemoteResourceCache that RemoteRenderingBackend::allowsExitUnderMemoryPressure() can
+        safely query from the main thread.
+
+        * GPUProcess/graphics/RemoteRenderingBackend.cpp:
+        (WebKit::RemoteRenderingBackend::updateRenderingResourceRequest):
+        (WebKit::RemoteRenderingBackend::allowsExitUnderMemoryPressure const):
+        * GPUProcess/graphics/RemoteResourceCache.cpp:
+        (WebKit::RemoteResourceCache::RemoteResourceCache):
+        (WebKit::RemoteResourceCache::cacheImageBuffer):
+        (WebKit::RemoteResourceCache::cacheNativeImage):
+        (WebKit::RemoteResourceCache::maybeRemoveResource):
+        (WebKit::RemoteResourceCache::updateHasActiveDrawables):
+        * GPUProcess/graphics/RemoteResourceCache.h:
+        (WebKit::RemoteResourceCache::hasActiveDrawables const):
+
 2021-09-19  Wenson Hsieh  <wenson_hs...@apple.com>
 
         Teach `WebKit::createShareableBitmap` to snapshot video elements

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp (282753 => 282754)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp	2021-09-20 16:56:42 UTC (rev 282753)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp	2021-09-20 17:12:38 UTC (rev 282754)
@@ -671,7 +671,7 @@
 
 void RemoteRenderingBackend::updateRenderingResourceRequest()
 {
-    bool hasActiveDrawables = !m_remoteResourceCache.imageBuffers().isEmpty() || !m_remoteResourceCache.nativeImages().isEmpty();
+    bool hasActiveDrawables = m_remoteResourceCache.hasActiveDrawables();
     bool hasActiveRequest = m_renderingResourcesRequest.isRequested();
     if (hasActiveDrawables && !hasActiveRequest)
         m_renderingResourcesRequest = ScopedRenderingResourcesRequest::acquire();
@@ -681,7 +681,8 @@
 
 bool RemoteRenderingBackend::allowsExitUnderMemoryPressure() const
 {
-    return m_remoteResourceCache.imageBuffers().isEmpty() && m_remoteResourceCache.nativeImages().isEmpty();
+    ASSERT(isMainRunLoop());
+    return !m_remoteResourceCache.hasActiveDrawables();
 }
 
 RemoteRenderingBackendState RemoteRenderingBackend::lastKnownState() const

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.cpp (282753 => 282754)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.cpp	2021-09-20 16:56:42 UTC (rev 282753)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.cpp	2021-09-20 17:12:38 UTC (rev 282754)
@@ -31,10 +31,20 @@
 namespace WebKit {
 using namespace WebCore;
 
+RemoteResourceCache::RemoteResourceCache(RemoteResourceCache&& other)
+    : m_imageBuffers(WTFMove(other.m_imageBuffers))
+    , m_nativeImages(WTFMove(other.m_nativeImages))
+    , m_fonts(WTFMove(other.m_fonts))
+    , m_resourceUseCounters(WTFMove(other.m_resourceUseCounters))
+{
+    updateHasActiveDrawables();
+}
+
 void RemoteResourceCache::cacheImageBuffer(Ref<ImageBuffer>&& imageBuffer)
 {
     auto renderingResourceIdentifier = imageBuffer->renderingResourceIdentifier();
     m_imageBuffers.add(renderingResourceIdentifier, WTFMove(imageBuffer));
+    updateHasActiveDrawables();
 
     ensureResourceUseCounter(renderingResourceIdentifier);
 }
@@ -48,6 +58,7 @@
 {
     auto renderingResourceIdentifier = image->renderingResourceIdentifier();
     m_nativeImages.add(renderingResourceIdentifier, WTFMove(image));
+    updateHasActiveDrawables();
 
     ensureResourceUseCounter(renderingResourceIdentifier);
 }
@@ -117,10 +128,10 @@
 
     m_resourceUseCounters.remove(iterator);
 
-    if (m_imageBuffers.remove(renderingResourceIdentifier))
+    if (m_imageBuffers.remove(renderingResourceIdentifier) || m_nativeImages.remove(renderingResourceIdentifier)) {
+        updateHasActiveDrawables();
         return true;
-    if (m_nativeImages.remove(renderingResourceIdentifier))
-        return true;
+    }
     if (m_fonts.remove(renderingResourceIdentifier))
         return true;
 
@@ -151,6 +162,11 @@
     return maybeRemoveResource(renderingResourceIdentifier, iterator);
 }
 
+void RemoteResourceCache::updateHasActiveDrawables()
+{
+    m_hasActiveDrawables = !m_imageBuffers.isEmpty() || !m_nativeImages.isEmpty();
+}
+
 } // namespace WebKit
 
 #endif // ENABLE(GPU_PROCESS)

Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.h (282753 => 282754)


--- trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.h	2021-09-20 16:56:42 UTC (rev 282753)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteResourceCache.h	2021-09-20 17:12:38 UTC (rev 282754)
@@ -40,6 +40,7 @@
 class RemoteResourceCache {
 public:
     RemoteResourceCache() = default;
+    RemoteResourceCache(RemoteResourceCache&&);
 
     void cacheImageBuffer(Ref<WebCore::ImageBuffer>&&);
     WebCore::ImageBuffer* cachedImageBuffer(WebCore::RenderingResourceIdentifier);
@@ -53,6 +54,8 @@
     const WebCore::NativeImageHashMap& nativeImages() const { return m_nativeImages; }
     const WebCore::FontRenderingResourceMap& fonts() const { return m_fonts; }
 
+    bool hasActiveDrawables() const { return m_hasActiveDrawables; }
+
 private:
     // Because the cache/release messages are sent asynchronously from the display list items which
     // reference the resources, it's totally possible that we see a release message before we've
@@ -78,9 +81,12 @@
     bool maybeRemoveResource(WebCore::RenderingResourceIdentifier, ResourceUseCountersMap::iterator&);
     void ensureResourceUseCounter(WebCore::RenderingResourceIdentifier);
 
+    void updateHasActiveDrawables();
+
     WebCore::ImageBufferHashMap m_imageBuffers;
     WebCore::NativeImageHashMap m_nativeImages;
     WebCore::FontRenderingResourceMap m_fonts;
+    std::atomic<bool> m_hasActiveDrawables { false };
 
     ResourceUseCountersMap m_resourceUseCounters;
 };
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to