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

Reply via email to