1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROMECAST_BROWSER_CAST_SYSTEM_MEMORY_PRESSURE_EVALUATOR_H_
6 #define CHROMECAST_BROWSER_CAST_SYSTEM_MEMORY_PRESSURE_EVALUATOR_H_
7 
8 #include <string>
9 
10 #include "base/containers/flat_set.h"
11 #include "base/macros.h"
12 #include "base/memory/scoped_refptr.h"
13 #include "base/memory/weak_ptr.h"
14 #include "base/util/memory_pressure/system_memory_pressure_evaluator.h"
15 #include "chromecast/browser/cast_system_memory_pressure_evaluator_adjuster.h"
16 
17 namespace base {
18 class SingleThreadTaskRunner;
19 }  // namespace base
20 
21 namespace chromecast {
22 
23 // Memory pressure evaluator for Cast: polls for current memory
24 // usage periodically and sends memory pressure notifications.
25 class CastSystemMemoryPressureEvaluator
26     : public util::SystemMemoryPressureEvaluator,
27       public CastSystemMemoryPressureEvaluatorAdjuster {
28  public:
29   explicit CastSystemMemoryPressureEvaluator(
30       std::unique_ptr<util::MemoryPressureVoter> voter);
31   ~CastSystemMemoryPressureEvaluator() override;
32 
33   // CastSystemMemoryPressureEvaluatorAdjuster implementation:
34   void ConfigRelaxMemoryPressureThresholds(
35       float relaxed_critical_memory_fraction,
36       float relaxed_moderate_memory_fraction) override;
37   void RelaxMemoryPressureThresholds(
38       std::string requesting_app_session_id) override;
39   void RestoreMemoryPressureThresholds(
40       const std::string& requesting_app_session_id) override;
41 
42  private:
43   void PollPressureLevel();
44   void UpdateMemoryPressureLevel(
45       base::MemoryPressureListener::MemoryPressureLevel new_level);
46   void AdjustMemoryFractions(bool relax);
47 
48   // Fractions in effect.
49   float critical_memory_fraction_;
50   float moderate_memory_fraction_;
51 
52   // Fractions when the thrsholds are relaxed.
53   float relaxed_critical_memory_fraction_;
54   float relaxed_moderate_memory_fraction_;
55 
56   // When negative, no valid critical/moderate memory fraction present
57   // in command line parameters.
58   float const critical_memory_fraction_command_line_;
59   float const moderate_memory_fraction_command_line_;
60 
61   base::flat_set<std::string> apps_needing_relaxed_memory_pressure_thresholds_;
62 
63   const int system_reserved_kb_;
64   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
65   base::WeakPtrFactory<CastSystemMemoryPressureEvaluator> weak_ptr_factory_;
66 
67   DISALLOW_COPY_AND_ASSIGN(CastSystemMemoryPressureEvaluator);
68 };
69 
70 }  // namespace chromecast
71 
72 #endif  // CHROMECAST_BROWSER_CAST_SYSTEM_MEMORY_PRESSURE_EVALUATOR_H_
73