1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file.
4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifndef COMPONENTS_VARIATIONS_CACHING_PERMUTED_ENTROPY_PROVIDER_H_
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define COMPONENTS_VARIATIONS_CACHING_PERMUTED_ENTROPY_PROVIDER_H_
7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/basictypes.h"
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/compiler_specific.h"
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/threading/thread_checker.h"
11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "components/variations/entropy_provider.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/variations/proto/permuted_entropy_cache.pb.h"
13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class PrefService;
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class PrefRegistrySimple;
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace metrics {
18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// CachingPermutedEntropyProvider is an entropy provider that uses the same
20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// algorithm as the PermutedEntropyProvider, but caches the results in Local
21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// State between runs.
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class CachingPermutedEntropyProvider : public PermutedEntropyProvider {
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Creates a CachingPermutedEntropyProvider using the given |local_state|
25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // prefs service with the specified |low_entropy_source|, which should have a
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // value in the range of [0, low_entropy_source_max).
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  CachingPermutedEntropyProvider(PrefService* local_state,
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 uint16 low_entropy_source,
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                 size_t low_entropy_source_max);
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual ~CachingPermutedEntropyProvider();
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Registers pref keys used by this class in the Local State pref registry.
33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  static void RegisterPrefs(PrefRegistrySimple* registry);
34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Clears the cache in local state. Should be called when the low entropy
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // source value gets reset.
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  static void ClearCache(PrefService* local_state);
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // PermutedEntropyProvider overrides:
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual uint16 GetPermutedValue(uint32 randomization_seed) const OVERRIDE;
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Reads the cache from local state.
44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void ReadFromLocalState() const;
45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Updates local state with the state of the cache.
47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void UpdateLocalState() const;
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Adds |randomization_seed| -> |value| to the cache.
50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void AddToCache(uint32 randomization_seed, uint16 value) const;
51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Finds the value corresponding to |randomization_seed|, setting |value| and
53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // returning true if found.
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bool FindValue(uint32 randomization_seed, uint16* value) const;
55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::ThreadChecker thread_checker_;
57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  PrefService* local_state_;
58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  mutable PermutedEntropyCache cache_;
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CachingPermutedEntropyProvider);
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace metrics
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // COMPONENTS_VARIATIONS_CACHING_PERMUTED_ENTROPY_PROVIDER_H_
66