// Copyright 2014 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 BASE_CHROMEOS_MEMORY_PRESSURE_OBSERVER_CHROMEOS_H_
#define BASE_CHROMEOS_MEMORY_PRESSURE_OBSERVER_CHROMEOS_H_

#include "base/base_export.h"
#include "base/gtest_prod_util.h"
#include "base/macros.h"
#include "base/memory/memory_pressure_listener.h"
#include "base/memory/weak_ptr.h"
#include "base/timer/timer.h"

namespace base {

class TestMemoryPressureObserver;

////////////////////////////////////////////////////////////////////////////////
// MemoryPressureObserverChromeOS
//
// A class to handle the observation of our free memory. It notifies the
// MemoryPressureListener of memory fill level changes, so that it can take
// action to reduce memory resources accordingly.
//
class BASE_EXPORT MemoryPressureObserverChromeOS {
 public:
  using GetUsedMemoryInPercentCallback = int (*)();

  // There are two memory pressure events:
  // MODERATE - which will mainly release caches.
  // CRITICAL - which will discard tabs.
  // The |MemoryPressureThresholds| enum selects the strategy of firing these
  // events: A conservative strategy will keep as much content in memory as
  // possible (causing the system to swap to zram) and an aggressive strategy
  // will release memory earlier to avoid swapping.
  enum MemoryPressureThresholds {
    // Use the system default.
    THRESHOLD_DEFAULT = 0,
    // Try to keep as much content in memory as possible.
    THRESHOLD_CONSERVATIVE = 1,
    // Discard caches earlier, allowing to keep more tabs in memory.
    THRESHOLD_AGGRESSIVE_CACHE_DISCARD = 2,
    // Discard tabs earlier, allowing the system to get faster.
    THRESHOLD_AGGRESSIVE_TAB_DISCARD = 3,
    // Discard caches and tabs earlier to allow the system to be faster.
    THRESHOLD_AGGRESSIVE = 4
  };

  explicit MemoryPressureObserverChromeOS(MemoryPressureThresholds thresholds);
  virtual ~MemoryPressureObserverChromeOS();

  // Redo the memory pressure calculation soon and call again if a critical
  // memory pressure prevails. Note that this call will trigger an asynchronous
  // action which gives the system time to release memory back into the pool.
  void ScheduleEarlyCheck();

  // Get the current memory pressure level.
  base::MemoryPressureListener::MemoryPressureLevel GetCurrentPressureLevel() {
    return current_memory_pressure_level_;
  }

 private:
  friend TestMemoryPressureObserver;
  // Starts observing the memory fill level.
  // Calls to StartObserving should always be matched with calls to
  // StopObserving.
  void StartObserving();

  // Stop observing the memory fill level.
  // May be safely called if StartObserving has not been called.
  void StopObserving();

  // The function which gets periodically called to check any changes in the
  // memory pressure. It will report pressure changes as well as continuous
  // critical pressure levels.
  void CheckMemoryPressure();

  // The function periodically checks the memory pressure changes and records
  // the UMA histogram statistics for the current memory pressure level.
  void CheckMemoryPressureAndRecordStatistics();

  // Get the memory pressure in percent (virtual for testing).
  virtual int GetUsedMemoryInPercent();

  // The current memory pressure.
  base::MemoryPressureListener::MemoryPressureLevel
      current_memory_pressure_level_;

  // A periodic timer to check for resource pressure changes. This will get
  // replaced by a kernel triggered event system (see crbug.com/381196).
  base::RepeatingTimer<MemoryPressureObserverChromeOS> timer_;

  // To slow down the amount of moderate pressure event calls, this counter
  // gets used to count the number of events since the last event occured.
  int moderate_pressure_repeat_count_;

  // The thresholds for moderate and critical pressure.
  const int moderate_pressure_threshold_percent_;
  const int critical_pressure_threshold_percent_;

  base::WeakPtrFactory<MemoryPressureObserverChromeOS> weak_ptr_factory_;

  DISALLOW_COPY_AND_ASSIGN(MemoryPressureObserverChromeOS);
};

}  // namespace base

#endif  // BASE_CHROMEOS_MEMORY_PRESSURE_OBSERVER_CHROMEOS_H_
