WebKit Bugzilla
Attachment 343876 Details for
Bug 187108
: Add configuration for automatic process pre-warming
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-187108-20180628174354.patch (text/plain), 10.53 KB, created by
Ben Richards
on 2018-06-28 17:43:55 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Ben Richards
Created:
2018-06-28 17:43:55 PDT
Size:
10.53 KB
patch
obsolete
>Subversion Revision: 233313 >diff --git a/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h b/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h >index 053e91be2916875adb40937d025be94fe997af8c..0d922925706da9d4dfc254cb0ea599ded5156c2c 100644 >--- a/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h >+++ b/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h >@@ -49,6 +49,9 @@ public: > > bool shouldHaveLegacyDataStore() const { return m_shouldHaveLegacyDataStore; } > void setShouldHaveLegacyDataStore(bool shouldHaveLegacyDataStore) { m_shouldHaveLegacyDataStore = shouldHaveLegacyDataStore; } >+ >+ bool useProcessPreWarming() const { return m_useProcessPreWarming; } >+ void setUseProcessPreWarming(bool useProcessPreWarming) { m_useProcessPreWarming = useProcessPreWarming; } > > unsigned maximumProcessCount() const { return m_maximumProcessCount; } > void setMaximumProcessCount(unsigned maximumProcessCount) { m_maximumProcessCount = maximumProcessCount; } >@@ -156,6 +159,7 @@ public: > > private: > bool m_shouldHaveLegacyDataStore { false }; >+ bool m_useProcessPreWarming { true }; > > unsigned m_maximumProcessCount { 0 }; > bool m_diskCacheSpeculativeValidationEnabled { false }; >diff --git a/Source/WebKit/UIProcess/API/C/WKContext.cpp b/Source/WebKit/UIProcess/API/C/WKContext.cpp >index 439a502559b544e66448958dc6dcd3e7015f7898..9c14a53b9c58ee148616d605cd4a18d09a6d534e 100644 >--- a/Source/WebKit/UIProcess/API/C/WKContext.cpp >+++ b/Source/WebKit/UIProcess/API/C/WKContext.cpp >@@ -505,7 +505,7 @@ void WKContextSetHTTPPipeliningEnabled(WKContextRef contextRef, bool enabled) > > void WKContextWarmInitialProcess(WKContextRef contextRef) > { >- toImpl(contextRef)->warmInitialProcess(); >+ toImpl(contextRef)->warmNewProcess(); > } > > void WKContextGetStatistics(WKContextRef contextRef, void* context, WKContextGetStatisticsFunction callback) >diff --git a/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.cpp b/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.cpp >index c5c4664d61a0b7851d1d98481bf8bee35bc12b67..c6adb753caa22c18a2c2f6924bfed5f409768791 100644 >--- a/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.cpp >+++ b/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.cpp >@@ -178,6 +178,16 @@ void WKContextConfigurationSetAlwaysKeepAndReuseSwappedProcesses(WKContextConfig > toImpl(configuration)->setAlwaysKeepAndReuseSwappedProcesses(keepAndReuse); > } > >+bool WKContextConfigurationUseProcessPreWarming(WKContextConfigurationRef configuration) >+{ >+ return toImpl(configuration)->useProcessPreWarming(); >+} >+ >+void WKContextConfigurationSetUseProcessPreWarming(WKContextConfigurationRef configuration, bool useProcessPreWarming) >+{ >+ toImpl(configuration)->setUseProcessPreWarming(useProcessPreWarming); >+} >+ > bool WKContextConfigurationProcessSwapsOnWindowOpenWithOpener(WKContextConfigurationRef configuration) > { > return toImpl(configuration)->processSwapsOnWindowOpenWithOpener(); >diff --git a/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.h b/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.h >index 0580116d4fe7d283201520ea6b5b223e95e9016f..0247502a3f80456c41f4b67e16820c7d5b468f36 100644 >--- a/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.h >+++ b/Source/WebKit/UIProcess/API/C/WKContextConfigurationRef.h >@@ -73,6 +73,9 @@ WK_EXPORT void WKContextConfigurationSetProcessSwapsOnNavigation(WKContextConfig > > WK_EXPORT bool WKContextConfigurationAlwaysKeepAndReuseSwappedProcesses(WKContextConfigurationRef configuration); > WK_EXPORT void WKContextConfigurationSetAlwaysKeepAndReuseSwappedProcesses(WKContextConfigurationRef configuration, bool keepAndReuse); >+ >+WK_EXPORT bool WKContextConfigurationUseProcessPreWarming(WKContextConfigurationRef configuration); >+WK_EXPORT void WKContextConfigurationSetUseProcessPreWarming(WKContextConfigurationRef configuration, bool useProcessPreWarming); > > WK_EXPORT bool WKContextConfigurationProcessSwapsOnWindowOpenWithOpener(WKContextConfigurationRef configuration); > WK_EXPORT void WKContextConfigurationSetProcessSwapsOnWindowOpenWithOpener(WKContextConfigurationRef configuration, bool swaps); >diff --git a/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm b/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm >index c4397cff64ffe081c82bd91bfffe2b7167d38d47..224e192e4d62fe467650a6f6b890eef276394231 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm >+++ b/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm >@@ -397,7 +397,7 @@ - (void)_setAutomationDelegate:(id <_WKAutomationDelegate>)automationDelegate > > - (void)_warmInitialProcess > { >- _processPool->warmInitialProcess(); >+ _processPool->warmNewProcess(); > } > > - (void)_automationCapabilitiesDidChange >diff --git a/Source/WebKit/UIProcess/WebPageProxy.cpp b/Source/WebKit/UIProcess/WebPageProxy.cpp >index 99aeede341f440959b44853de693b4eeddde6fd2..c66ad56758791603771a9a87d753759d8003fd8e 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.cpp >+++ b/Source/WebKit/UIProcess/WebPageProxy.cpp >@@ -3893,7 +3893,7 @@ void WebPageProxy::didFirstVisuallyNonEmptyLayoutForFrame(uint64_t frameID, cons > > if (frame->isMainFrame()) { > m_pageClient.didFirstVisuallyNonEmptyLayoutForMainFrame(); >- notifyProcessPoolToPrewarm(); >+// notifyProcessPoolToPrewarm(); > } > } > >diff --git a/Source/WebKit/UIProcess/WebProcessPool.cpp b/Source/WebKit/UIProcess/WebProcessPool.cpp >index e861c9b427f0961d2a4f8c83d1edbb469e82a25f..379eda7d7e27e888f537bfb1724c07bbbfb6236b 100644 >--- a/Source/WebKit/UIProcess/WebProcessPool.cpp >+++ b/Source/WebKit/UIProcess/WebProcessPool.cpp >@@ -302,6 +302,9 @@ WebProcessPool::WebProcessPool(API::ProcessPoolConfiguration& configuration) > #endif > > notifyThisWebProcessPoolWasCreated(); >+ >+ if (m_configuration->useProcessPreWarming()) >+ keepPoolWarm(); > } > > WebProcessPool::~WebProcessPool() >@@ -390,7 +393,8 @@ void WebProcessPool::setLegacyCustomProtocolManagerClient(std::unique_ptr<API::C > void WebProcessPool::setMaximumNumberOfProcesses(unsigned maximumNumberOfProcesses) > { > // Guard against API misuse. >- if (!m_processes.isEmpty()) >+ bool useProcessPreWarming = m_configuration->useProcessPreWarming(); >+ if ((!useProcessPreWarming && !m_processes.isEmpty()) || (useProcessPreWarming && m_processes.size() > 1)) > CRASH(); > > m_configuration->setMaximumProcessCount(maximumNumberOfProcesses); >@@ -775,9 +779,30 @@ WebProcessProxy& WebProcessPool::createNewWebProcess(WebsiteDataStore& websiteDa > > return process; > } >+ >+void WebProcessPool::keepPoolWarm() >+{ >+ if (!isWarming.test_and_set(std::memory_order_acquire)) { >+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ >+ constexpr size_t numToAlwaysHaveWarm = 2; >+ >+ if (m_prewarmedProcessCount < numToAlwaysHaveWarm && m_processes.size() < maximumNumberOfProcesses()) { >+ size_t toWarm = std::min(maximumNumberOfProcesses() - m_processes.size(), numToAlwaysHaveWarm - m_prewarmedProcessCount); >+ dispatch_apply(toWarm, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(size_t i) { >+ warmNewProcess(); >+ }); >+ } >+ >+ isWarming.clear(std::memory_order_release); >+ }); >+ } >+} > > RefPtr<WebProcessProxy> WebProcessPool::tryTakePrewarmedProcess(WebsiteDataStore& websiteDataStore) > { >+ if (m_configuration->useProcessPreWarming()) >+ keepPoolWarm(); >+ > if (!m_prewarmedProcessCount) > return nullptr; > >@@ -978,7 +1003,7 @@ void WebProcessPool::initializeNewWebProcess(WebProcessProxy& process, WebsiteDa > #endif > } > >-void WebProcessPool::warmInitialProcess() >+void WebProcessPool::warmNewProcess() > { > if (m_prewarmedProcessCount) { > ASSERT(!m_processes.isEmpty()); >@@ -1094,6 +1119,10 @@ WebProcessProxy& WebProcessPool::createNewWebProcessRespectingProcessCountLimit( > #else > bool mustMatchDataStore = false; > #endif >+ >+ RefPtr<WebProcessProxy> process = tryTakePrewarmedProcess(websiteDataStore); >+ if (process) >+ return *process; > > if (m_processes.size() < maximumNumberOfProcesses()) > return createNewWebProcess(websiteDataStore); >@@ -1140,9 +1169,10 @@ Ref<WebPageProxy> WebProcessPool::createWebPage(PageClient& pageClient, Ref<API: > // Sharing processes, e.g. when creating the page via window.open(). > process = &pageConfiguration->relatedPage()->process(); > } else { >- process = tryTakePrewarmedProcess(pageConfiguration->websiteDataStore()->websiteDataStore()); >- if (!process) >- process = &createNewWebProcessRespectingProcessCountLimit(pageConfiguration->websiteDataStore()->websiteDataStore()); >+// process = tryTakePrewarmedProcess(pageConfiguration->websiteDataStore()->websiteDataStore()); >+// if (!process) >+// process = &createNewWebProcessRespectingProcessCountLimit(pageConfiguration->websiteDataStore()->websiteDataStore()); >+ process = &createNewWebProcessRespectingProcessCountLimit(pageConfiguration->websiteDataStore()->websiteDataStore()); > } > > #if ENABLE(SERVICE_WORKER) >diff --git a/Source/WebKit/UIProcess/WebProcessPool.h b/Source/WebKit/UIProcess/WebProcessPool.h >index 28e08c86b99e51f8326d1fc87e2a74dacf952e55..d8a75bafa40c8d529bb9e393ee911fff82fdba72 100644 >--- a/Source/WebKit/UIProcess/WebProcessPool.h >+++ b/Source/WebKit/UIProcess/WebProcessPool.h >@@ -289,7 +289,6 @@ public: > void allowSpecificHTTPSCertificateForHost(const WebCertificateInfo*, const String& host); > > WebProcessProxy& createNewWebProcessRespectingProcessCountLimit(WebsiteDataStore&); // Will return an existing one if limit is met. >- void warmInitialProcess(); > > bool shouldTerminate(WebProcessProxy*); > >@@ -463,6 +462,11 @@ public: > void clearMockMediaDevices(); > void removeMockMediaDevice(const String& persistentId); > void resetMockMediaDevices(); >+ >+ std::atomic_flag isWarming { false }; >+ >+ void warmNewProcess(); >+ void keepPoolWarm(); > > private: > void platformInitialize(); >@@ -708,6 +712,7 @@ private: > > HashMap<WebCore::SecurityOriginData, Vector<SuspendedPageProxy*>> m_suspendedPages; > HashMap<WebCore::SecurityOriginData, RefPtr<WebProcessProxy>> m_swappedProcesses; >+ > }; > > template<typename T> >@@ -771,7 +776,7 @@ void WebProcessPool::sendToOneProcess(T&& message) > } > > if (!messageSent) { >- warmInitialProcess(); >+ warmNewProcess(); > RefPtr<WebProcessProxy> process = m_processes.last(); > if (process->canSendMessage()) > process->send(std::forward<T>(message), 0);
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 187108
:
343876
|
343883
|
343884
|
343893
|
343967
|
343999
|
344157
|
344216
|
344259
|
345050
|
345386
|
345397
|
346231
|
346232
|
346239
|
346447
|
346448
|
346457
|
346459
|
346493
|
346496
|
346497