WebKit Bugzilla
Attachment 370587 Details for
Bug 198201
: Stop StorageManager when network process is ready to suspend
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-198201-20190524140151.patch (text/plain), 6.17 KB, created by
Sihui Liu
on 2019-05-24 14:01:52 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Sihui Liu
Created:
2019-05-24 14:01:52 PDT
Size:
6.17 KB
patch
obsolete
>Subversion Revision: 245746 >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 76cf24000ad7630ec8edd27d4ded69cea75fc34e..ea5a1dfe5b821508b87f094206788dd0889b96aa 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,24 @@ >+2019-05-24 Sihui Liu <sihui_liu@apple.com> >+ >+ Stop StorageManager when network process is ready to suspend >+ https://bugs.webkit.org/show_bug.cgi?id=198201 >+ <rdar://problem/49683172> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ To avoid local storage database operations that can hold lock to databases files, suspend thread of >+ StorageManager when network process is suspended. >+ >+ * NetworkProcess/NetworkProcess.cpp: >+ (WebKit::NetworkProcess::actualPrepareToSuspend): >+ (WebKit::NetworkProcess::resume): >+ * NetworkProcess/NetworkSession.cpp: >+ (WebKit::NetworkSession::~NetworkSession): >+ * NetworkProcess/WebStorage/StorageManager.cpp: >+ (WebKit::StorageManager::suspend): >+ (WebKit::StorageManager::waitUntilResume): >+ * NetworkProcess/WebStorage/StorageManager.h: >+ > 2019-05-23 Ross Kirsling <ross.kirsling@sony.com> > > Socket-based RWI should be able to inspect a JSContext >diff --git a/Source/WebKit/NetworkProcess/NetworkProcess.cpp b/Source/WebKit/NetworkProcess/NetworkProcess.cpp >index a5d6f5cfcc7c4325e9ad73136f36fda299d1de0b..1c8c5f15060e5fd92544d4b222647ae0e0bb5703 100644 >--- a/Source/WebKit/NetworkProcess/NetworkProcess.cpp >+++ b/Source/WebKit/NetworkProcess/NetworkProcess.cpp >@@ -2031,6 +2031,9 @@ void NetworkProcess::actualPrepareToSuspend(ShouldAcknowledgeWhenReadyToSuspend > for (auto& server : m_swServers.values()) > server->startSuspension([delayedTaskCounter] { }); > #endif >+ >+ for (auto& session : m_networkSessions) >+ session.value->storageManager().suspend([delayedTaskCounter] { }); > } > > void NetworkProcess::processWillSuspendImminently() >@@ -2099,6 +2102,9 @@ void NetworkProcess::resume() > for (auto& server : m_idbServers.values()) > server->resume(); > #endif >+ >+ for (auto& session : m_networkSessions) >+ session.value->storageManager().waitUntilResume(); > } > > void NetworkProcess::prefetchDNS(const String& hostname) >diff --git a/Source/WebKit/NetworkProcess/NetworkSession.cpp b/Source/WebKit/NetworkProcess/NetworkSession.cpp >index 94a123700e5f1709995439e29cb5f7c42b8ddd88..5dfa71a29879473ecb8f1bd5945f133887f4386c 100644 >--- a/Source/WebKit/NetworkProcess/NetworkSession.cpp >+++ b/Source/WebKit/NetworkProcess/NetworkSession.cpp >@@ -90,6 +90,7 @@ NetworkSession::NetworkSession(NetworkProcess& networkProcess, PAL::SessionID se > > NetworkSession::~NetworkSession() > { >+ m_storageManager->waitUntilResume(); > m_storageManager->waitUntilWritesFinished(); > } > >diff --git a/Source/WebKit/NetworkProcess/WebStorage/StorageManager.cpp b/Source/WebKit/NetworkProcess/WebStorage/StorageManager.cpp >index 003945053f55034c23087e90798bf9b7dfbe8623..edf68d4a909651d56e578bf2aeb9ef238fe44884 100644 >--- a/Source/WebKit/NetworkProcess/WebStorage/StorageManager.cpp >+++ b/Source/WebKit/NetworkProcess/WebStorage/StorageManager.cpp >@@ -37,7 +37,6 @@ > #include <WebCore/TextEncoding.h> > #include <memory> > #include <wtf/WorkQueue.h> >-#include <wtf/threads/BinarySemaphore.h> > > namespace WebKit { > using namespace WebCore; >@@ -944,6 +943,51 @@ void StorageManager::waitUntilWritesFinished() > semaphore.wait(); > } > >+void StorageManager::suspend(CompletionHandler<void()>&& completionHandler) >+{ >+ if (m_isEphemeral) >+ return; >+ >+ { >+ Locker<Lock> shouldSuspendLocker(m_shouldSuspendLock); >+ if (m_shouldSuspend) >+ return; >+ m_shouldSuspend = true; >+ } >+ m_queue->dispatch([this, protectedThis = makeRef(*this), completionHandler = WTFMove(completionHandler)] () mutable { >+ { >+ Locker<Lock> suspendLocker(m_suspendedLock); >+ m_suspended = true; >+ } >+ completionHandler(); >+ { >+ Locker<Lock> shouldSuspendLocker(m_shouldSuspendLock); >+ while (m_shouldSuspend) >+ m_shouldSuspendCondition.wait(m_shouldSuspendLock); >+ } >+ >+ Locker<Lock> suspendedLocker(m_suspendedLock); >+ m_suspended = false; >+ m_suspendedCondition.notifyOne(); >+ }); >+} >+ >+void StorageManager::waitUntilResume() >+{ >+ if (m_isEphemeral) >+ return; >+ >+ { >+ Locker<Lock> shouldSuspendLocker(m_shouldSuspendLock); >+ m_shouldSuspend = false; >+ m_shouldSuspendCondition.notifyOne(); >+ } >+ >+ Locker<Lock> suspendedLocker(m_suspendedLock); >+ while (m_suspended) >+ m_suspendedCondition.wait(m_suspendedLock); >+} >+ > StorageManager::StorageArea* StorageManager::findStorageArea(IPC::Connection& connection, uint64_t storageMapID) const > { > std::pair<IPC::Connection::UniqueID, uint64_t> connectionAndStorageMapIDPair(connection.uniqueID(), storageMapID); >diff --git a/Source/WebKit/NetworkProcess/WebStorage/StorageManager.h b/Source/WebKit/NetworkProcess/WebStorage/StorageManager.h >index a888332efcfb594130b2608846af4a182182b790..8c1e90fff84699900425608d21a28f727413cfa6 100644 >--- a/Source/WebKit/NetworkProcess/WebStorage/StorageManager.h >+++ b/Source/WebKit/NetworkProcess/WebStorage/StorageManager.h >@@ -33,6 +33,7 @@ > #include <wtf/Function.h> > #include <wtf/HashSet.h> > #include <wtf/text/StringHash.h> >+#include <wtf/threads/BinarySemaphore.h> > > namespace WebCore { > class SecurityOrigin; >@@ -58,6 +59,8 @@ public: > > void processDidCloseConnection(IPC::Connection&); > void waitUntilWritesFinished(); >+ void suspend(CompletionHandler<void()>&&); >+ void waitUntilResume(); > > void getSessionStorageOrigins(Function<void(HashSet<WebCore::SecurityOriginData>&&)>&& completionHandler); > void deleteSessionStorageOrigins(Function<void()>&& completionHandler); >@@ -113,6 +116,14 @@ private: > > HashMap<WebCore::SecurityOriginData, Ref<WebCore::StorageMap>> m_ephemeralStorage; > bool m_isEphemeral { false }; >+ >+ bool m_suspended { false }; >+ Condition m_suspendedCondition; >+ Lock m_suspendedLock; >+ >+ bool m_shouldSuspend { false }; >+ Condition m_shouldSuspendCondition; >+ Lock m_shouldSuspendLock; > }; > > } // namespace WebKit
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 198201
:
370532
|
370583
|
370587
|
370867
|
370887
|
370894
|
370976