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