Index: net/base/address_tracker_linux.cc |
diff --git a/net/base/address_tracker_linux.cc b/net/base/address_tracker_linux.cc |
index 367381366954f3280e9171f5d93405f05ed667d7..e0b5ec6cc246a0954cccfc5cca55b87c2251fe01 100644 |
--- a/net/base/address_tracker_linux.cc |
+++ b/net/base/address_tracker_linux.cc |
@@ -213,6 +213,11 @@ AddressTrackerLinux::AddressMap AddressTrackerLinux::GetAddressMap() const { |
return address_map_; |
} |
+base::hash_set<int> AddressTrackerLinux::GetOnlineLinks() const { |
+ base::AutoLock lock(online_links_lock_); |
+ return online_links_; |
+} |
+ |
NetworkChangeNotifier::ConnectionType |
AddressTrackerLinux::GetCurrentConnectionType() { |
// http://crbug.com/125097 |
@@ -256,8 +261,13 @@ void AddressTrackerLinux::ReadMessages(bool* address_changed, |
HandleMessage(buffer, rv, address_changed, link_changed, tunnel_changed); |
}; |
if (*link_changed) { |
+ bool is_offline; |
+ { |
+ base::AutoLock lock(online_links_lock_); |
+ is_offline = online_links_.empty(); |
+ } |
base::AutoLock lock(is_offline_lock_); |
- is_offline_ = online_links_.empty(); |
+ is_offline_ = is_offline; |
} |
} |
@@ -319,12 +329,14 @@ void AddressTrackerLinux::HandleMessage(char* buffer, |
reinterpret_cast<struct ifinfomsg*>(NLMSG_DATA(header)); |
if (!(msg->ifi_flags & IFF_LOOPBACK) && (msg->ifi_flags & IFF_UP) && |
(msg->ifi_flags & IFF_LOWER_UP) && (msg->ifi_flags & IFF_RUNNING)) { |
+ base::AutoLock lock(online_links_lock_); |
if (online_links_.insert(msg->ifi_index).second) { |
*link_changed = true; |
if (IsTunnelInterface(msg)) |
*tunnel_changed = true; |
} |
} else { |
+ base::AutoLock lock(online_links_lock_); |
if (online_links_.erase(msg->ifi_index)) { |
*link_changed = true; |
if (IsTunnelInterface(msg)) |
@@ -335,6 +347,7 @@ void AddressTrackerLinux::HandleMessage(char* buffer, |
case RTM_DELLINK: { |
const struct ifinfomsg* msg = |
reinterpret_cast<struct ifinfomsg*>(NLMSG_DATA(header)); |
+ base::AutoLock lock(online_links_lock_); |
if (online_links_.erase(msg->ifi_index)) { |
*link_changed = true; |
if (IsTunnelInterface(msg)) |