// 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 <utility> #include <vector> #include "base/containers/hash_tables.h" #include "base/gtest_prod_util.h" #include "base/process/process.h" #include "base/timer/timer.h" #include "chrome/browser/memory/tab_manager.h" #include "chrome/browser/memory/tab_stats.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" namespace memory { // The Chrome OS TabManagerDelegate is responsible for keeping the // renderers' scores up to date in /proc/<pid>/oom_score_adj. // // Note that AdjustOomPriorities will be called on the UI thread by // TabManager, but the actual work will take place on the file thread // (see implementation of AdjustOomPriorities). class TabManagerDelegate : public content::NotificationObserver { public: TabManagerDelegate(); ~TabManagerDelegate() override; // Return the score of a process. int GetOomScore(int child_process_host_id); // Called when the timer fires, sets oom_adjust_score for all renderers. void AdjustOomPriorities(const TabStatsList& stats_list); private: FRIEND_TEST_ALL_PREFIXES(TabManagerDelegateTest, GetProcessHandles); // 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; // Returns a list of child process host ids and ProcessHandles from // |stats_list| with unique pids. If multiple tabs use the same process, // returns the first child process host id and corresponding pid. This implies // that the processes are selected based on their "most important" tab. static std::vector<ProcessInfo> GetChildProcessInfos( const TabStatsList& stats_list); // Called by AdjustOomPriorities. void AdjustOomPrioritiesOnFileThread(TabStatsList stats_list); // Posts AdjustFocusedTabScore task to the file thread. void OnFocusTabScoreAdjustmentTimeout(); // Sets the score of the focused tab to the least value. void AdjustFocusedTabScoreOnFileThread(); // Registrar to receive renderer notifications. content::NotificationRegistrar registrar_; // Timer to guarantee that the tab is focused for a certain amount of time. base::OneShotTimer focus_tab_score_adjust_timer_; // This lock is for |oom_score_map_| and |focused_tab_process_info_|. base::Lock oom_score_lock_; // Map maintaining the child process host id - oom_score mapping. typedef base::hash_map<int, int> ProcessScoreMap; ProcessScoreMap oom_score_map_; // Holds the focused tab's child process host id. ProcessInfo focused_tab_process_info_; DISALLOW_COPY_AND_ASSIGN(TabManagerDelegate); }; } // namespace memory #endif // CHROME_BROWSER_MEMORY_TAB_MANAGER_DELEGATE_CHROMEOS_H_