// 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. #ifndef COMPONENTS_VARIATIONS_CACHING_PERMUTED_ENTROPY_PROVIDER_H_ #define COMPONENTS_VARIATIONS_CACHING_PERMUTED_ENTROPY_PROVIDER_H_ #include #include #include "base/compiler_specific.h" #include "base/macros.h" #include "base/threading/thread_checker.h" #include "components/variations/entropy_provider.h" #include "components/variations/proto/permuted_entropy_cache.pb.h" class PrefService; class PrefRegistrySimple; namespace metrics { // CachingPermutedEntropyProvider is an entropy provider that uses the same // algorithm as the PermutedEntropyProvider, but caches the results in Local // State between runs. class CachingPermutedEntropyProvider : public PermutedEntropyProvider { public: // Creates a CachingPermutedEntropyProvider using the given |local_state| // prefs service with the specified |low_entropy_source|, which should have a // value in the range of [0, low_entropy_source_max). CachingPermutedEntropyProvider(PrefService* local_state, uint16_t low_entropy_source, size_t low_entropy_source_max); ~CachingPermutedEntropyProvider() override; // Registers pref keys used by this class in the Local State pref registry. static void RegisterPrefs(PrefRegistrySimple* registry); // Clears the cache in local state. Should be called when the low entropy // source value gets reset. static void ClearCache(PrefService* local_state); private: // PermutedEntropyProvider overrides: uint16_t GetPermutedValue(uint32_t randomization_seed) const override; // Reads the cache from local state. void ReadFromLocalState() const; // Updates local state with the state of the cache. void UpdateLocalState() const; // Adds |randomization_seed| -> |value| to the cache. void AddToCache(uint32_t randomization_seed, uint16_t value) const; // Finds the value corresponding to |randomization_seed|, setting |value| and // returning true if found. bool FindValue(uint32_t randomization_seed, uint16_t* value) const; base::ThreadChecker thread_checker_; PrefService* local_state_; mutable PermutedEntropyCache cache_; DISALLOW_COPY_AND_ASSIGN(CachingPermutedEntropyProvider); }; } // namespace metrics #endif // COMPONENTS_VARIATIONS_CACHING_PERMUTED_ENTROPY_PROVIDER_H_