Title: [227128] branches/safari-605-branch/Source/WebCore

Diff

Modified: branches/safari-605-branch/Source/WebCore/ChangeLog (227127 => 227128)


--- branches/safari-605-branch/Source/WebCore/ChangeLog	2018-01-18 06:51:30 UTC (rev 227127)
+++ branches/safari-605-branch/Source/WebCore/ChangeLog	2018-01-18 07:24:04 UTC (rev 227128)
@@ -1,5 +1,36 @@
 2018-01-17  Jason Marcell  <[email protected]>
 
+        Cherry-pick r226934. rdar://problem/36567980
+
+    2018-01-12  Chris Dumez  <[email protected]>
+
+            ASSERTION FAILED: registration || isTerminating() in WebCore::SWServerWorker::skipWaiting()
+            https://bugs.webkit.org/show_bug.cgi?id=181603
+            <rdar://problem/36476050>
+
+            Reviewed by Youenn Fablet.
+
+            No new tests, covered by existing tests that crash flakily.
+
+            * workers/service/server/SWServer.cpp:
+            (WebCore::SWServer::terminateWorkerInternal):
+            If the connection to the context process is gone, make sure we make the worker as terminated
+            so that it does not stay in Running state and in SWServer::m_runningOrTerminatingWorkers.
+
+            * workers/service/server/SWServerRegistration.cpp:
+            (WebCore::SWServerRegistration::~SWServerRegistration):
+            Add assertions to make sure none of the registration's workers are still running when
+            the registration is destroyed.
+
+            (WebCore::SWServerRegistration::updateRegistrationState):
+            Make sure registration workers that are overwritten are not still running.
+
+            * workers/service/server/SWServerWorker.cpp:
+            (WebCore::SWServerWorker::setState):
+            If a worker's state is set to redundant, make sure we also terminate it.
+
+2018-01-17  Jason Marcell  <[email protected]>
+
         Cherry-pick r227103. rdar://problem/36598105
 
     2018-01-17  John Wilander  <[email protected]>

Modified: branches/safari-605-branch/Source/WebCore/workers/service/server/SWServer.cpp (227127 => 227128)


--- branches/safari-605-branch/Source/WebCore/workers/service/server/SWServer.cpp	2018-01-18 06:51:30 UTC (rev 227127)
+++ branches/safari-605-branch/Source/WebCore/workers/service/server/SWServer.cpp	2018-01-18 07:24:04 UTC (rev 227128)
@@ -562,19 +562,19 @@
 void SWServer::terminateWorkerInternal(SWServerWorker& worker, TerminationMode mode)
 {
     ASSERT(worker.isRunning());
+    ASSERT(m_runningOrTerminatingWorkers.get(worker.identifier()) == &worker);
+    ASSERT(!worker.isTerminating());
 
+    worker.setState(SWServerWorker::State::Terminating);
+
     auto* connection = SWServerToContextConnection::connectionForIdentifier(worker.contextConnectionIdentifier());
     ASSERT(connection);
     if (!connection) {
         LOG_ERROR("Request to terminate a worker whose context connection does not exist");
+        workerContextTerminated(worker);
         return;
     }
 
-    ASSERT(m_runningOrTerminatingWorkers.get(worker.identifier()) == &worker);
-    ASSERT(!worker.isTerminating());
-
-    worker.setState(SWServerWorker::State::Terminating);
-
     switch (mode) {
     case Asynchronous:
         connection->terminateWorker(worker.identifier());

Modified: branches/safari-605-branch/Source/WebCore/workers/service/server/SWServerRegistration.cpp (227127 => 227128)


--- branches/safari-605-branch/Source/WebCore/workers/service/server/SWServerRegistration.cpp	2018-01-18 06:51:30 UTC (rev 227127)
+++ branches/safari-605-branch/Source/WebCore/workers/service/server/SWServerRegistration.cpp	2018-01-18 07:24:04 UTC (rev 227128)
@@ -54,6 +54,9 @@
 
 SWServerRegistration::~SWServerRegistration()
 {
+    ASSERT(!m_installingWorker || !m_installingWorker->isRunning());
+    ASSERT(!m_waitingWorker || !m_waitingWorker->isRunning());
+    ASSERT(!m_activeWorker || !m_activeWorker->isRunning());
 }
 
 SWServerWorker* SWServerRegistration::getNewestWorker()
@@ -72,12 +75,15 @@
     
     switch (state) {
     case ServiceWorkerRegistrationState::Installing:
+        ASSERT(!m_installingWorker || !m_installingWorker->isRunning() || m_waitingWorker == m_installingWorker);
         m_installingWorker = worker;
         break;
     case ServiceWorkerRegistrationState::Waiting:
+        ASSERT(!m_waitingWorker || !m_waitingWorker->isRunning() || m_activeWorker == m_waitingWorker);
         m_waitingWorker = worker;
         break;
     case ServiceWorkerRegistrationState::Active:
+        ASSERT(!m_activeWorker || !m_activeWorker->isRunning());
         m_activeWorker = worker;
         break;
     };

Modified: branches/safari-605-branch/Source/WebCore/workers/service/server/SWServerWorker.cpp (227127 => 227128)


--- branches/safari-605-branch/Source/WebCore/workers/service/server/SWServerWorker.cpp	2018-01-18 06:51:30 UTC (rev 227127)
+++ branches/safari-605-branch/Source/WebCore/workers/service/server/SWServerWorker.cpp	2018-01-18 07:24:04 UTC (rev 227128)
@@ -56,6 +56,8 @@
 
     auto result = allWorkers().add(identifier, this);
     ASSERT_UNUSED(result, result.isNewEntry);
+
+    ASSERT(m_server.getRegistration(m_registrationKey));
 }
 
 SWServerWorker::~SWServerWorker()
@@ -168,6 +170,9 @@
 
 void SWServerWorker::setState(ServiceWorkerState state)
 {
+    if (state == ServiceWorkerState::Redundant)
+        terminate();
+
     m_data.state = state;
 
     auto* registration = m_server.getRegistration(m_registrationKey);
@@ -189,6 +194,12 @@
         handler(success);
 }
 
+void SWServerWorker::setState(State state)
+{
+    ASSERT(state != State::Running || m_server.getRegistration(m_registrationKey));
+    m_state = state;
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(SERVICE_WORKER)

Modified: branches/safari-605-branch/Source/WebCore/workers/service/server/SWServerWorker.h (227127 => 227128)


--- branches/safari-605-branch/Source/WebCore/workers/service/server/SWServerWorker.h	2018-01-18 06:51:30 UTC (rev 227127)
+++ branches/safari-605-branch/Source/WebCore/workers/service/server/SWServerWorker.h	2018-01-18 07:24:04 UTC (rev 227128)
@@ -68,7 +68,7 @@
     };
     bool isRunning() const { return m_state == State::Running; }
     bool isTerminating() const { return m_state == State::Terminating; }
-    void setState(State state) { m_state = state; }
+    void setState(State);
 
     SWServer& server() { return m_server; }
     const ServiceWorkerRegistrationKey& registrationKey() const { return m_registrationKey; }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to