1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef METRICS_PERSISTENT_INTEGER_H_ 18 #define METRICS_PERSISTENT_INTEGER_H_ 19 20 #include <stdint.h> 21 22 #include <string> 23 24 #include <base/files/file_path.h> 25 26 namespace chromeos_metrics { 27 28 // PersistentIntegers is a named 64-bit integer value backed by a file. 29 // The in-memory value acts as a write-through cache of the file value. 30 // If the backing file doesn't exist or has bad content, the value is 0. 31 32 class PersistentInteger { 33 public: 34 PersistentInteger(const std::string& name, const base::FilePath& directory); 35 36 // Virtual only because of mock. 37 virtual ~PersistentInteger(); 38 39 // Sets the value. This writes through to the backing file. 40 void Set(int64_t v); 41 42 // Gets the value. May sync from backing file first. 43 int64_t Get(); 44 45 // Returns the name of the object. Name()46 std::string Name() { return name_; } 47 48 // Convenience function for Get() followed by Set(0). 49 int64_t GetAndClear(); 50 51 // Convenience function for v = Get, Set(v + x). 52 // Virtual only because of mock. 53 virtual void Add(int64_t x); 54 55 private: 56 static const int kVersion = 1001; 57 58 // Writes |value_| to the backing file, creating it if necessary. 59 void Write(); 60 61 // Reads the value from the backing file, stores it in |value_|, and returns 62 // true if the backing file is valid. Returns false otherwise, and creates 63 // a valid backing file as a side effect. 64 bool Read(); 65 66 int64_t value_; 67 int32_t version_; 68 std::string name_; 69 base::FilePath backing_file_path_; 70 bool synced_; 71 }; 72 73 } // namespace chromeos_metrics 74 75 #endif // METRICS_PERSISTENT_INTEGER_H_ 76