Changeset 243388 in webkit
- Timestamp:
- Mar 22, 2019, 10:40:51 AM (7 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 7 edited
-
ChangeLog (modified) (1 diff)
-
UIProcess/WebProcessProxy.cpp (modified) (6 diffs)
-
UIProcess/WebProcessProxy.h (modified) (3 diffs)
-
WebProcess/WebProcess.cpp (modified) (5 diffs)
-
WebProcess/WebProcess.h (modified) (4 diffs)
-
WebProcess/WebProcess.messages.in (modified) (1 diff)
-
WebProcess/cocoa/WebProcessCocoa.mm (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r243384 r243388 1 2019-03-22 Chris Dumez <cdumez@apple.com> 2 3 Implement WebProcess freezer opt-in completely on WebContent process side 4 https://bugs.webkit.org/show_bug.cgi?id=196149 5 6 Reviewed by Brady Eidson. 7 8 Implement WebProcess freezer opt-in completely on WebContent process side, we do not need 9 to involve the UIProcess with this and rely on IPC which may be fragile. 10 11 In the future, we may want to set freezable state from the UIProcess when the API supports 12 it. We can move the logic to be fully on the UIProcess side then. In the mean time, it is 13 likely best not to rely on IPC and process coordination for this. 14 15 * UIProcess/WebProcessProxy.cpp: 16 (WebKit::globalPageMap): 17 (WebKit::WebProcessProxy::WebProcessProxy): 18 (WebKit::WebProcessProxy::setIsInProcessCache): 19 (WebKit::WebProcessProxy::markIsNoLongerInPrewarmedPool): 20 (WebKit::WebProcessProxy::didFinishLaunching): 21 (WebKit::WebProcessProxy::validateFreezerStatus): Deleted. 22 * UIProcess/WebProcessProxy.h: 23 (WebKit::WebProcessProxy::removeProvisionalPageProxy): 24 (WebKit::WebProcessProxy::WebPageProxyMap::WebPageProxyMap): Deleted. 25 (WebKit::WebProcessProxy::WebPageProxyMap::size const): Deleted. 26 (WebKit::WebProcessProxy::WebPageProxyMap::values): Deleted. 27 (WebKit::WebProcessProxy::WebPageProxyMap::values const): Deleted. 28 (WebKit::WebProcessProxy::WebPageProxyMap::begin): Deleted. 29 (WebKit::WebProcessProxy::WebPageProxyMap::end): Deleted. 30 (WebKit::WebProcessProxy::WebPageProxyMap::get): Deleted. 31 (WebKit::WebProcessProxy::WebPageProxyMap::contains const): Deleted. 32 (WebKit::WebProcessProxy::WebPageProxyMap::isEmpty const): Deleted. 33 (WebKit::WebProcessProxy::WebPageProxyMap::set): Deleted. 34 (WebKit::WebProcessProxy::WebPageProxyMap::take): Deleted. 35 * WebProcess/WebProcess.cpp: 36 (WebKit::WebProcess::setIsInProcessCache): 37 (WebKit::WebProcess::markIsNoLongerPrewarmed): 38 (WebKit::WebProcess::actualPrepareToSuspend): 39 (WebKit::WebProcess::setFreezable): Deleted. 40 * WebProcess/WebProcess.h: 41 * WebProcess/WebProcess.messages.in: 42 * WebProcess/cocoa/WebProcessCocoa.mm: 43 (WebKit::WebProcess::updateProcessName): 44 (WebKit::WebProcess::shouldFreezeOnSuspension const): 45 (WebKit::WebProcess::updateFreezerStatus): 46 1 47 2019-03-22 Chris Dumez <cdumez@apple.com> 2 48 -
trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp
r243384 r243388 116 116 } 117 117 118 static WebProcessProxy::WebPageProxyMap ::MapType& globalPageMap()118 static WebProcessProxy::WebPageProxyMap& globalPageMap() 119 119 { 120 120 ASSERT(isMainThreadOrCheckDisabled()); 121 static NeverDestroyed<WebProcessProxy::WebPageProxyMap ::MapType> pageMap;121 static NeverDestroyed<WebProcessProxy::WebPageProxyMap> pageMap; 122 122 return pageMap; 123 123 } … … 137 137 , m_processPool(processPool, isPrewarmed == IsPrewarmed::Yes ? IsWeak::Yes : IsWeak::No) 138 138 , m_mayHaveUniversalFileReadSandboxExtension(false) 139 , m_pageMap(*this)140 139 , m_numberOfTimesSuddenTerminationWasDisabled(0) 141 140 , m_throttler(*this, processPool.shouldTakeUIBackgroundAssertion()) … … 189 188 } 190 189 191 void WebProcessProxy::validateFreezerStatus()192 {193 #if PLATFORM(IOS_FAMILY)194 bool value = !m_isPrewarmed && !m_isInProcessCache && !m_pageMap.isEmpty() && !isServiceWorkerProcess();195 if (m_currentIsFreezableValue != WTF::nullopt && m_currentIsFreezableValue == value)196 return;197 198 m_currentIsFreezableValue = value;199 send(Messages::WebProcess::SetFreezable(value), 0);200 #endif201 }202 203 190 void WebProcessProxy::setIsInProcessCache(bool value) 204 191 { … … 216 203 m_processPool.setIsWeak(IsWeak::No); 217 204 } 218 219 validateFreezerStatus();220 205 } 221 206 … … 400 385 RELEASE_ASSERT(m_processPool); 401 386 m_processPool.setIsWeak(IsWeak::No); 402 403 validateFreezerStatus();404 387 405 388 send(Messages::WebProcess::MarkIsNoLongerPrewarmed(), 0); … … 796 779 unblockAccessibilityServerIfNeeded(); 797 780 #endif 798 799 validateFreezerStatus();800 781 } 801 782 -
trunk/Source/WebKit/UIProcess/WebProcessProxy.h
r243384 r243388 97 97 public: 98 98 typedef HashMap<uint64_t, RefPtr<WebFrameProxy>> WebFrameProxyMap; 99 typedef HashMap<uint64_t, WebPageProxy*> WebPageProxyMap; 99 100 typedef HashMap<uint64_t, RefPtr<API::UserInitiatedAction>> UserInitiatedActionMap; 100 101 … … 136 137 void addProvisionalPageProxy(ProvisionalPageProxy& provisionalPage) { ASSERT(!m_provisionalPages.contains(&provisionalPage)); m_provisionalPages.add(&provisionalPage); } 137 138 void removeProvisionalPageProxy(ProvisionalPageProxy& provisionalPage) { ASSERT(m_provisionalPages.contains(&provisionalPage)); m_provisionalPages.remove(&provisionalPage); } 138 139 class WebPageProxyMap {140 public:141 WebPageProxyMap(WebProcessProxy& proxy)142 : m_proxy(proxy)143 {144 }145 146 typedef HashMap<uint64_t, WebPageProxy*> MapType;147 using ValuesConstIteratorRange = MapType::ValuesConstIteratorRange;148 149 auto size() const { return m_map.size(); }150 auto values() { return m_map.values(); }151 auto values() const { return m_map.values(); }152 auto begin() { return m_map.begin(); }153 auto end() { return m_map.end(); }154 auto get(uint64_t key) { return m_map.get(key); }155 auto contains(uint64_t key) const { return m_map.contains(key); }156 auto isEmpty() const { return m_map.isEmpty(); }157 158 auto set(uint64_t key, WebPageProxy* value)159 {160 auto result = m_map.set(key, value);161 m_proxy.validateFreezerStatus();162 return result;163 }164 165 auto take(uint64_t key)166 {167 auto result = m_map.take(key);168 m_proxy.validateFreezerStatus();169 return result;170 }171 172 private:173 WebProcessProxy& m_proxy;174 MapType m_map;175 };176 177 139 178 140 typename WebPageProxyMap::ValuesConstIteratorRange pages() const { return m_pageMap.values(); } … … 509 471 bool m_hasCommittedAnyProvisionalLoads { false }; 510 472 bool m_isPrewarmed; 511 Optional<bool> m_currentIsFreezableValue;512 473 513 474 #if PLATFORM(WATCHOS) -
trunk/Source/WebKit/WebProcess/WebProcess.cpp
r243384 r243388 151 151 #endif 152 152 153 #if PLATFORM(IOS_FAMILY)154 #include <bmalloc/MemoryStatusSPI.h>155 #endif156 157 153 // This should be less than plugInAutoStartExpirationTimeThreshold in PlugInAutoStartProvider. 158 154 static const Seconds plugInAutoStartExpirationTimeUpdateThreshold { 29 * 24 * 60 * 60 }; … … 508 504 void WebProcess::setIsInProcessCache(bool isInProcessCache) 509 505 { 510 #if PLATFORM( MAC)506 #if PLATFORM(COCOA) 511 507 if (isInProcessCache) { 512 508 ASSERT(m_processType == ProcessType::WebContent); … … 525 521 void WebProcess::markIsNoLongerPrewarmed() 526 522 { 527 #if PLATFORM( MAC)523 #if PLATFORM(COCOA) 528 524 ASSERT(m_processType == ProcessType::PrewarmedWebContent); 529 525 m_processType = ProcessType::WebContent; … … 1470 1466 #if PLATFORM(IOS_FAMILY) 1471 1467 accessibilityProcessSuspendedNotification(true); 1468 updateFreezerStatus(); 1472 1469 #endif 1473 1470 … … 1885 1882 } 1886 1883 1887 void WebProcess::setFreezable(bool freezable)1888 {1889 #if PLATFORM(IOS_FAMILY)1890 auto result = memorystatus_control(MEMORYSTATUS_CMD_SET_PROCESS_IS_FREEZABLE, getpid(), freezable ? 1 : 0, nullptr, 0);1891 ASSERT_UNUSED(result, !result);1892 #endif1893 }1894 1895 1884 #if PLATFORM(IOS_FAMILY) 1896 1885 void WebProcess::unblockAccessibilityServer(const SandboxExtension::Handle& handle) -
trunk/Source/WebKit/WebProcess/WebProcess.h
r243384 r243388 412 412 413 413 #if PLATFORM(MAC) 414 void updateProcessName();415 414 void setScreenProperties(const WebCore::ScreenProperties&); 416 415 #if ENABLE(WEBPROCESS_WINDOWSERVER_BLOCKING) … … 421 420 #endif 422 421 422 #if PLATFORM(COCOA) 423 void updateProcessName(); 424 #endif 425 423 426 #if PLATFORM(IOS) 424 427 void backlightLevelDidChange(float backlightLevel); 428 429 bool shouldFreezeOnSuspension() const; 430 void updateFreezerStatus(); 425 431 #endif 426 432 … … 431 437 432 438 void clearCurrentModifierStateForTesting(); 433 void setFreezable(bool);434 439 435 440 RefPtr<WebConnectionToUIProcess> m_webConnection; … … 506 511 Optional<double> m_cpuLimit; 507 512 513 String m_uiProcessName; 514 WebCore::RegistrableDomain m_registrableDomain; 515 #endif 516 517 #if PLATFORM(COCOA) 508 518 enum class ProcessType { Inspector, ServiceWorker, PrewarmedWebContent, CachedWebContent, WebContent }; 509 519 ProcessType m_processType { ProcessType::WebContent }; 510 String m_uiProcessName;511 WebCore::RegistrableDomain m_registrableDomain;512 520 #endif 513 521 -
trunk/Source/WebKit/WebProcess/WebProcess.messages.in
r243384 r243388 163 163 UnblockAccessibilityServer(WebKit::SandboxExtension::Handle handle) 164 164 #endif 165 166 SetFreezable(bool freezable)167 165 } -
trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm
r243384 r243388 63 63 #import <WebCore/PerformanceLogging.h> 64 64 #import <WebCore/RuntimeApplicationChecks.h> 65 #import <WebCore/SWContextManager.h> 65 66 #import <algorithm> 66 67 #import <dispatch/dispatch.h> … … 81 82 82 83 #if PLATFORM(IOS_FAMILY) 84 #include <bmalloc/MemoryStatusSPI.h> 85 #endif 86 87 #if PLATFORM(IOS_FAMILY) 83 88 #import "WKAccessibilityWebPageObjectIOS.h" 84 89 #import <UIKit/UIAccessibility.h> … … 238 243 } 239 244 240 #if PLATFORM(MAC)241 245 void WebProcess::updateProcessName() 242 246 { 247 #if PLATFORM(MAC) 243 248 NSString *applicationName; 244 249 switch (m_processType) { … … 274 279 #endif 275 280 }); 276 }277 281 #endif // PLATFORM(MAC) 282 } 278 283 279 284 static void registerWithAccessibility() … … 682 687 UIAccessibilityPostNotification(kAXPidStatusChangedNotification, @{ @"pid" : @(getpid()), @"suspended" : @(suspended) }); 683 688 } 689 690 bool WebProcess::shouldFreezeOnSuspension() const 691 { 692 switch (m_processType) { 693 case ProcessType::Inspector: 694 case ProcessType::ServiceWorker: 695 case ProcessType::PrewarmedWebContent: 696 case ProcessType::CachedWebContent: 697 return false; 698 case ProcessType::WebContent: 699 break; 700 } 701 702 for (auto& page : m_pageMap.values()) { 703 if (!page->isSuspended()) 704 return false; 705 } 706 707 return true; 708 } 709 710 void WebProcess::updateFreezerStatus() 711 { 712 bool isFreezable = shouldFreezeOnSuspension(); 713 auto result = memorystatus_control(MEMORYSTATUS_CMD_SET_PROCESS_IS_FREEZABLE, getpid(), isFreezable ? 1 : 0, nullptr, 0); 714 if (result) 715 RELEASE_LOG_ERROR(ProcessSuspension, "%p - WebProcess::updateFreezerStatus() isFreezable: %d, error: %d", this, isFreezable, result); 716 else 717 RELEASE_LOG(ProcessSuspension, "%p - WebProcess::updateFreezerStatus() isFreezable: %d, success", this, isFreezable); 718 } 684 719 #endif 685 720
Note:
See TracChangeset
for help on using the changeset viewer.