blob: ba9cfc961eea792a650a31998c4ae70288ef7e6b [file] [log] [blame]
// Copyright 2019 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 CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_POLICIES_WORKING_SET_TRIMMER_POLICY_H_
#define CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_POLICIES_WORKING_SET_TRIMMER_POLICY_H_
#include "base/macros.h"
#include "base/time/time.h"
#include "chrome/browser/performance_manager/public/graph/graph.h"
#include "chrome/browser/performance_manager/public/graph/node_attached_data.h"
#include "chrome/browser/performance_manager/public/graph/process_node.h"
namespace performance_manager {
namespace policies {
// Empties the working set of processes in which all frames are frozen.
//
// Objective #1: Track working set growth rate.
// Swap thrashing occurs when a lot of pages are accessed in a short period of
// time. Swap thrashing can be reduced by reducing the number of pages
// accessed by processes in which all frames are frozen. To track efforts
// towards this goal, we empty the working set of processes when all their
// frames become frozen and record the size of their working set after x
// minutes.
// TODO(fdoray): Record the working set size x minutes after emptying it.
// https://crbug.com/885293
//
// Objective #2: Improve performance.
// We hypothesize that emptying the working set of a process causes its pages
// to be compressed and/or written to disk preemptively, which makes more
// memory available quickly for foreground processes and improves global
// browser performance.
class WorkingSetTrimmerPolicy : public GraphOwned,
public ProcessNode::ObserverDefaultImpl {
public:
WorkingSetTrimmerPolicy();
~WorkingSetTrimmerPolicy() override;
// CreatePolicyForPlatform will create a working set trimmer policy for a
// specific platform which should be owned by the graph, you should always
// check PlatformSupportsWorkingSetTrim() before creating a policy to do so as
// it would result in unnecessary book-keeping.
static std::unique_ptr<WorkingSetTrimmerPolicy> CreatePolicyForPlatform();
// Returns true if running on a platform that supports working set trimming.
static bool PlatformSupportsWorkingSetTrim();
// GraphOwned implementation:
void OnPassedToGraph(Graph* graph) override;
void OnTakenFromGraph(Graph* graph) override;
// ProcessNodeObserver implementation:
void OnAllFramesInProcessFrozen(const ProcessNode* process_node) override;
protected:
// (Un)registers the various node observer flavors of this object with the
// graph. These are invoked by OnPassedToGraph and OnTakenFromGraph, but
// hoisted to their own functions for testing.
void RegisterObservers(Graph* graph);
void UnregisterObservers(Graph* graph);
// Returns the time in which this process was last trimmed.
base::TimeTicks GetLastTrimTime(const ProcessNode* process_node);
// Sets the last trim time to TimeTicks::Now().
void SetLastTrimTimeNow(const ProcessNode* process_node);
// TrimWorkingSet will trim a ProcessNode's working set, it will return true
// on success. This is virtual for testing.
virtual bool TrimWorkingSet(const ProcessNode* process_node);
private:
friend class WorkingSetTrimmerPolicyTest;
// A helper method which sets the last trim time to the specified time.
void SetLastTrimTime(const ProcessNode* process_node, base::TimeTicks time);
DISALLOW_COPY_AND_ASSIGN(WorkingSetTrimmerPolicy);
};
} // namespace policies
} // namespace performance_manager
#endif // CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_POLICIES_WORKING_SET_TRIMMER_POLICY_H_