Changeset 220931 in webkit


Ignore:
Timestamp:
Aug 18, 2017 1:53:33 PM (7 years ago)
Author:
Chris Dumez
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:
Location:
trunk/Source/WebKit
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r220928 r220931  
     12017-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
    1192017-08-18  Youenn Fablet  <youenn@apple.com>
    220
  • trunk/Source/WebKit/WebProcess/WebProcess.cpp

    r220857 r220931  
    13731373    // If we've already finished cleaning up and sent ProcessReadyToSuspend, we
    13741374    // shouldn't send DidCancelProcessSuspension; the UI process strictly expects one or the other.
    1375     if (!m_pagesMarkingLayersAsVolatile)
     1375    if (!m_pageMarkingLayersAsVolatileCounter)
    13761376        return;
    13771377
     
    13851385{
    13861386    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
    13891392        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] { });
    13991398}
    14001399
    14011400void WebProcess::cancelMarkAllLayersVolatile()
    14021401{
    1403     if (!m_pagesMarkingLayersAsVolatile)
    1404         return;
    1405 
     1402    if (!m_pageMarkingLayersAsVolatileCounter)
     1403        return;
     1404
     1405    m_pageMarkingLayersAsVolatileCounter = nullptr;
    14061406    for (auto& page : m_pageMap.values())
    14071407        page->cancelMarkLayersVolatile();
    1408     m_pagesMarkingLayersAsVolatile = 0;
    14091408}
    14101409
  • trunk/Source/WebKit/WebProcess/WebProcess.h

    r220887 r220931  
    4141#include <wtf/HashMap.h>
    4242#include <wtf/HashSet.h>
     43#include <wtf/RefCounter.h>
    4344#include <wtf/text/AtomicString.h>
    4445#include <wtf/text/AtomicStringHash.h>
     
    415416#endif
    416417
    417     unsigned m_pagesMarkingLayersAsVolatile { 0 };
     418    enum PageMarkingLayersAsVolatileCounterType { };
     419    using PageMarkingLayersAsVolatileCounter = RefCounter<PageMarkingLayersAsVolatileCounterType>;
     420    std::unique_ptr<PageMarkingLayersAsVolatileCounter> m_pageMarkingLayersAsVolatileCounter;
     421
    418422    bool m_suppressMemoryPressureHandler { false };
    419423#if PLATFORM(MAC)
Note: See TracChangeset for help on using the changeset viewer.