blob: 70bf53e5cad5190666ba56b1fb635d5ce495bd3c [file] [log] [blame]
// Copyright 2016 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 CONTENT_BROWSER_MEMORY_MEMORY_CONDITION_OBSERVER_H_
#define CONTENT_BROWSER_MEMORY_MEMORY_CONDITION_OBSERVER_H_
#include "base/cancelable_callback.h"
#include "base/single_thread_task_runner.h"
#include "base/time/time.h"
#include "content/browser/memory/memory_coordinator_impl.h"
#include "content/common/content_export.h"
namespace content {
// MemoryConditionObserver observes system memory usage and determines the
// current MemoryCondition. It dispatches the current condition if the condition
// has changed.
class CONTENT_EXPORT MemoryConditionObserver {
public:
// |coordinator| must outlive than this instance.
MemoryConditionObserver(
MemoryCoordinatorImpl* coordinator,
scoped_refptr<base::SingleThreadTaskRunner> task_runner);
~MemoryConditionObserver();
// Schedules a task to update memory condition. The task will be executed
// after |delay| has passed.
void ScheduleUpdateCondition(base::TimeDelta delay);
// Called when the browser is foregrounded.
void OnForegrounded();
// Called when the browser is backgrounded.
void OnBackgrounded();
private:
FRIEND_TEST_ALL_PREFIXES(MemoryCoordinatorImplTest, CalculateNextCondition);
FRIEND_TEST_ALL_PREFIXES(MemoryCoordinatorImplTest, ForceSetMemoryCondition);
FRIEND_TEST_ALL_PREFIXES(MemoryCoordinatorImplTest, DiscardTabUnderCritical);
// Sets the monitoring interval and reschedules a task to update memory
// condition.
void SetMonitoringInterval(base::TimeDelta interval);
// Calculates next memory condition from the amount of free memory using
// a heuristic.
MemoryCondition CalculateNextCondition();
// Periodically called to update the memory condition.
void UpdateCondition();
MemoryCoordinatorImpl* coordinator_;
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
base::CancelableClosure update_condition_closure_;
// The current interval of checking the amount of free memory.
base::TimeDelta monitoring_interval_;
// The value of |monitoring_interval_| when the browser is foregrounded.
base::TimeDelta monitoring_interval_foregrounded_;
// The value of |monitoring_interval_| when the browser is backgrounded.
base::TimeDelta monitoring_interval_backgrounded_;
DISALLOW_COPY_AND_ASSIGN(MemoryConditionObserver);
};
} // namespace content
#endif // CONTENT_BROWSER_MEMORY_MEMORY_CONDITION_OBSERVER_H_