Index: chrome/browser/memory/tab_manager_delegate_chromeos.h |
diff --git a/chrome/browser/memory/tab_manager_delegate_chromeos.h b/chrome/browser/memory/tab_manager_delegate_chromeos.h |
deleted file mode 100644 |
index 808a0dfbb56440da8a33d34eccba09faf1a54284..0000000000000000000000000000000000000000 |
--- a/chrome/browser/memory/tab_manager_delegate_chromeos.h |
+++ /dev/null |
@@ -1,277 +0,0 @@ |
-// Copyright 2015 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#ifndef CHROME_BROWSER_MEMORY_TAB_MANAGER_DELEGATE_CHROMEOS_H_ |
-#define CHROME_BROWSER_MEMORY_TAB_MANAGER_DELEGATE_CHROMEOS_H_ |
- |
-#include <memory> |
-#include <string> |
-#include <utility> |
-#include <vector> |
- |
-#include "base/containers/hash_tables.h" |
-#include "base/gtest_prod_util.h" |
-#include "base/logging.h" |
-#include "base/macros.h" |
-#include "base/memory/weak_ptr.h" |
-#include "base/process/process.h" |
-#include "base/timer/timer.h" |
-#include "chrome/browser/chromeos/arc/process/arc_process.h" |
-#include "chrome/browser/memory/tab_manager.h" |
-#include "chrome/browser/memory/tab_stats.h" |
-#include "chrome/browser/ui/browser_list_observer.h" |
-#include "chromeos/dbus/debug_daemon_client.h" |
-#include "components/arc/common/process.mojom.h" |
-#include "components/arc/instance_holder.h" |
-#include "content/public/browser/notification_observer.h" |
-#include "content/public/browser/notification_registrar.h" |
-#include "ui/wm/public/activation_change_observer.h" |
- |
-namespace memory { |
- |
-// Possible types of Apps/Tabs processes. From most important to least |
-// important. |
-enum class ProcessType { |
- // Conceptually, the system cannot have both FOCUSED_TAB and FOCUSED_APP at |
- // the same time, but because Chrome cannot retrieve FOCUSED_APP status |
- // synchronously, Chrome may still see both at the same time. When that |
- // happens, treat FOCUSED_TAB as the most important since the (synchronously |
- // retrieved) tab information is more reliable and up-to-date. |
- FOCUSED_TAB = 1, |
- FOCUSED_APP = 2, |
- |
- // Important apps are protected in two ways: 1) Chrome never kills them, and |
- // 2) the kernel is still allowed to kill them, but their OOM adjustment |
- // scores are better than BACKGROUND_TABs and BACKGROUND_APPs. |
- IMPORTANT_APP = 3, |
- |
- BACKGROUND_TAB = 4, |
- BACKGROUND_APP = 5, |
- UNKNOWN_TYPE = 6, |
-}; |
- |
-// The Chrome OS TabManagerDelegate is responsible for keeping the |
-// renderers' scores up to date in /proc/<pid>/oom_score_adj. |
-class TabManagerDelegate : public wm::ActivationChangeObserver, |
- public content::NotificationObserver, |
- public chrome::BrowserListObserver { |
- public: |
- class MemoryStat; |
- |
- explicit TabManagerDelegate(const base::WeakPtr<TabManager>& tab_manager); |
- |
- TabManagerDelegate(const base::WeakPtr<TabManager>& tab_manager, |
- TabManagerDelegate::MemoryStat* mem_stat); |
- |
- ~TabManagerDelegate() override; |
- |
- void OnBrowserSetLastActive(Browser* browser) override; |
- |
- // aura::ActivationChangeObserver overrides. |
- void OnWindowActivated(wm::ActivationChangeObserver::ActivationReason reason, |
- aura::Window* gained_active, |
- aura::Window* lost_active) override; |
- |
- // Kills a process on memory pressure. |
- void LowMemoryKill(const TabStatsList& tab_stats); |
- |
- // Returns oom_score_adj of a process if the score is cached by |this|. |
- // If couldn't find the score in the cache, returns -1001 since the valid |
- // range of oom_score_adj is [-1000, 1000]. |
- int GetCachedOomScore(base::ProcessHandle process_handle); |
- |
- // Called when the timer fires, sets oom_adjust_score for all renderers. |
- void AdjustOomPriorities(const TabStatsList& tab_list); |
- |
- // Returns true if the process has recently been killed. |
- // Virtual for unit testing. |
- virtual bool IsRecentlyKilledArcProcess(const std::string& process_name, |
- const base::TimeTicks& now); |
- |
- protected: |
- // Kills an ARC process. Returns true if the kill request is successfully sent |
- // to Android. Virtual for unit testing. |
- virtual bool KillArcProcess(const int nspid); |
- |
- // Kills a tab. Returns true if the tab is killed successfully. |
- // Virtual for unit testing. |
- virtual bool KillTab(int64_t tab_id); |
- |
- // Get debugd client instance. Virtual for unit testing. |
- virtual chromeos::DebugDaemonClient* GetDebugDaemonClient(); |
- |
- private: |
- FRIEND_TEST_ALL_PREFIXES(TabManagerDelegateTest, CandidatesSorted); |
- FRIEND_TEST_ALL_PREFIXES(TabManagerDelegateTest, |
- CandidatesSortedWithFocusedAppAndTab); |
- FRIEND_TEST_ALL_PREFIXES(TabManagerDelegateTest, |
- DoNotKillRecentlyKilledArcProcesses); |
- FRIEND_TEST_ALL_PREFIXES(TabManagerDelegateTest, IsRecentlyKilledArcProcess); |
- FRIEND_TEST_ALL_PREFIXES(TabManagerDelegateTest, KillMultipleProcesses); |
- FRIEND_TEST_ALL_PREFIXES(TabManagerDelegateTest, SetOomScoreAdj); |
- |
- class Candidate; |
- class FocusedProcess; |
- |
- friend std::ostream& operator<<(std::ostream& out, |
- const Candidate& candidate); |
- |
- // content::NotificationObserver: |
- void Observe(int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) override; |
- |
- // Pair to hold child process host id and ProcessHandle. |
- typedef std::pair<int, base::ProcessHandle> ProcessInfo; |
- |
- // Cache OOM scores in memory. |
- typedef base::hash_map<base::ProcessHandle, int> ProcessScoreMap; |
- |
- // A map from an ARC process name to a monotonic timestamp when it's killed. |
- typedef base::hash_map<std::string, base::TimeTicks> KilledArcProcessesMap; |
- |
- // Get the list of candidates to kill, sorted by descending importance. |
- static std::vector<Candidate> GetSortedCandidates( |
- const TabStatsList& tab_list, |
- const std::vector<arc::ArcProcess>& arc_processes); |
- |
- // Sets OOM score for the focused tab. |
- void OnFocusTabScoreAdjustmentTimeout(); |
- |
- // Kills a process after getting all info of tabs and apps. |
- void LowMemoryKillImpl(const TabStatsList& tab_list, |
- const std::vector<arc::ArcProcess>& arc_processes); |
- |
- // Public interface to adjust OOM scores. |
- void AdjustOomPriorities(const TabStatsList& tab_list, |
- const std::vector<arc::ArcProcess>& arc_processes); |
- |
- // Sets a newly focused tab the highest priority process if it wasn't. |
- void AdjustFocusedTabScore(base::ProcessHandle pid); |
- |
- // Called by AdjustOomPriorities. Runs on the main thread. |
- void AdjustOomPrioritiesImpl( |
- const TabStatsList& tab_list, |
- const std::vector<arc::ArcProcess>& arc_processes); |
- |
- // Sets OOM score for processes in the range [|rbegin|, |rend|) to integers |
- // distributed evenly in [|range_begin|, |range_end|). |
- // The new score is set in |new_map|. |
- void DistributeOomScoreInRange( |
- std::vector<TabManagerDelegate::Candidate>::const_iterator begin, |
- std::vector<TabManagerDelegate::Candidate>::const_iterator end, |
- int range_begin, |
- int range_end, |
- ProcessScoreMap* new_map); |
- |
- // Changes |candidates|' OOM scores to |score|. The new scores are set in |
- // |new_map|. |
- void SetOomScore(const std::vector<TabManagerDelegate::Candidate>& candidates, |
- int score, |
- ProcessScoreMap* new_map); |
- |
- // Initiates an oom priority adjustment. |
- void ScheduleEarlyOomPrioritiesAdjustment(); |
- |
- // Returns a TimeDelta object that represents a minimum delay for killing |
- // the same ARC process again. ARC processes sometimes respawn right after |
- // being killed. In that case, killing them every time is just a waste of |
- // resources. |
- static constexpr base::TimeDelta GetArcRespawnKillDelay() { |
- return base::TimeDelta::FromSeconds(60); |
- } |
- |
- // The lowest OOM adjustment score that will make the process non-killable. |
- static const int kLowestOomScore; |
- |
- // Holds a reference to the owning TabManager. |
- const base::WeakPtr<TabManager> tab_manager_; |
- |
- // Registrar to receive renderer notifications. |
- content::NotificationRegistrar registrar_; |
- |
- // Timer to guarantee that the tab or app is focused for a certain amount of |
- // time. |
- base::OneShotTimer focus_process_score_adjust_timer_; |
- // Holds the info of the newly focused tab or app. Its OOM score would be |
- // adjusted when |focus_process_score_adjust_timer_| is expired. |
- std::unique_ptr<FocusedProcess> focused_process_; |
- |
- // Map maintaining the process handle - oom_score mapping. |
- ProcessScoreMap oom_score_map_; |
- |
- // Map maintaing ARC process names and their last killed time. |
- KilledArcProcessesMap recently_killed_arc_processes_; |
- |
- // Util for getting system memory status. |
- std::unique_ptr<TabManagerDelegate::MemoryStat> mem_stat_; |
- |
- // Weak pointer factory used for posting tasks to other threads. |
- base::WeakPtrFactory<TabManagerDelegate> weak_ptr_factory_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TabManagerDelegate); |
-}; |
- |
-// On ARC enabled machines, either a tab or an app could be a possible |
-// victim of low memory kill process. This is a helper class which holds a |
-// pointer to an app or a tab (but not both) to facilitate prioritizing the |
-// victims. |
-class TabManagerDelegate::Candidate { |
- public: |
- explicit Candidate(const TabStats* tab) |
- : tab_(tab), app_(nullptr), process_type_(GetProcessTypeInternal()) { |
- DCHECK(tab_); |
- } |
- explicit Candidate(const arc::ArcProcess* app) |
- : tab_(nullptr), app_(app), process_type_(GetProcessTypeInternal()) { |
- DCHECK(app_); |
- } |
- |
- // Move-only class. |
- Candidate(Candidate&&) = default; |
- Candidate& operator=(Candidate&& other); |
- |
- // Higher priority first. |
- bool operator<(const Candidate& rhs) const; |
- |
- const TabStats* tab() const { return tab_; } |
- const arc::ArcProcess* app() const { return app_; } |
- ProcessType process_type() const { return process_type_; } |
- |
- private: |
- // Derive process type for this candidate. Used to initialize |process_type_|. |
- ProcessType GetProcessTypeInternal() const; |
- |
- const TabStats* tab_; |
- const arc::ArcProcess* app_; |
- ProcessType process_type_; |
- DISALLOW_COPY_AND_ASSIGN(Candidate); |
-}; |
- |
-// A thin wrapper over library process_metric.h to get memory status so unit |
-// test get a chance to mock out. |
-class TabManagerDelegate::MemoryStat { |
- public: |
- MemoryStat() {} |
- virtual ~MemoryStat() {} |
- |
- // Returns target size of memory to free given current memory pressure and |
- // pre-configured low memory margin. |
- virtual int TargetMemoryToFreeKB(); |
- |
- // Returns estimated memory to be freed if the process |pid| is killed. |
- virtual int EstimatedMemoryFreedKB(base::ProcessHandle pid); |
- |
- private: |
- // Returns the low memory margin system config. Low memory condition is |
- // reported if available memory is under the number. |
- static int LowMemoryMarginKB(); |
- |
- // Reads in an integer. |
- static int ReadIntFromFile(const char* file_name, int default_val); |
-}; |
- |
-} // namespace memory |
- |
-#endif // CHROME_BROWSER_MEMORY_TAB_MANAGER_DELEGATE_CHROMEOS_H_ |