Index: chrome/browser/memory/tab_manager.cc |
diff --git a/chrome/browser/memory/tab_manager.cc b/chrome/browser/memory/tab_manager.cc |
index d26739073f7d3ddaab7f404f1358713d54f50fcf..0d161da8de6e11d4e46b076eff610b9943aa9103 100644 |
--- a/chrome/browser/memory/tab_manager.cc |
+++ b/chrome/browser/memory/tab_manager.cc |
@@ -26,7 +26,6 @@ |
#include "base/strings/string_util.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/threading/thread.h" |
-#include "base/threading/thread_task_runner_handle.h" |
#include "base/time/tick_clock.h" |
#include "build/build_config.h" |
#include "chrome/browser/browser_process.h" |
@@ -49,7 +48,6 @@ |
#include "components/metrics/system_memory_stats_recorder.h" |
#include "components/variations/variations_associated_data.h" |
#include "content/public/browser/browser_thread.h" |
-#include "content/public/browser/memory_pressure_controller.h" |
#include "content/public/browser/navigation_controller.h" |
#include "content/public/browser/render_process_host.h" |
#include "content/public/browser/web_contents.h" |
@@ -97,26 +95,6 @@ int FindWebContentsById(const TabStripModel* model, |
return -1; |
} |
-// A wrapper around base::MemoryPressureMonitor::GetCurrentPressureLevel. |
-// TODO(chrisha): Move this do the default implementation of a delegate. |
-base::MemoryPressureListener::MemoryPressureLevel |
-GetCurrentPressureLevel() { |
- auto* monitor = base::MemoryPressureMonitor::Get(); |
- if (monitor) |
- return monitor->GetCurrentPressureLevel(); |
- return base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE; |
-} |
- |
-// A wrapper to content::SendPressureNotification that doesn't have overloaded |
-// type ambiguity. Makes use of Bind easier. |
-// TODO(chrisha): Move this do the default implementation of a delegate. |
-void NotifyRendererProcess( |
- const content::RenderProcessHost* render_process_host, |
- base::MemoryPressureListener::MemoryPressureLevel level) { |
- content::MemoryPressureController::SendPressureNotification( |
- render_process_host, level); |
-} |
- |
} // namespace |
//////////////////////////////////////////////////////////////////////////////// |
@@ -133,17 +111,11 @@ TabManager::TabManager() |
#endif |
browser_tab_strip_tracker_(this, nullptr, nullptr), |
test_tick_clock_(nullptr), |
- under_memory_pressure_(false), |
weak_ptr_factory_(this) { |
#if defined(OS_CHROMEOS) |
delegate_.reset(new TabManagerDelegate(weak_ptr_factory_.GetWeakPtr())); |
#endif |
browser_tab_strip_tracker_.Init(); |
- |
- // Set up default callbacks. These may be overridden post-construction as |
- // testing seams. |
- get_current_pressure_level_ = base::Bind(&GetCurrentPressureLevel); |
- notify_renderer_process_ = base::Bind(&NotifyRendererProcess); |
} |
TabManager::~TabManager() { |
@@ -264,43 +236,6 @@ TabStatsList TabManager::GetTabStats() const { |
return stats_list; |
} |
-std::vector<content::RenderProcessHost*> |
-TabManager::GetOrderedRenderers() const { |
- // Get the tab stats. |
- auto tab_stats = GetTabStats(); |
- |
- std::vector<content::RenderProcessHost*> sorted_renderers; |
- std::set<content::RenderProcessHost*> seen_renderers; |
- std::set<content::RenderProcessHost*> visible_renderers; |
- sorted_renderers.reserve(tab_stats.size()); |
- |
- // Convert the tab sort order to a process sort order. The process inherits |
- // the priority of its highest priority tab. |
- for (auto& tab : tab_stats) { |
- auto* renderer = tab.render_process_host; |
- |
- // Skip renderers associated with visible tabs as handling memory pressure |
- // notifications in these processes can cause jank. This code works because |
- // visible tabs always come first in |tab_stats|. |
- if (tab.is_selected) { |
- visible_renderers.insert(renderer); |
- continue; |
- } |
- if (visible_renderers.count(renderer) > 0) |
- continue; |
- |
- // Skip renderers that have already been encountered. This can occur when |
- // multiple tabs are folded into a single renderer process. In this case the |
- // process takes the priority of its highest priority contained tab. |
- if (!seen_renderers.insert(renderer).second) |
- continue; |
- |
- sorted_renderers.push_back(renderer); |
- } |
- |
- return sorted_renderers; |
-} |
- |
bool TabManager::IsTabDiscarded(content::WebContents* contents) const { |
return GetWebContentsData(contents)->IsDiscarded(); |
} |
@@ -813,11 +748,6 @@ void TabManager::OnMemoryPressure( |
if (g_browser_process->IsShuttingDown()) |
return; |
- // If no task runner has been set, then use the same one that the memory |
- // pressure subsystem uses. |
- if (!task_runner_.get()) |
- task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
- |
// Under critical pressure try to discard a tab. |
if (memory_pressure_level == |
base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) { |
@@ -825,18 +755,6 @@ void TabManager::OnMemoryPressure( |
} |
// TODO(skuhne): If more memory pressure levels are introduced, consider |
// calling PurgeBrowserMemory() before CRITICAL is reached. |
- |
- // If this is the beginning of a period of memory pressure then kick off |
- // notification of child processes. |
- // NOTE: This mechanism relies on having a MemoryPressureMonitor |
- // implementation that supports "CurrentPressureLevel". This is true on all |
- // platforms on which TabManager is used. |
-#if !defined(OS_CHROMEOS) |
- // Running GC under memory pressure can cause thrashing. Disable it on |
- // ChromeOS until the thrashing is fixed. crbug.com/588172. |
- if (!under_memory_pressure_) |
- DoChildProcessDispatch(); |
-#endif |
} |
void TabManager::TabChangedAt(content::WebContents* contents, |
@@ -918,66 +836,6 @@ TimeTicks TabManager::NowTicks() const { |
return test_tick_clock_->NowTicks(); |
} |
-void TabManager::DoChildProcessDispatch() { |
- // If Chrome is shutting down, do not do anything. |
- if (g_browser_process->IsShuttingDown()) |
- return; |
- |
- if (!under_memory_pressure_) |
- under_memory_pressure_ = true; |
- |
- // If the memory pressure condition has ended then stop dispatching messages. |
- auto level = get_current_pressure_level_.Run(); |
- if (level == base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE) { |
- under_memory_pressure_ = false; |
- notified_renderers_.clear(); |
- return; |
- } |
- |
- // Get a vector of active renderers, from highest to lowest priority. |
- auto renderers = GetOrderedRenderers(); |
- |
- // The following code requires at least one renderer to be present or it will |
- // busyloop. It's possible for no renderers to exist (we eliminate visible |
- // renderers to avoid janking them), so bail early if that's the case. |
- if (renderers.empty()) |
- return; |
- |
- // Notify a single renderer of memory pressure. |
- bool notified = false; |
- while (!notified) { |
- // Notify the lowest priority renderer that hasn't been notified yet. |
- for (auto rit = renderers.rbegin(); rit != renderers.rend(); ++rit) { |
- // If this renderer has already been notified then look at the next one. |
- if (!notified_renderers_.insert(*rit).second) |
- continue; |
- |
- // Notify the renderer. |
- notify_renderer_process_.Run(*rit, level); |
- notified = true; |
- break; |
- } |
- |
- // If all renderers were processed and none were notified, then all |
- // renderers have already been notified. Clear the list and start again. |
- if (!notified) |
- notified_renderers_.clear(); |
- |
- // This loop can only run at most twice. If it doesn't exit the first time |
- // through, by the second time through |notified_renderers_| will be empty. |
- // Since |renderers| is always non-empty, the first renderer encountered |
- // during the second pass will be notified. |
- } |
- |
- // Schedule another notification. Use a weak pointer so this doesn't explode |
- // during tear down. |
- task_runner_->PostDelayedTask( |
- FROM_HERE, |
- base::BindOnce(&TabManager::DoChildProcessDispatch, |
- weak_ptr_factory_.GetWeakPtr()), |
- base::TimeDelta::FromSeconds(kRendererNotificationDelayInSeconds)); |
-} |
- |
// TODO(jamescook): This should consider tabs with references to other tabs, |
// such as tabs created with JavaScript window.open(). Potentially consider |
// discarding the entire set together, or use that in the priority computation. |