blob: d4d36cfb5803873ba66470dcc160419dd87bc4b0 [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// 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(
MayBeDangling<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_