// 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.

#include "athena/resource_manager/memory_pressure_notifier.h"

#include "athena/resource_manager/public/resource_manager_delegate.h"
#include "base/time/time.h"


namespace athena {

MemoryPressureNotifier::MemoryPressureNotifier(
    MemoryPressureObserver* listener)
      : listener_(listener),
        current_pressure_(ResourceManager::MEMORY_PRESSURE_UNKNOWN) {
  StartObserving();
}

MemoryPressureNotifier::~MemoryPressureNotifier() {
  StopObserving();
}

void MemoryPressureNotifier::StartObserving() {
  int time_in_ms = listener_->GetDelegate()->MemoryPressureIntervalInMS();
  timer_.Start(FROM_HERE,
               base::TimeDelta::FromMilliseconds(time_in_ms),
               base::Bind(&MemoryPressureNotifier::CheckMemoryPressure,
                          base::Unretained(this)));
}

void MemoryPressureNotifier::StopObserving() {
  // If StartObserving failed, StopObserving will still get called.
  timer_.Stop();
}

void MemoryPressureNotifier::CheckMemoryPressure() {
  ResourceManager::MemoryPressure pressure =
      GetMemoryPressureLevelFromFillLevel(
          listener_->GetDelegate()->GetUsedMemoryInPercent());
  if (current_pressure_ != pressure ||
      (pressure != ResourceManager::MEMORY_PRESSURE_LOW &&
       pressure != ResourceManager::MEMORY_PRESSURE_UNKNOWN)) {
    // If we are anything worse than |MEMORY_PRESSURE_LOW|, we notify the
    // listener.
    current_pressure_ = pressure;
    listener_->OnMemoryPressure(current_pressure_);
  }
}

ResourceManager::MemoryPressure
MemoryPressureNotifier::GetMemoryPressureLevelFromFillLevel(
    int memory_fill_level) {
  if (memory_fill_level == 0)
    return ResourceManager::MEMORY_PRESSURE_UNKNOWN;
  if (memory_fill_level < 50)
    return ResourceManager::MEMORY_PRESSURE_LOW;
  if (memory_fill_level < 75)
    return ResourceManager::MEMORY_PRESSURE_MODERATE;
  if (memory_fill_level < 90)
    return ResourceManager::MEMORY_PRESSURE_HIGH;
  return ResourceManager::MEMORY_PRESSURE_CRITICAL;
}

}  // namespace athena
