⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 243388 in webkit


Ignore:
Timestamp:
Mar 22, 2019, 10:40:51 AM (7 years ago)
Author:
Chris Dumez
Message:

Implement WebProcess freezer opt-in completely on WebContent process side
https://bugs.webkit.org/show_bug.cgi?id=196149

Reviewed by Brady Eidson.

Implement WebProcess freezer opt-in completely on WebContent process side, we do not need
to involve the UIProcess with this and rely on IPC which may be fragile.

In the future, we may want to set freezable state from the UIProcess when the API supports
it. We can move the logic to be fully on the UIProcess side then. In the mean time, it is
likely best not to rely on IPC and process coordination for this.

  • UIProcess/WebProcessProxy.cpp:

(WebKit::globalPageMap):
(WebKit::WebProcessProxy::WebProcessProxy):
(WebKit::WebProcessProxy::setIsInProcessCache):
(WebKit::WebProcessProxy::markIsNoLongerInPrewarmedPool):
(WebKit::WebProcessProxy::didFinishLaunching):
(WebKit::WebProcessProxy::validateFreezerStatus): Deleted.

  • UIProcess/WebProcessProxy.h:

(WebKit::WebProcessProxy::removeProvisionalPageProxy):
(WebKit::WebProcessProxy::WebPageProxyMap::WebPageProxyMap): Deleted.
(WebKit::WebProcessProxy::WebPageProxyMap::size const): Deleted.
(WebKit::WebProcessProxy::WebPageProxyMap::values): Deleted.
(WebKit::WebProcessProxy::WebPageProxyMap::values const): Deleted.
(WebKit::WebProcessProxy::WebPageProxyMap::begin): Deleted.
(WebKit::WebProcessProxy::WebPageProxyMap::end): Deleted.
(WebKit::WebProcessProxy::WebPageProxyMap::get): Deleted.
(WebKit::WebProcessProxy::WebPageProxyMap::contains const): Deleted.
(WebKit::WebProcessProxy::WebPageProxyMap::isEmpty const): Deleted.
(WebKit::WebProcessProxy::WebPageProxyMap::set): Deleted.
(WebKit::WebProcessProxy::WebPageProxyMap::take): Deleted.

  • WebProcess/WebProcess.cpp:

(WebKit::WebProcess::setIsInProcessCache):
(WebKit::WebProcess::markIsNoLongerPrewarmed):
(WebKit::WebProcess::actualPrepareToSuspend):
(WebKit::WebProcess::setFreezable): Deleted.

  • WebProcess/WebProcess.h:
  • WebProcess/WebProcess.messages.in:
  • WebProcess/cocoa/WebProcessCocoa.mm:

(WebKit::WebProcess::updateProcessName):
(WebKit::WebProcess::shouldFreezeOnSuspension const):
(WebKit::WebProcess::updateFreezerStatus):

Location:
trunk/Source/WebKit
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r243384 r243388  
     12019-03-22  Chris Dumez  <cdumez@apple.com>
     2
     3        Implement WebProcess freezer opt-in completely on WebContent process side
     4        https://bugs.webkit.org/show_bug.cgi?id=196149
     5
     6        Reviewed by Brady Eidson.
     7
     8        Implement WebProcess freezer opt-in completely on WebContent process side, we do not need
     9        to involve the UIProcess with this and rely on IPC which may be fragile.
     10
     11        In the future, we may want to set freezable state from the UIProcess when the API supports
     12        it. We can move the logic to be fully on the UIProcess side then. In the mean time, it is
     13        likely best not to rely on IPC and process coordination for this.
     14
     15        * UIProcess/WebProcessProxy.cpp:
     16        (WebKit::globalPageMap):
     17        (WebKit::WebProcessProxy::WebProcessProxy):
     18        (WebKit::WebProcessProxy::setIsInProcessCache):
     19        (WebKit::WebProcessProxy::markIsNoLongerInPrewarmedPool):
     20        (WebKit::WebProcessProxy::didFinishLaunching):
     21        (WebKit::WebProcessProxy::validateFreezerStatus): Deleted.
     22        * UIProcess/WebProcessProxy.h:
     23        (WebKit::WebProcessProxy::removeProvisionalPageProxy):
     24        (WebKit::WebProcessProxy::WebPageProxyMap::WebPageProxyMap): Deleted.
     25        (WebKit::WebProcessProxy::WebPageProxyMap::size const): Deleted.
     26        (WebKit::WebProcessProxy::WebPageProxyMap::values): Deleted.
     27        (WebKit::WebProcessProxy::WebPageProxyMap::values const): Deleted.
     28        (WebKit::WebProcessProxy::WebPageProxyMap::begin): Deleted.
     29        (WebKit::WebProcessProxy::WebPageProxyMap::end): Deleted.
     30        (WebKit::WebProcessProxy::WebPageProxyMap::get): Deleted.
     31        (WebKit::WebProcessProxy::WebPageProxyMap::contains const): Deleted.
     32        (WebKit::WebProcessProxy::WebPageProxyMap::isEmpty const): Deleted.
     33        (WebKit::WebProcessProxy::WebPageProxyMap::set): Deleted.
     34        (WebKit::WebProcessProxy::WebPageProxyMap::take): Deleted.
     35        * WebProcess/WebProcess.cpp:
     36        (WebKit::WebProcess::setIsInProcessCache):
     37        (WebKit::WebProcess::markIsNoLongerPrewarmed):
     38        (WebKit::WebProcess::actualPrepareToSuspend):
     39        (WebKit::WebProcess::setFreezable): Deleted.
     40        * WebProcess/WebProcess.h:
     41        * WebProcess/WebProcess.messages.in:
     42        * WebProcess/cocoa/WebProcessCocoa.mm:
     43        (WebKit::WebProcess::updateProcessName):
     44        (WebKit::WebProcess::shouldFreezeOnSuspension const):
     45        (WebKit::WebProcess::updateFreezerStatus):
     46
    1472019-03-22  Chris Dumez  <cdumez@apple.com>
    248
  • trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp

    r243384 r243388  
    116116}
    117117
    118 static WebProcessProxy::WebPageProxyMap::MapType& globalPageMap()
     118static WebProcessProxy::WebPageProxyMap& globalPageMap()
    119119{
    120120    ASSERT(isMainThreadOrCheckDisabled());
    121     static NeverDestroyed<WebProcessProxy::WebPageProxyMap::MapType> pageMap;
     121    static NeverDestroyed<WebProcessProxy::WebPageProxyMap> pageMap;
    122122    return pageMap;
    123123}
     
    137137    , m_processPool(processPool, isPrewarmed == IsPrewarmed::Yes ? IsWeak::Yes : IsWeak::No)
    138138    , m_mayHaveUniversalFileReadSandboxExtension(false)
    139     , m_pageMap(*this)
    140139    , m_numberOfTimesSuddenTerminationWasDisabled(0)
    141140    , m_throttler(*this, processPool.shouldTakeUIBackgroundAssertion())
     
    189188}
    190189
    191 void WebProcessProxy::validateFreezerStatus()
    192 {
    193 #if PLATFORM(IOS_FAMILY)
    194     bool value = !m_isPrewarmed && !m_isInProcessCache && !m_pageMap.isEmpty() && !isServiceWorkerProcess();
    195     if (m_currentIsFreezableValue != WTF::nullopt && m_currentIsFreezableValue == value)
    196         return;
    197 
    198     m_currentIsFreezableValue = value;
    199     send(Messages::WebProcess::SetFreezable(value), 0);
    200 #endif
    201 }
    202 
    203190void WebProcessProxy::setIsInProcessCache(bool value)
    204191{
     
    216203        m_processPool.setIsWeak(IsWeak::No);
    217204    }
    218    
    219     validateFreezerStatus();
    220205}
    221206
     
    400385    RELEASE_ASSERT(m_processPool);
    401386    m_processPool.setIsWeak(IsWeak::No);
    402 
    403     validateFreezerStatus();
    404387
    405388    send(Messages::WebProcess::MarkIsNoLongerPrewarmed(), 0);
     
    796779    unblockAccessibilityServerIfNeeded();
    797780#endif
    798 
    799     validateFreezerStatus();
    800781}
    801782
  • trunk/Source/WebKit/UIProcess/WebProcessProxy.h

    r243384 r243388  
    9797public:
    9898    typedef HashMap<uint64_t, RefPtr<WebFrameProxy>> WebFrameProxyMap;
     99    typedef HashMap<uint64_t, WebPageProxy*> WebPageProxyMap;
    99100    typedef HashMap<uint64_t, RefPtr<API::UserInitiatedAction>> UserInitiatedActionMap;
    100101
     
    136137    void addProvisionalPageProxy(ProvisionalPageProxy& provisionalPage) { ASSERT(!m_provisionalPages.contains(&provisionalPage)); m_provisionalPages.add(&provisionalPage); }
    137138    void removeProvisionalPageProxy(ProvisionalPageProxy& provisionalPage) { ASSERT(m_provisionalPages.contains(&provisionalPage)); m_provisionalPages.remove(&provisionalPage); }
    138 
    139     class WebPageProxyMap {
    140     public:
    141         WebPageProxyMap(WebProcessProxy& proxy)
    142             : m_proxy(proxy)
    143         {
    144         }
    145 
    146         typedef HashMap<uint64_t, WebPageProxy*> MapType;
    147         using ValuesConstIteratorRange = MapType::ValuesConstIteratorRange;
    148 
    149         auto size() const { return m_map.size(); }
    150         auto values() { return m_map.values(); }
    151         auto values() const { return m_map.values(); }
    152         auto begin() { return m_map.begin(); }
    153         auto end() { return m_map.end(); }
    154         auto get(uint64_t key) { return m_map.get(key); }
    155         auto contains(uint64_t key) const { return m_map.contains(key); }
    156         auto isEmpty() const { return m_map.isEmpty(); }
    157 
    158         auto set(uint64_t key, WebPageProxy* value)
    159         {
    160             auto result = m_map.set(key, value);
    161             m_proxy.validateFreezerStatus();
    162             return result;
    163         }
    164 
    165         auto take(uint64_t key)
    166         {
    167             auto result = m_map.take(key);
    168             m_proxy.validateFreezerStatus();
    169             return result;
    170         }
    171 
    172     private:
    173         WebProcessProxy& m_proxy;
    174         MapType m_map;
    175     };
    176 
    177139   
    178140    typename WebPageProxyMap::ValuesConstIteratorRange pages() const { return m_pageMap.values(); }
     
    509471    bool m_hasCommittedAnyProvisionalLoads { false };
    510472    bool m_isPrewarmed;
    511     Optional<bool> m_currentIsFreezableValue;
    512473
    513474#if PLATFORM(WATCHOS)
  • trunk/Source/WebKit/WebProcess/WebProcess.cpp

    r243384 r243388  
    151151#endif
    152152
    153 #if PLATFORM(IOS_FAMILY)
    154 #include <bmalloc/MemoryStatusSPI.h>
    155 #endif
    156 
    157153// This should be less than plugInAutoStartExpirationTimeThreshold in PlugInAutoStartProvider.
    158154static const Seconds plugInAutoStartExpirationTimeUpdateThreshold { 29 * 24 * 60 * 60 };
     
    508504void WebProcess::setIsInProcessCache(bool isInProcessCache)
    509505{
    510 #if PLATFORM(MAC)
     506#if PLATFORM(COCOA)
    511507    if (isInProcessCache) {
    512508        ASSERT(m_processType == ProcessType::WebContent);
     
    525521void WebProcess::markIsNoLongerPrewarmed()
    526522{
    527 #if PLATFORM(MAC)
     523#if PLATFORM(COCOA)
    528524    ASSERT(m_processType == ProcessType::PrewarmedWebContent);
    529525    m_processType = ProcessType::WebContent;
     
    14701466#if PLATFORM(IOS_FAMILY)
    14711467    accessibilityProcessSuspendedNotification(true);
     1468    updateFreezerStatus();
    14721469#endif
    14731470
     
    18851882}
    18861883
    1887 void WebProcess::setFreezable(bool freezable)
    1888 {
    1889 #if PLATFORM(IOS_FAMILY)
    1890     auto result = memorystatus_control(MEMORYSTATUS_CMD_SET_PROCESS_IS_FREEZABLE, getpid(), freezable ? 1 : 0, nullptr, 0);
    1891     ASSERT_UNUSED(result, !result);
    1892 #endif
    1893 }
    1894 
    18951884#if PLATFORM(IOS_FAMILY)
    18961885void WebProcess::unblockAccessibilityServer(const SandboxExtension::Handle& handle)
  • trunk/Source/WebKit/WebProcess/WebProcess.h

    r243384 r243388  
    412412
    413413#if PLATFORM(MAC)
    414     void updateProcessName();
    415414    void setScreenProperties(const WebCore::ScreenProperties&);
    416415#if ENABLE(WEBPROCESS_WINDOWSERVER_BLOCKING)
     
    421420#endif
    422421
     422#if PLATFORM(COCOA)
     423    void updateProcessName();
     424#endif
     425
    423426#if PLATFORM(IOS)
    424427    void backlightLevelDidChange(float backlightLevel);
     428
     429    bool shouldFreezeOnSuspension() const;
     430    void updateFreezerStatus();
    425431#endif
    426432
     
    431437
    432438    void clearCurrentModifierStateForTesting();
    433     void setFreezable(bool);
    434439
    435440    RefPtr<WebConnectionToUIProcess> m_webConnection;
     
    506511    Optional<double> m_cpuLimit;
    507512
     513    String m_uiProcessName;
     514    WebCore::RegistrableDomain m_registrableDomain;
     515#endif
     516
     517#if PLATFORM(COCOA)
    508518    enum class ProcessType { Inspector, ServiceWorker, PrewarmedWebContent, CachedWebContent, WebContent };
    509519    ProcessType m_processType { ProcessType::WebContent };
    510     String m_uiProcessName;
    511     WebCore::RegistrableDomain m_registrableDomain;
    512520#endif
    513521
  • trunk/Source/WebKit/WebProcess/WebProcess.messages.in

    r243384 r243388  
    163163    UnblockAccessibilityServer(WebKit::SandboxExtension::Handle handle)
    164164#endif
    165 
    166     SetFreezable(bool freezable)
    167165}
  • trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm

    r243384 r243388  
    6363#import <WebCore/PerformanceLogging.h>
    6464#import <WebCore/RuntimeApplicationChecks.h>
     65#import <WebCore/SWContextManager.h>
    6566#import <algorithm>
    6667#import <dispatch/dispatch.h>
     
    8182
    8283#if PLATFORM(IOS_FAMILY)
     84#include <bmalloc/MemoryStatusSPI.h>
     85#endif
     86
     87#if PLATFORM(IOS_FAMILY)
    8388#import "WKAccessibilityWebPageObjectIOS.h"
    8489#import <UIKit/UIAccessibility.h>
     
    238243}
    239244
    240 #if PLATFORM(MAC)
    241245void WebProcess::updateProcessName()
    242246{
     247#if PLATFORM(MAC)
    243248    NSString *applicationName;
    244249    switch (m_processType) {
     
    274279#endif
    275280    });
    276 }
    277281#endif // PLATFORM(MAC)
     282}
    278283
    279284static void registerWithAccessibility()
     
    682687    UIAccessibilityPostNotification(kAXPidStatusChangedNotification, @{ @"pid" : @(getpid()), @"suspended" : @(suspended) });
    683688}
     689
     690bool WebProcess::shouldFreezeOnSuspension() const
     691{
     692    switch (m_processType) {
     693    case ProcessType::Inspector:
     694    case ProcessType::ServiceWorker:
     695    case ProcessType::PrewarmedWebContent:
     696    case ProcessType::CachedWebContent:
     697        return false;
     698    case ProcessType::WebContent:
     699        break;
     700    }
     701
     702    for (auto& page : m_pageMap.values()) {
     703        if (!page->isSuspended())
     704            return false;
     705    }
     706
     707    return true;
     708}
     709
     710void WebProcess::updateFreezerStatus()
     711{
     712    bool isFreezable = shouldFreezeOnSuspension();
     713    auto result = memorystatus_control(MEMORYSTATUS_CMD_SET_PROCESS_IS_FREEZABLE, getpid(), isFreezable ? 1 : 0, nullptr, 0);
     714    if (result)
     715        RELEASE_LOG_ERROR(ProcessSuspension, "%p - WebProcess::updateFreezerStatus() isFreezable: %d, error: %d", this, isFreezable, result);
     716    else
     717        RELEASE_LOG(ProcessSuspension, "%p - WebProcess::updateFreezerStatus() isFreezable: %d, success", this, isFreezable);
     718}
    684719#endif
    685720
Note: See TracChangeset for help on using the changeset viewer.