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

Changeset 187129 in webkit


Ignore:
Timestamp:
Jul 21, 2015, 3:33:53 PM (11 years ago)
Author:
dbates@webkit.org
Message:

WTFCrash() in WebKit::WebProcess::networkConnection()
https://bugs.webkit.org/show_bug.cgi?id=147112
<rdar://problem/18477459>

Reviewed by Gavin Barraclough.

Source/WebKit2:

Fixes an issue where a newly launched network process may be jetsam'd because it has not
taken a process assertion between the time it was launched and the time when a web process
makes use of it.

Initially a network process does not have a process assertion. A process assertion is taken
(if one has not been taken) for the network process when a process assertion is taken for at
least one web process. When the network process crashes a WebProcess may ultimately launch a
new network process in WebProcess::networkConnection(). The new network process may be jetsam'd
immediately when the system is under some measure pressure because it has a low jetsam priority,
0 (since it does not have a process assertion and higher priority implies that a process is less
likely to be jetsam'd). And the logic in WebProcess::networkConnection() explicitly calls
CRASH() if the newly launched network process crashes immediately. Towards preventing the newly
launched network process from being jetsam'd we should obtain a process assertion for it.

  • UIProcess/WebProcessPool.cpp:

(WebKit::WebProcessPool::WebProcessPool): Initialize m_didNetworkProcessCrash to false.
(WebKit::WebProcessPool::ensureNetworkProcess): If the network process crashed (m_didNetworkProcessCrash == true)
then tell each process in the pool to reinstate their network activity token for the new network process.
(WebKit::WebProcessPool::networkProcessCrashed): Set m_didNetworkProcessCrash to true when the
network process crashed.

  • UIProcess/WebProcessPool.h:
  • UIProcess/WebProcessProxy.cpp:

(WebKit::WebProcessProxy::reinstateNetworkProcessAssertionState): Added.
(WebKit::WebProcessProxy::didSetAssertionState): Add assert to ensure we never have both
a background- and foreground- activity token for the network process.

  • UIProcess/WebProcessProxy.h:

Source/WTF:

Add explicit boolean conversion function and remove overload of operator! to support
checking whether an activity token is valid more directly than using the overloaded operator!.

  • wtf/RefCounter.h:

(WTF::RefCounter::Token::operator bool): Added.
(WTF::RefCounter::Token::operator!): Deleted.

Location:
trunk/Source
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WTF/ChangeLog

    r187026 r187129  
     12015-07-21  Daniel Bates  <dabates@apple.com>
     2
     3        WTFCrash() in WebKit::WebProcess::networkConnection()
     4        https://bugs.webkit.org/show_bug.cgi?id=147112
     5        <rdar://problem/18477459>
     6
     7        Reviewed by Gavin Barraclough.
     8
     9        Add explicit boolean conversion function and remove overload of operator! to support
     10        checking whether an activity token is valid more directly than using the overloaded operator!.
     11
     12        * wtf/RefCounter.h:
     13        (WTF::RefCounter::Token::operator bool): Added.
     14        (WTF::RefCounter::Token::operator!): Deleted.
     15
    1162015-07-20  Mark Lam  <mark.lam@apple.com>
    217
  • trunk/Source/WTF/wtf/RefCounter.h

    r185273 r187129  
    6868        inline Token<T>& operator=(Token<T>&&);
    6969
    70         bool operator!() const { return !m_ptr; }
     70        explicit operator bool() const { return m_ptr; }
    7171
    7272    private:
  • trunk/Source/WebKit2/ChangeLog

    r187124 r187129  
     12015-07-21  Daniel Bates  <dabates@apple.com>
     2
     3        WTFCrash() in WebKit::WebProcess::networkConnection()
     4        https://bugs.webkit.org/show_bug.cgi?id=147112
     5        <rdar://problem/18477459>
     6
     7        Reviewed by Gavin Barraclough.
     8
     9        Fixes an issue where a newly launched network process may be jetsam'd because it has not
     10        taken a process assertion between the time it was launched and the time when a web process
     11        makes use of it.
     12
     13        Initially a network process does not have a process assertion. A process assertion is taken
     14        (if one has not been taken) for the network process when a process assertion is taken for at
     15        least one web process. When the network process crashes a WebProcess may ultimately launch a
     16        new network process in WebProcess::networkConnection(). The new network process may be jetsam'd
     17        immediately when the system is under some measure pressure because it has a low jetsam priority,
     18        0 (since it does not have a process assertion and higher priority implies that a process is less
     19        likely to be jetsam'd). And the logic in WebProcess::networkConnection() explicitly calls
     20        CRASH() if the newly launched network process crashes immediately. Towards preventing the newly
     21        launched network process from being jetsam'd we should obtain a process assertion for it.
     22
     23        * UIProcess/WebProcessPool.cpp:
     24        (WebKit::WebProcessPool::WebProcessPool): Initialize m_didNetworkProcessCrash to false.
     25        (WebKit::WebProcessPool::ensureNetworkProcess): If the network process crashed (m_didNetworkProcessCrash == true)
     26        then tell each process in the pool to reinstate their network activity token for the new network process.
     27        (WebKit::WebProcessPool::networkProcessCrashed): Set m_didNetworkProcessCrash to true when the
     28        network process crashed.
     29        * UIProcess/WebProcessPool.h:
     30        * UIProcess/WebProcessProxy.cpp:
     31        (WebKit::WebProcessProxy::reinstateNetworkProcessAssertionState): Added.
     32        (WebKit::WebProcessProxy::didSetAssertionState): Add assert to ensure we never have both
     33        a background- and foreground- activity token for the network process.
     34        * UIProcess/WebProcessProxy.h:
     35
    1362015-07-21  Daniel Bates  <dabates@apple.com>
    237
  • trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp

    r186059 r187129  
    161161#if ENABLE(NETWORK_PROCESS)
    162162    , m_canHandleHTTPSServerTrustEvaluation(true)
     163    , m_didNetworkProcessCrash(false)
    163164#endif
    164165#if USE(SOUP)
     
    420421#endif
    421422
     423    if (m_didNetworkProcessCrash) {
     424        m_didNetworkProcessCrash = false;
     425        for (auto& process : m_processes)
     426            process->reinstateNetworkProcessAssertionState(*m_networkProcess);
     427    }
     428
    422429    return *m_networkProcess;
    423430}
     
    427434    ASSERT(m_networkProcess);
    428435    ASSERT(networkProcessProxy == m_networkProcess.get());
     436    m_didNetworkProcessCrash = true;
    429437
    430438    WebContextSupplementMap::const_iterator it = m_supplements.begin();
  • trunk/Source/WebKit2/UIProcess/WebProcessPool.h

    r185736 r187129  
    499499#if ENABLE(NETWORK_PROCESS)
    500500    bool m_canHandleHTTPSServerTrustEvaluation;
     501    bool m_didNetworkProcessCrash;
    501502    RefPtr<NetworkProcessProxy> m_networkProcess;
    502503#endif
  • trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp

    r187023 r187129  
    926926}
    927927
     928#if ENABLE(NETWORK_PROCESS)
     929void WebProcessProxy::reinstateNetworkProcessAssertionState(NetworkProcessProxy& newNetworkProcessProxy)
     930{
     931    ASSERT(!m_backgroundTokenForNetworkProcess || !m_foregroundTokenForNetworkProcess);
     932
     933    // The network process crashed; take new tokens for the new network process.
     934    if (m_backgroundTokenForNetworkProcess)
     935        m_backgroundTokenForNetworkProcess = newNetworkProcessProxy.throttler().backgroundActivityToken();
     936    else if (m_foregroundTokenForNetworkProcess)
     937        m_foregroundTokenForNetworkProcess = newNetworkProcessProxy.throttler().foregroundActivityToken();
     938}
     939#endif
     940
    928941void WebProcessProxy::didSetAssertionState(AssertionState state)
    929942{
    930943#if PLATFORM(IOS) && ENABLE(NETWORK_PROCESS)
     944    ASSERT(!m_backgroundTokenForNetworkProcess || !m_foregroundTokenForNetworkProcess);
     945
    931946    switch (state) {
    932947    case AssertionState::Suspended:
     
    951966        break;
    952967    }
     968
     969    ASSERT(!m_backgroundTokenForNetworkProcess || !m_foregroundTokenForNetworkProcess);
    953970#else
    954971    UNUSED_PARAM(state);
  • trunk/Source/WebKit2/UIProcess/WebProcessProxy.h

    r184774 r187129  
    6060
    6161class DownloadProxyMap;
     62class NetworkProcessProxy;
    6263class WebBackForwardListItem;
    6364class WebPageGroup;
     
    151152    ProcessThrottler& throttler() { return m_throttler; }
    152153
     154#if ENABLE(NETWORK_PROCESS)
     155    void reinstateNetworkProcessAssertionState(NetworkProcessProxy&);
     156#endif
     157
    153158private:
    154159    explicit WebProcessProxy(WebProcessPool&);
Note: See TracChangeset for help on using the changeset viewer.