blob: 0c99f6d95ec514ae52c6a30fd09412d9dfbdad8c [file] [log] [blame]
// Copyright (c) 2014 The Chromium OS 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 <stdint.h>
#include <string>
#include <base/callback_forward.h>
#include <base/files/file_path.h>
#include <base/macros.h>
#include <base/strings/string_piece.h>
namespace chromeos_metrics {
// PersistentIntegers is a 64-bit integer value backed by a file.
// The in-memory value acts as a write-through cache of the file value.
// If the backing file doesn't exist or has bad content, the value is 0.
class PersistentInteger {
// |backing_file_path| is the path to a file that is created, read and
// written in order to preserves the integer value across restarts of the
// program using it. The directory of the file must exist.
explicit PersistentInteger(const base::FilePath& backing_file_path);
PersistentInteger(const PersistentInteger&) = delete;
PersistentInteger& operator=(const PersistentInteger&) = delete;
// Virtual only because of mock.
virtual ~PersistentInteger();
// Sets the value. This writes through to the backing file.
void Set(int64_t v);
// Gets the value. May sync from backing file first.
int64_t Get();
// Convenience function for Get() followed by Set(0).
// Virtual only because of mock.
virtual int64_t GetAndClear();
// Convenience function for v = Get, Set(v + x).
// Virtual only because of mock.
virtual void Add(int64_t x);
// Convenience function for v = Get, Set(max(v, x)).
// Virtual only because of mock.
virtual void Max(int64_t x);
// Set a callback that is called each time a PersistentInteger is created.
static void SetCreationCallbackForTesting(
const base::RepeatingCallback<void(const base::FilePath&)>&
static void ClearCreationCallbackForTesting();
static const int kVersion = 1001;
// Writes |value_| to the backing file, creating it if necessary.
void Write();
// Reads the value from the backing file, stores it in |value_|, and returns
// true if the backing file is valid. Returns false otherwise, and creates
// a valid backing file as a side effect.
bool Read();
base::FilePath path_;
bool synced_;
int64_t value_;
int32_t version_;
static bool testing_;
} // namespace chromeos_metrics