Title: [220931] trunk/Source/WebKit
- Revision
- 220931
- Author
- [email protected]
- Date
- 2017-08-18 13:53:33 -0700 (Fri, 18 Aug 2017)
Log Message
REGRESSION (r220601): Crash when closing google doc after switching the order of tabs in safari
https://bugs.webkit.org/show_bug.cgi?id=175721
<rdar://problem/33928369>
Reviewed by Geoffrey Garen.
Make sure WebProcess::markAllLayersVolatile() does not call WTFMove() multiple times
on the same completion handler. Use a RefCounter to hold on to the completion handler
and make sure the handler gets called when the RefCounter's value becomes 0.
* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::cancelPrepareToSuspend):
(WebKit::WebProcess::markAllLayersVolatile):
(WebKit::WebProcess::cancelMarkAllLayersVolatile):
* WebProcess/WebProcess.h:
Modified Paths
Diff
Modified: trunk/Source/WebKit/ChangeLog (220930 => 220931)
--- trunk/Source/WebKit/ChangeLog 2017-08-18 20:50:59 UTC (rev 220930)
+++ trunk/Source/WebKit/ChangeLog 2017-08-18 20:53:33 UTC (rev 220931)
@@ -1,3 +1,21 @@
+2017-08-18 Chris Dumez <[email protected]>
+
+ REGRESSION (r220601): Crash when closing google doc after switching the order of tabs in safari
+ https://bugs.webkit.org/show_bug.cgi?id=175721
+ <rdar://problem/33928369>
+
+ Reviewed by Geoffrey Garen.
+
+ Make sure WebProcess::markAllLayersVolatile() does not call WTFMove() multiple times
+ on the same completion handler. Use a RefCounter to hold on to the completion handler
+ and make sure the handler gets called when the RefCounter's value becomes 0.
+
+ * WebProcess/WebProcess.cpp:
+ (WebKit::WebProcess::cancelPrepareToSuspend):
+ (WebKit::WebProcess::markAllLayersVolatile):
+ (WebKit::WebProcess::cancelMarkAllLayersVolatile):
+ * WebProcess/WebProcess.h:
+
2017-08-18 Youenn Fablet <[email protected]>
[Cache API] Add response body storage
Modified: trunk/Source/WebKit/WebProcess/WebProcess.cpp (220930 => 220931)
--- trunk/Source/WebKit/WebProcess/WebProcess.cpp 2017-08-18 20:50:59 UTC (rev 220930)
+++ trunk/Source/WebKit/WebProcess/WebProcess.cpp 2017-08-18 20:53:33 UTC (rev 220931)
@@ -1372,7 +1372,7 @@
// If we've already finished cleaning up and sent ProcessReadyToSuspend, we
// shouldn't send DidCancelProcessSuspension; the UI process strictly expects one or the other.
- if (!m_pagesMarkingLayersAsVolatile)
+ if (!m_pageMarkingLayersAsVolatileCounter)
return;
cancelMarkAllLayersVolatile();
@@ -1384,28 +1384,27 @@
void WebProcess::markAllLayersVolatile(WTF::Function<void()>&& completionHandler)
{
RELEASE_LOG(ProcessSuspension, "%p - WebProcess::markAllLayersVolatile()", this);
- m_pagesMarkingLayersAsVolatile = m_pageMap.size();
- if (!m_pagesMarkingLayersAsVolatile) {
+ ASSERT(!m_pageMarkingLayersAsVolatileCounter);
+ m_pageMarkingLayersAsVolatileCounter = std::make_unique<PageMarkingLayersAsVolatileCounter>([this, completionHandler = WTFMove(completionHandler)] (RefCounterEvent) {
+ if (m_pageMarkingLayersAsVolatileCounter->value())
+ return;
+
completionHandler();
- return;
- }
- for (auto& page : m_pageMap.values()) {
- page->markLayersVolatile([this, completionHandler = WTFMove(completionHandler)] {
- ASSERT(m_pagesMarkingLayersAsVolatile);
- if (!--m_pagesMarkingLayersAsVolatile)
- completionHandler();
- });
- }
+ m_pageMarkingLayersAsVolatileCounter = nullptr;
+ });
+ auto token = m_pageMarkingLayersAsVolatileCounter->count();
+ for (auto& page : m_pageMap.values())
+ page->markLayersVolatile([token] { });
}
void WebProcess::cancelMarkAllLayersVolatile()
{
- if (!m_pagesMarkingLayersAsVolatile)
+ if (!m_pageMarkingLayersAsVolatileCounter)
return;
+ m_pageMarkingLayersAsVolatileCounter = nullptr;
for (auto& page : m_pageMap.values())
page->cancelMarkLayersVolatile();
- m_pagesMarkingLayersAsVolatile = 0;
}
void WebProcess::setAllLayerTreeStatesFrozen(bool frozen)
Modified: trunk/Source/WebKit/WebProcess/WebProcess.h (220930 => 220931)
--- trunk/Source/WebKit/WebProcess/WebProcess.h 2017-08-18 20:50:59 UTC (rev 220930)
+++ trunk/Source/WebKit/WebProcess/WebProcess.h 2017-08-18 20:53:33 UTC (rev 220931)
@@ -40,6 +40,7 @@
#include <wtf/Forward.h>
#include <wtf/HashMap.h>
#include <wtf/HashSet.h>
+#include <wtf/RefCounter.h>
#include <wtf/text/AtomicString.h>
#include <wtf/text/AtomicStringHash.h>
@@ -414,7 +415,10 @@
WebSQLiteDatabaseTracker m_webSQLiteDatabaseTracker;
#endif
- unsigned m_pagesMarkingLayersAsVolatile { 0 };
+ enum PageMarkingLayersAsVolatileCounterType { };
+ using PageMarkingLayersAsVolatileCounter = RefCounter<PageMarkingLayersAsVolatileCounterType>;
+ std::unique_ptr<PageMarkingLayersAsVolatileCounter> m_pageMarkingLayersAsVolatileCounter;
+
bool m_suppressMemoryPressureHandler { false };
#if PLATFORM(MAC)
std::unique_ptr<WebCore::CPUMonitor> m_cpuMonitor;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes