Changeset 220931 in webkit
- Timestamp:
- Aug 18, 2017 1:53:33 PM (7 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r220928 r220931 1 2017-08-18 Chris Dumez <cdumez@apple.com> 2 3 REGRESSION (r220601): Crash when closing google doc after switching the order of tabs in safari 4 https://bugs.webkit.org/show_bug.cgi?id=175721 5 <rdar://problem/33928369> 6 7 Reviewed by Geoffrey Garen. 8 9 Make sure WebProcess::markAllLayersVolatile() does not call WTFMove() multiple times 10 on the same completion handler. Use a RefCounter to hold on to the completion handler 11 and make sure the handler gets called when the RefCounter's value becomes 0. 12 13 * WebProcess/WebProcess.cpp: 14 (WebKit::WebProcess::cancelPrepareToSuspend): 15 (WebKit::WebProcess::markAllLayersVolatile): 16 (WebKit::WebProcess::cancelMarkAllLayersVolatile): 17 * WebProcess/WebProcess.h: 18 1 19 2017-08-18 Youenn Fablet <youenn@apple.com> 2 20 -
trunk/Source/WebKit/WebProcess/WebProcess.cpp
r220857 r220931 1373 1373 // If we've already finished cleaning up and sent ProcessReadyToSuspend, we 1374 1374 // shouldn't send DidCancelProcessSuspension; the UI process strictly expects one or the other. 1375 if (!m_page sMarkingLayersAsVolatile)1375 if (!m_pageMarkingLayersAsVolatileCounter) 1376 1376 return; 1377 1377 … … 1385 1385 { 1386 1386 RELEASE_LOG(ProcessSuspension, "%p - WebProcess::markAllLayersVolatile()", this); 1387 m_pagesMarkingLayersAsVolatile = m_pageMap.size(); 1388 if (!m_pagesMarkingLayersAsVolatile) { 1387 ASSERT(!m_pageMarkingLayersAsVolatileCounter); 1388 m_pageMarkingLayersAsVolatileCounter = std::make_unique<PageMarkingLayersAsVolatileCounter>([this, completionHandler = WTFMove(completionHandler)] (RefCounterEvent) { 1389 if (m_pageMarkingLayersAsVolatileCounter->value()) 1390 return; 1391 1389 1392 completionHandler(); 1390 return; 1391 } 1392 for (auto& page : m_pageMap.values()) { 1393 page->markLayersVolatile([this, completionHandler = WTFMove(completionHandler)] { 1394 ASSERT(m_pagesMarkingLayersAsVolatile); 1395 if (!--m_pagesMarkingLayersAsVolatile) 1396 completionHandler(); 1397 }); 1398 } 1393 m_pageMarkingLayersAsVolatileCounter = nullptr; 1394 }); 1395 auto token = m_pageMarkingLayersAsVolatileCounter->count(); 1396 for (auto& page : m_pageMap.values()) 1397 page->markLayersVolatile([token] { }); 1399 1398 } 1400 1399 1401 1400 void WebProcess::cancelMarkAllLayersVolatile() 1402 1401 { 1403 if (!m_pagesMarkingLayersAsVolatile) 1404 return; 1405 1402 if (!m_pageMarkingLayersAsVolatileCounter) 1403 return; 1404 1405 m_pageMarkingLayersAsVolatileCounter = nullptr; 1406 1406 for (auto& page : m_pageMap.values()) 1407 1407 page->cancelMarkLayersVolatile(); 1408 m_pagesMarkingLayersAsVolatile = 0;1409 1408 } 1410 1409 -
trunk/Source/WebKit/WebProcess/WebProcess.h
r220887 r220931 41 41 #include <wtf/HashMap.h> 42 42 #include <wtf/HashSet.h> 43 #include <wtf/RefCounter.h> 43 44 #include <wtf/text/AtomicString.h> 44 45 #include <wtf/text/AtomicStringHash.h> … … 415 416 #endif 416 417 417 unsigned m_pagesMarkingLayersAsVolatile { 0 }; 418 enum PageMarkingLayersAsVolatileCounterType { }; 419 using PageMarkingLayersAsVolatileCounter = RefCounter<PageMarkingLayersAsVolatileCounterType>; 420 std::unique_ptr<PageMarkingLayersAsVolatileCounter> m_pageMarkingLayersAsVolatileCounter; 421 418 422 bool m_suppressMemoryPressureHandler { false }; 419 423 #if PLATFORM(MAC)
Note: See TracChangeset
for help on using the changeset viewer.