|
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* vim: set sw=2 ts=8 et ft=cpp : */ |
|
3 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
4 * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
|
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
6 |
|
7 #ifndef mozilla_ProcessPriorityManager_h_ |
|
8 #define mozilla_ProcessPriorityManager_h_ |
|
9 |
|
10 #include "mozilla/HalTypes.h" |
|
11 |
|
12 namespace mozilla { |
|
13 namespace dom { |
|
14 class ContentParent; |
|
15 } |
|
16 |
|
17 /** |
|
18 * This class sets the priority of subprocesses in response to explicit |
|
19 * requests and events in the system. |
|
20 * |
|
21 * A process's priority changes e.g. when it goes into the background via |
|
22 * mozbrowser's setVisible(false). Process priority affects CPU scheduling and |
|
23 * also which processes get killed when we run out of memory. |
|
24 * |
|
25 * After you call Initialize(), the only thing you probably have to do is call |
|
26 * SetProcessPriority on processes immediately after creating them in order to |
|
27 * set their initial priority. The ProcessPriorityManager takes care of the |
|
28 * rest. |
|
29 */ |
|
30 class ProcessPriorityManager MOZ_FINAL |
|
31 { |
|
32 public: |
|
33 /** |
|
34 * Initialize the ProcessPriorityManager machinery, causing the |
|
35 * ProcessPriorityManager to actively manage the priorities of all |
|
36 * subprocesses. You should call this before creating any subprocesses. |
|
37 * |
|
38 * You should also call this function even if you're in a child process, |
|
39 * since it will initialize ProcessPriorityManagerChild. |
|
40 */ |
|
41 static void Init(); |
|
42 |
|
43 /** |
|
44 * Set the process priority of a given ContentParent's process. |
|
45 * |
|
46 * Note that because this method takes a ContentParent*, you can only set the |
|
47 * priority of your subprocesses. In fact, because we don't support nested |
|
48 * content processes (bug 761935), you can only call this method from the |
|
49 * main process. |
|
50 * |
|
51 * It probably only makes sense to call this function immediately after a |
|
52 * process is created. At this point, the process priority manager doesn't |
|
53 * have enough context about the processs to know what its priority should |
|
54 * be. |
|
55 * |
|
56 * Eventually whatever priority you set here can and probably will be |
|
57 * overwritten by the process priority manager. |
|
58 */ |
|
59 static void SetProcessPriority(dom::ContentParent* aContentParent, |
|
60 hal::ProcessPriority aPriority); |
|
61 |
|
62 /** |
|
63 * Returns true iff this process's priority is FOREGROUND*. |
|
64 * |
|
65 * Note that because process priorities are set in the main process, it's |
|
66 * possible for this method to return a stale value. So be careful about |
|
67 * what you use this for. |
|
68 */ |
|
69 static bool CurrentProcessIsForeground(); |
|
70 |
|
71 /** |
|
72 * Returns true if one or more processes with FOREGROUND_HIGH priority are |
|
73 * present, false otherwise. |
|
74 */ |
|
75 static bool AnyProcessHasHighPriority(); |
|
76 |
|
77 /** |
|
78 * Used to remove a ContentParent from background LRU pool when |
|
79 * it is destroyed or its priority changed from BACKGROUND to others. |
|
80 */ |
|
81 static void RemoveFromBackgroundLRUPool(dom::ContentParent* aContentParent); |
|
82 |
|
83 /** |
|
84 * Used to add a ContentParent into background LRU pool when |
|
85 * its priority changed to BACKGROUND from others. |
|
86 */ |
|
87 static void AddIntoBackgroundLRUPool(dom::ContentParent* aContentParent); |
|
88 |
|
89 private: |
|
90 ProcessPriorityManager(); |
|
91 DISALLOW_EVIL_CONSTRUCTORS(ProcessPriorityManager); |
|
92 }; |
|
93 |
|
94 } // namespace mozilla |
|
95 |
|
96 #endif |