blob: 3e04545f709264cdb3247c92d0f74f2264a2c251 [file] [log] [blame]
// Copyright 2023 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_BASE_ADDRESS_MAP_CACHE_LINUX_H_
#define NET_BASE_ADDRESS_MAP_CACHE_LINUX_H_
#include <map>
#include <string>
#include <unordered_set>
#include "base/synchronization/lock.h"
#include "base/thread_annotations.h"
#include "net/base/address_map_linux.h"
#include "net/base/net_export.h"
namespace net {
// This caches AddressMap and the set of online links (see AddressMapOwnerLinux)
// so AddressTrackerLinux doesn't need to always be running in every process.
// This class is thread-safe.
class NET_EXPORT AddressMapCacheLinux : public AddressMapOwnerLinux {
public:
AddressMapCacheLinux();
AddressMapCacheLinux(const AddressMapCacheLinux&) = delete;
AddressMapCacheLinux& operator=(const AddressMapCacheLinux&) = delete;
~AddressMapCacheLinux() override;
// AddressMapOwnerLinux implementation:
AddressMap GetAddressMap() const override;
std::unordered_set<int> GetOnlineLinks() const override;
AddressMapCacheLinux* GetAddressMapCacheLinux() override;
// Sets `cached_address_map_` and `cached_online_links_`. This should normally
// only be used to set the initial AddressMap and set of online links.
void SetCachedInfo(AddressMap address_map,
std::unordered_set<int> online_links);
// Takes the diffs and applies them (atomically) to `cached_address_map_` and
// `cached_online_links_`.
// Once this method returns, calls on other threads to GetAddressMap() and
// GetOnlineLinks() that happen-after this call should return the updated
// data.
void ApplyDiffs(const AddressMapDiff& addr_diff,
const OnlineLinksDiff& links_diff);
private:
mutable base::Lock lock_;
AddressMap cached_address_map_ GUARDED_BY(lock_);
std::unordered_set<int> cached_online_links_ GUARDED_BY(lock_);
};
} // namespace net
#endif // NET_BASE_ADDRESS_MAP_CACHE_LINUX_H_