|
1 /* -*- Mode: C++; tab-width: 50; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 |
|
6 #include "LoadManager.h" |
|
7 #include "LoadMonitor.h" |
|
8 #include "nsString.h" |
|
9 #include "prlog.h" |
|
10 #include "prtime.h" |
|
11 #include "prinrval.h" |
|
12 #include "prsystem.h" |
|
13 |
|
14 #include "nsString.h" |
|
15 #include "nsThreadUtils.h" |
|
16 #include "nsReadableUtils.h" |
|
17 #include "nsNetUtil.h" |
|
18 |
|
19 // NSPR_LOG_MODULES=LoadManager:5 |
|
20 PRLogModuleInfo *gLoadManagerLog = nullptr; |
|
21 #undef LOG |
|
22 #undef LOG_ENABLED |
|
23 #if defined(PR_LOGGING) |
|
24 #define LOG(args) PR_LOG(gLoadManagerLog, PR_LOG_DEBUG, args) |
|
25 #define LOG_ENABLED() PR_LOG_TEST(gLoadManagerLog, 5) |
|
26 #else |
|
27 #define LOG(args) |
|
28 #define LOG_ENABLED() (false) |
|
29 #endif |
|
30 |
|
31 namespace mozilla { |
|
32 |
|
33 LoadManager::LoadManager(int aLoadMeasurementInterval, |
|
34 int aAveragingMeasurements, |
|
35 float aHighLoadThreshold, |
|
36 float aLowLoadThreshold) |
|
37 : mLoadSum(0.0f), |
|
38 mLoadSumMeasurements(0), |
|
39 mOveruseActive(false), |
|
40 mLoadMeasurementInterval(aLoadMeasurementInterval), |
|
41 mAveragingMeasurements(aAveragingMeasurements), |
|
42 mHighLoadThreshold(aHighLoadThreshold), |
|
43 mLowLoadThreshold(aLowLoadThreshold), |
|
44 mCurrentState(webrtc::kLoadNormal) |
|
45 { |
|
46 #if defined(PR_LOGGING) |
|
47 if (!gLoadManagerLog) |
|
48 gLoadManagerLog = PR_NewLogModule("LoadManager"); |
|
49 #endif |
|
50 LOG(("LoadManager - Initializing (%dms x %d, %f, %f)", |
|
51 mLoadMeasurementInterval, mAveragingMeasurements, |
|
52 mHighLoadThreshold, mLowLoadThreshold)); |
|
53 MOZ_ASSERT(mHighLoadThreshold > mLowLoadThreshold); |
|
54 mLoadMonitor = new LoadMonitor(mLoadMeasurementInterval); |
|
55 mLoadMonitor->Init(mLoadMonitor); |
|
56 mLoadMonitor->SetLoadChangeCallback(this); |
|
57 } |
|
58 |
|
59 LoadManager::~LoadManager() |
|
60 { |
|
61 mLoadMonitor->Shutdown(); |
|
62 } |
|
63 |
|
64 void |
|
65 LoadManager::LoadChanged(float aSystemLoad, float aProcesLoad) |
|
66 { |
|
67 // Update total load, and total amount of measured seconds. |
|
68 mLoadSum += aSystemLoad; |
|
69 mLoadSumMeasurements++; |
|
70 |
|
71 if (mLoadSumMeasurements >= mAveragingMeasurements) { |
|
72 double averagedLoad = mLoadSum / (float)mLoadSumMeasurements; |
|
73 |
|
74 webrtc::CPULoadState oldState = mCurrentState; |
|
75 |
|
76 if (mOveruseActive || averagedLoad > mHighLoadThreshold) { |
|
77 LOG(("LoadManager - LoadStressed")); |
|
78 mCurrentState = webrtc::kLoadStressed; |
|
79 } else if (averagedLoad < mLowLoadThreshold) { |
|
80 LOG(("LoadManager - LoadRelaxed")); |
|
81 mCurrentState = webrtc::kLoadRelaxed; |
|
82 } else { |
|
83 LOG(("LoadManager - LoadNormal")); |
|
84 mCurrentState = webrtc::kLoadNormal; |
|
85 } |
|
86 |
|
87 if (oldState != mCurrentState) |
|
88 LoadHasChanged(); |
|
89 |
|
90 mLoadSum = 0; |
|
91 mLoadSumMeasurements = 0; |
|
92 } |
|
93 } |
|
94 |
|
95 void |
|
96 LoadManager::OveruseDetected() |
|
97 { |
|
98 LOG(("LoadManager - Overuse Detected")); |
|
99 mOveruseActive = true; |
|
100 if (mCurrentState != webrtc::kLoadStressed) { |
|
101 mCurrentState = webrtc::kLoadStressed; |
|
102 LoadHasChanged(); |
|
103 } |
|
104 } |
|
105 |
|
106 void |
|
107 LoadManager::NormalUsage() |
|
108 { |
|
109 LOG(("LoadManager - Overuse finished")); |
|
110 mOveruseActive = false; |
|
111 } |
|
112 |
|
113 void |
|
114 LoadManager::LoadHasChanged() |
|
115 { |
|
116 LOG(("LoadManager - Signaling LoadHasChanged to %d listeners", mObservers.Length())); |
|
117 for (size_t i = 0; i < mObservers.Length(); i++) { |
|
118 mObservers.ElementAt(i)->onLoadStateChanged(mCurrentState); |
|
119 } |
|
120 } |
|
121 |
|
122 void |
|
123 LoadManager::AddObserver(webrtc::CPULoadStateObserver * aObserver) |
|
124 { |
|
125 LOG(("LoadManager - Adding Observer")); |
|
126 mObservers.AppendElement(aObserver); |
|
127 } |
|
128 |
|
129 void |
|
130 LoadManager::RemoveObserver(webrtc::CPULoadStateObserver * aObserver) |
|
131 { |
|
132 LOG(("LoadManager - Removing Observer")); |
|
133 if (!mObservers.RemoveElement(aObserver)) { |
|
134 LOG(("LOadManager - Element to remove not found")); |
|
135 } |
|
136 } |
|
137 |
|
138 |
|
139 } |