123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- // Copyright 2016 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 NET_NQE_NETWORK_QUALITY_STORE_H_
- #define NET_NQE_NETWORK_QUALITY_STORE_H_
- #include <map>
- #include "base/memory/weak_ptr.h"
- #include "base/observer_list.h"
- #include "base/sequence_checker.h"
- #include "net/base/net_export.h"
- #include "net/nqe/cached_network_quality.h"
- #include "net/nqe/effective_connection_type.h"
- #include "net/nqe/network_id.h"
- namespace net::nqe::internal {
- // NetworkQualityStore holds the network qualities of different networks in
- // memory. Entries are stored in LRU order, and older entries may be evicted.
- class NET_EXPORT_PRIVATE NetworkQualityStore {
- public:
- // Observes changes in the cached network qualities.
- class NET_EXPORT_PRIVATE NetworkQualitiesCacheObserver {
- public:
- NetworkQualitiesCacheObserver(const NetworkQualitiesCacheObserver&) =
- delete;
- NetworkQualitiesCacheObserver& operator=(
- const NetworkQualitiesCacheObserver&) = delete;
- // Notifies the observer of a change in the cached network quality. The
- // observer must register and unregister itself on the IO thread. All the
- // observers would be notified on the IO thread. |network_id| is the ID of
- // the network whose cached quality is being reported.
- virtual void OnChangeInCachedNetworkQuality(
- const nqe::internal::NetworkID& network_id,
- const nqe::internal::CachedNetworkQuality& cached_network_quality) = 0;
- protected:
- NetworkQualitiesCacheObserver() = default;
- virtual ~NetworkQualitiesCacheObserver() = default;
- };
- NetworkQualityStore();
- NetworkQualityStore(const NetworkQualityStore&) = delete;
- NetworkQualityStore& operator=(const NetworkQualityStore&) = delete;
- ~NetworkQualityStore();
- // Stores the network quality |cached_network_quality| of network with ID
- // |network_id|.
- void Add(const nqe::internal::NetworkID& network_id,
- const nqe::internal::CachedNetworkQuality& cached_network_quality);
- // Returns true if the network quality estimate was successfully read
- // for a network with ID |network_id|, and sets |cached_network_quality| to
- // the estimate read.
- bool GetById(
- const nqe::internal::NetworkID& network_id,
- nqe::internal::CachedNetworkQuality* cached_network_quality) const;
- // Adds and removes |observer| from the list of cache observers. The
- // observers are notified on the same thread on which it was added. Addition
- // and removal of the observer must happen on the same thread.
- void AddNetworkQualitiesCacheObserver(
- NetworkQualitiesCacheObserver* observer);
- void RemoveNetworkQualitiesCacheObserver(
- NetworkQualitiesCacheObserver* observer);
- // If |disable_offline_check| is set to true, the offline check is disabled
- // when storing the network quality.
- void DisableOfflineCheckForTesting(bool disable_offline_check);
- private:
- // Maximum size of the store that holds network quality estimates.
- // A smaller size may reduce the cache hit rate due to frequent evictions.
- // A larger size may affect performance.
- static const size_t kMaximumNetworkQualityCacheSize = 20;
- // Notifies |observer| of the current effective connection type if |observer|
- // is still registered as an observer.
- void NotifyCacheObserverIfPresent(
- NetworkQualitiesCacheObserver* observer) const;
- // This does not use an unordered_map or hash_map for code simplicity (the key
- // just implements operator<, rather than hash and equality) and because the
- // map is tiny.
- typedef std::map<nqe::internal::NetworkID,
- nqe::internal::CachedNetworkQuality>
- CachedNetworkQualities;
- // Data structure that stores the qualities of networks.
- CachedNetworkQualities cached_network_qualities_;
- // Observer list for changes in the cached network quality.
- base::ObserverList<NetworkQualitiesCacheObserver>::Unchecked
- network_qualities_cache_observer_list_;
- SEQUENCE_CHECKER(sequence_checker_);
- base::WeakPtrFactory<NetworkQualityStore> weak_ptr_factory_{this};
- };
- } // namespace net::nqe::internal
- #endif // NET_NQE_NETWORK_QUALITY_STORE_H_
|