ASSERT(m_suspendMessageCount >= 0) fails in ProcessThrottler::didCancelProcessSuspens...
authordbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 21 Jul 2015 21:39:58 +0000 (21:39 +0000)
committerdbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 21 Jul 2015 21:39:58 +0000 (21:39 +0000)
when WebContent process crashes; Network process may never voluntarily suspend
https://bugs.webkit.org/show_bug.cgi?id=147122
<rdar://problem/21906759>

Reviewed by Chris Dumez.

Fixes an issue where the network process may never voluntarily release its process assertion.

Currently the network process always sends both a ProcessReadyToSuspend and CancelPrepareToSuspend
message in response to receiving a PrepareToSuspend message and CancelPrepareToSuspend message,
respectively. The process throttler expects to receive either a ProcessReadyToSuspend message
or a CancelPrepareToSuspend message (and not both) in response to sending the message sequence
PrepareToSuspend, CancelPrepareToSuspend. When a process throttler receives both messages in
response to this sequence then its internal message count becomes imbalanced and it will
never release the process assertion it manages. One user interaction that can cause such an
imbalance, in the process throttler held by NetworkProcessProxy, is switching tabs.

* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::cancelPrepareToSuspend): Do not send message NetworkProcessProxy::DidCancelProcessSuspension.
* UIProcess/Network/NetworkProcessProxy.cpp:
(WebKit::NetworkProcessProxy::didCancelProcessSuspension): Deleted.
* UIProcess/Network/NetworkProcessProxy.h:
* UIProcess/Network/NetworkProcessProxy.messages.in: Remove message NetworkProcessProxy::DidCancelProcessSuspension.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@187124 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit2/ChangeLog
Source/WebKit2/NetworkProcess/NetworkProcess.cpp
Source/WebKit2/UIProcess/Network/NetworkProcessProxy.cpp
Source/WebKit2/UIProcess/Network/NetworkProcessProxy.h
Source/WebKit2/UIProcess/Network/NetworkProcessProxy.messages.in

index 4876e65..4da6538 100644 (file)
@@ -1,3 +1,30 @@
+2015-07-21  Daniel Bates  <dabates@apple.com>
+
+        ASSERT(m_suspendMessageCount >= 0) fails in ProcessThrottler::didCancelProcessSuspension()
+        when WebContent process crashes; Network process may never voluntarily suspend
+        https://bugs.webkit.org/show_bug.cgi?id=147122
+        <rdar://problem/21906759>
+
+        Reviewed by Chris Dumez.
+
+        Fixes an issue where the network process may never voluntarily release its process assertion.
+
+        Currently the network process always sends both a ProcessReadyToSuspend and CancelPrepareToSuspend
+        message in response to receiving a PrepareToSuspend message and CancelPrepareToSuspend message,
+        respectively. The process throttler expects to receive either a ProcessReadyToSuspend message
+        or a CancelPrepareToSuspend message (and not both) in response to sending the message sequence
+        PrepareToSuspend, CancelPrepareToSuspend. When a process throttler receives both messages in
+        response to this sequence then its internal message count becomes imbalanced and it will
+        never release the process assertion it manages. One user interaction that can cause such an
+        imbalance, in the process throttler held by NetworkProcessProxy, is switching tabs.
+
+        * NetworkProcess/NetworkProcess.cpp:
+        (WebKit::NetworkProcess::cancelPrepareToSuspend): Do not send message NetworkProcessProxy::DidCancelProcessSuspension. 
+        * UIProcess/Network/NetworkProcessProxy.cpp:
+        (WebKit::NetworkProcessProxy::didCancelProcessSuspension): Deleted.
+        * UIProcess/Network/NetworkProcessProxy.h:
+        * UIProcess/Network/NetworkProcessProxy.messages.in: Remove message NetworkProcessProxy::DidCancelProcessSuspension.
+
 2015-07-21  Matthew Daiter  <mdaiter@apple.com>
 
         Make sure to invalidate requests for user media after webpage reset
index 3cd14bd..13e1d2a 100644 (file)
@@ -521,7 +521,10 @@ void NetworkProcess::prepareToSuspend()
 
 void NetworkProcess::cancelPrepareToSuspend()
 {
-    parentProcessConnection()->send(Messages::NetworkProcessProxy::DidCancelProcessSuspension(), 0);
+    // Although it is tempting to send a NetworkProcessProxy::DidCancelProcessSuspension message from here
+    // we do not because prepareToSuspend() already replied with a NetworkProcessProxy::ProcessReadyToSuspend
+    // message. And NetworkProcessProxy expects to receive either a NetworkProcessProxy::ProcessReadyToSuspend-
+    // or NetworkProcessProxy::DidCancelProcessSuspension- message, but not both.
 }
 
 void NetworkProcess::processDidResume()
index ff96507..13a4f0a 100644 (file)
@@ -351,11 +351,6 @@ void NetworkProcessProxy::sendCancelPrepareToSuspend()
         send(Messages::NetworkProcess::CancelPrepareToSuspend(), 0);
 }
 
-void NetworkProcessProxy::didCancelProcessSuspension()
-{
-    m_throttler.didCancelProcessSuspension();
-}
-
 void NetworkProcessProxy::sendProcessDidResume()
 {
     if (canSendMessage())
index 324968f..364fc2f 100644 (file)
@@ -69,7 +69,6 @@ public:
     void setProcessSuppressionEnabled(bool);
 #endif
 
-    void didCancelProcessSuspension();
     void processReadyToSuspend();
 
     void setIsHoldingLockedFiles(bool);
index 378ff79..ad3de35 100644 (file)
@@ -32,7 +32,6 @@ messages -> NetworkProcessProxy LegacyReceiver {
     DidDeleteWebsiteDataForOrigins(uint64_t callbackID)
 
     ProcessReadyToSuspend()
-    DidCancelProcessSuspension()
     SetIsHoldingLockedFiles(bool isHoldingLockedFiles)
 
     # Diagnostic messages logging