| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CHROME_BROWSER_MEMORY_TAB_MANAGER_H_ | 5 #ifndef CHROME_BROWSER_MEMORY_TAB_MANAGER_H_ |
| 6 #define CHROME_BROWSER_MEMORY_TAB_MANAGER_H_ | 6 #define CHROME_BROWSER_MEMORY_TAB_MANAGER_H_ |
| 7 | 7 |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/compiler_specific.h" | 11 #include "base/compiler_specific.h" |
| 12 #include "base/gtest_prod_util.h" | 12 #include "base/gtest_prod_util.h" |
| 13 #include "base/memory/memory_pressure_listener.h" | 13 #include "base/memory/memory_pressure_listener.h" |
| 14 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
| 15 #include "base/strings/string16.h" | 15 #include "base/strings/string16.h" |
| 16 #include "base/timer/timer.h" | 16 #include "base/timer/timer.h" |
| 17 #include "chrome/browser/memory/tab_stats.h" | 17 #include "chrome/browser/memory/tab_stats.h" |
| 18 #include "chrome/browser/ui/browser_list_observer.h" | 18 #include "chrome/browser/ui/browser_tab_strip_tracker.h" |
| 19 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h" | 19 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h" |
| 20 | 20 |
| 21 class BrowserList; | 21 class BrowserList; |
| 22 class GURL; | 22 class GURL; |
| 23 | 23 |
| 24 namespace memory { | 24 namespace memory { |
| 25 | 25 |
| 26 #if defined(OS_CHROMEOS) | 26 #if defined(OS_CHROMEOS) |
| 27 class TabManagerDelegate; | 27 class TabManagerDelegate; |
| 28 #endif | 28 #endif |
| 29 | 29 |
| 30 // The TabManager periodically updates (see | 30 // The TabManager periodically updates (see |
| 31 // |kAdjustmentIntervalSeconds| in the source) the status of renderers | 31 // |kAdjustmentIntervalSeconds| in the source) the status of renderers |
| 32 // which are then used by the algorithm embedded here for priority in being | 32 // which are then used by the algorithm embedded here for priority in being |
| 33 // killed upon OOM conditions. | 33 // killed upon OOM conditions. |
| 34 // | 34 // |
| 35 // The algorithm used favors killing tabs that are not selected, not pinned, | 35 // The algorithm used favors killing tabs that are not selected, not pinned, |
| 36 // and have been idle for longest, in that order of priority. | 36 // and have been idle for longest, in that order of priority. |
| 37 // | 37 // |
| 38 // On Chrome OS (via the delegate), the kernel (via /proc/<pid>/oom_score_adj) | 38 // On Chrome OS (via the delegate), the kernel (via /proc/<pid>/oom_score_adj) |
| 39 // will be informed of each renderer's score, which is based on the status, so | 39 // will be informed of each renderer's score, which is based on the status, so |
| 40 // in case Chrome is not able to relieve the pressure quickly enough and the | 40 // in case Chrome is not able to relieve the pressure quickly enough and the |
| 41 // kernel is forced to kill processes, it will be able to do so using the same | 41 // kernel is forced to kill processes, it will be able to do so using the same |
| 42 // algorithm as the one used here. | 42 // algorithm as the one used here. |
| 43 // | 43 // |
| 44 // Note that the browser tests are only active for platforms that use | 44 // Note that the browser tests are only active for platforms that use |
| 45 // TabManager (CrOS only for now) and need to be adjusted accordingly if | 45 // TabManager (CrOS only for now) and need to be adjusted accordingly if |
| 46 // support for new platforms is added. | 46 // support for new platforms is added. |
| 47 class TabManager : public chrome::BrowserListObserver, | 47 class TabManager : public TabStripModelObserver { |
| 48 public TabStripModelObserver { | |
| 49 public: | 48 public: |
| 50 TabManager(); | 49 TabManager(); |
| 51 ~TabManager() override; | 50 ~TabManager() override; |
| 52 | 51 |
| 53 // Number of discard events since Chrome started. | 52 // Number of discard events since Chrome started. |
| 54 int discard_count() const { return discard_count_; } | 53 int discard_count() const { return discard_count_; } |
| 55 | 54 |
| 56 // See member comment. | 55 // See member comment. |
| 57 bool recent_tab_discard() const { return recent_tab_discard_; } | 56 bool recent_tab_discard() const { return recent_tab_discard_; } |
| 58 | 57 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 | 119 |
| 121 // Goes through a list of checks to see if a tab is allowed to be discarded by | 120 // Goes through a list of checks to see if a tab is allowed to be discarded by |
| 122 // the automatic tab discarding mechanism. Note that this is not used when | 121 // the automatic tab discarding mechanism. Note that this is not used when |
| 123 // discarding a particular tab from about:discards. | 122 // discarding a particular tab from about:discards. |
| 124 bool CanDiscardTab(int64 target_web_contents_id) const; | 123 bool CanDiscardTab(int64 target_web_contents_id) const; |
| 125 | 124 |
| 126 // Called by the memory pressure listener when the memory pressure rises. | 125 // Called by the memory pressure listener when the memory pressure rises. |
| 127 void OnMemoryPressure( | 126 void OnMemoryPressure( |
| 128 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level); | 127 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level); |
| 129 | 128 |
| 130 // chrome::BrowserListObserver overrides. | |
| 131 void OnBrowserAdded(Browser* browser) override; | |
| 132 void OnBrowserRemoved(Browser* browser) override; | |
| 133 | |
| 134 // TabStripModelObserver overrides. | 129 // TabStripModelObserver overrides. |
| 135 void TabChangedAt(content::WebContents* contents, | 130 void TabChangedAt(content::WebContents* contents, |
| 136 int index, | 131 int index, |
| 137 TabChangeType change_type) override; | 132 TabChangeType change_type) override; |
| 138 | 133 |
| 139 // Returns true if the tab is currently playing audio or has played audio | 134 // Returns true if the tab is currently playing audio or has played audio |
| 140 // recently. | 135 // recently. |
| 141 bool IsAudioTab(content::WebContents* contents) const; | 136 bool IsAudioTab(content::WebContents* contents) const; |
| 142 | 137 |
| 143 // Returns true if |first| is considered less desirable to be killed than | 138 // Returns true if |first| is considered less desirable to be killed than |
| (...skipping 28 matching lines...) Expand all Loading... |
| 172 // used for statistics normalized by usage. | 167 // used for statistics normalized by usage. |
| 173 bool recent_tab_discard_; | 168 bool recent_tab_discard_; |
| 174 | 169 |
| 175 // Whether we ever only discard a tab once. | 170 // Whether we ever only discard a tab once. |
| 176 bool discard_once_; | 171 bool discard_once_; |
| 177 | 172 |
| 178 #if defined(OS_CHROMEOS) | 173 #if defined(OS_CHROMEOS) |
| 179 scoped_ptr<TabManagerDelegate> delegate_; | 174 scoped_ptr<TabManagerDelegate> delegate_; |
| 180 #endif | 175 #endif |
| 181 | 176 |
| 177 BrowserTabStripTracker browser_tab_strip_tracker_; |
| 178 |
| 182 DISALLOW_COPY_AND_ASSIGN(TabManager); | 179 DISALLOW_COPY_AND_ASSIGN(TabManager); |
| 183 }; | 180 }; |
| 184 | 181 |
| 185 } // namespace memory | 182 } // namespace memory |
| 186 | 183 |
| 187 #endif // CHROME_BROWSER_MEMORY_TAB_MANAGER_H_ | 184 #endif // CHROME_BROWSER_MEMORY_TAB_MANAGER_H_ |
| OLD | NEW |