Index: chrome/browser/metrics/metrics_log.cc |
diff --git a/chrome/browser/metrics/metrics_log.cc b/chrome/browser/metrics/metrics_log.cc |
index 03fa5cf8868f567c0cdf58132bbc5948c1a68af6..804f7dec630acb95a048a9718d88814b53812422 100644 |
--- a/chrome/browser/metrics/metrics_log.cc |
+++ b/chrome/browser/metrics/metrics_log.cc |
@@ -12,12 +12,14 @@ |
#include "base/file_util.h" |
#include "base/lazy_instance.h" |
#include "base/memory/scoped_ptr.h" |
+#include "base/memory/weak_ptr.h" |
#include "base/perftimer.h" |
#include "base/profiler/alternate_timer.h" |
#include "base/string_number_conversions.h" |
#include "base/string_util.h" |
#include "base/sys_info.h" |
#include "base/third_party/nspr/prtime.h" |
+#include "base/threading/worker_pool.h" |
Ilya Sherman
2013/02/11 06:26:13
You should pretty much never use the WorkerPool cl
szym
2013/02/11 08:30:53
Habits from net/. BrowserThread is not available t
|
#include "base/time.h" |
#include "base/tracked_objects.h" |
#include "base/utf_string_conversions.h" |
@@ -45,6 +47,7 @@ |
#include "content/public/common/content_client.h" |
#include "content/public/common/gpu_info.h" |
#include "googleurl/src/gurl.h" |
+#include "net/base/net_util.h" |
#include "net/base/network_change_notifier.h" |
#include "ui/gfx/screen.h" |
#include "webkit/plugins/webplugininfo.h" |
@@ -311,7 +314,10 @@ void WriteScreenDPIInformationProto(SystemProfileProto::Hardware* hardware) { |
class MetricsLog::NetworkObserver |
: public net::NetworkChangeNotifier::ConnectionTypeObserver { |
Ilya Sherman
2013/02/11 06:26:13
Can you move this class out to its own header file
szym
2013/02/11 08:30:53
Done.
|
public: |
- NetworkObserver() : connection_type_is_ambiguous_(false) { |
+ NetworkObserver() |
+ : weak_ptr_factory_(this), |
Ilya Sherman
2013/02/11 06:26:13
nit: ALLOW_THIS_IN_...
szym
2013/02/11 08:30:53
Done.
|
+ connection_type_is_ambiguous_(false), |
+ wifi_phy_mode_is_ambiguous_(false) { |
net::NetworkChangeNotifier::AddConnectionTypeObserver(this); |
Reset(); |
} |
@@ -322,6 +328,8 @@ class MetricsLog::NetworkObserver |
void Reset() { |
connection_type_is_ambiguous_ = false; |
connection_type_ = net::NetworkChangeNotifier::GetConnectionType(); |
+ wifi_phy_mode_is_ambiguous_ = false; |
+ wifi_phy_mode_ = net::WIFI_PHY_MODE_UNKNOWN; |
} |
// ConnectionTypeObserver: |
@@ -334,6 +342,9 @@ class MetricsLog::NetworkObserver |
connection_type_is_ambiguous_ = true; |
} |
connection_type_ = type; |
+ |
+ weak_ptr_factory_.InvalidateWeakPtrs(); |
+ new WifiPhyModeJob(weak_ptr_factory_.GetWeakPtr()); |
} |
bool connection_type_is_ambiguous() const { |
@@ -360,10 +371,75 @@ class MetricsLog::NetworkObserver |
return SystemProfileProto::Network::CONNECTION_UNKNOWN; |
} |
+ bool wifi_phy_mode_is_ambiguous() const { |
+ return wifi_phy_mode_is_ambiguous_; |
+ } |
+ |
+ SystemProfileProto::Network::WifiPhyMode wifi_phy_mode() const { |
+ switch (wifi_phy_mode_) { |
+ case net::WIFI_PHY_MODE_NONE: |
+ return SystemProfileProto::Network::WIFI_PHY_MODE_NONE; |
+ case net::WIFI_PHY_MODE_ANCIENT: |
+ return SystemProfileProto::Network::WIFI_PHY_MODE_ANCIENT; |
+ case net::WIFI_PHY_MODE_A: |
+ return SystemProfileProto::Network::WIFI_PHY_MODE_A; |
+ case net::WIFI_PHY_MODE_B: |
+ return SystemProfileProto::Network::WIFI_PHY_MODE_B; |
+ case net::WIFI_PHY_MODE_G: |
+ return SystemProfileProto::Network::WIFI_PHY_MODE_G; |
+ case net::WIFI_PHY_MODE_N: |
+ return SystemProfileProto::Network::WIFI_PHY_MODE_N; |
+ case net::WIFI_PHY_MODE_UNKNOWN: |
+ return SystemProfileProto::Network::WIFI_PHY_MODE_UNKNOWN; |
+ } |
+ NOTREACHED(); |
+ return SystemProfileProto::Network::WIFI_PHY_MODE_UNKNOWN; |
+ } |
+ |
private: |
+ class WifiPhyModeJob { |
Ilya Sherman
2013/02/11 06:26:13
Why are you creating a class for this, rather than
szym
2013/02/11 08:30:53
A separate class (a DataBuffer) to hold the result
|
+ public: |
+ explicit WifiPhyModeJob(const base::WeakPtr<NetworkObserver>& observer) |
+ : observer_(observer) { |
+ base::WorkerPool::PostTaskAndReply( |
+ FROM_HERE, |
+ base::Bind(&WifiPhyModeJob::DoProbe, base::Unretained(this)), |
+ base::Bind(&WifiPhyModeJob::OnProbeComplete, base::Owned(this)), |
+ true /* isSlow */); |
+ } |
+ virtual ~WifiPhyModeJob() {} |
+ |
+ private: |
+ // Runs on worker thread. |
+ void DoProbe() { |
+ result_ = net::GetWifiPhyMode(); |
Ilya Sherman
2013/02/11 06:26:13
This is not thread-safe. Why are you storing the
szym
2013/02/11 08:30:53
This is as thread-safe as the PostTaskAndReply exa
|
+ } |
+ |
+ void OnProbeComplete() { |
+ if (observer_) |
+ observer_->OnWifiModeChanged(result_); |
+ } |
+ |
+ base::WeakPtr<NetworkObserver> observer_; |
+ net::WifiPhyMode result_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(WifiPhyModeJob); |
+ }; |
+ |
+ void OnWifiModeChanged(net::WifiPhyMode mode) { |
+ if (mode != wifi_phy_mode_) |
+ wifi_phy_mode_is_ambiguous_ = true; |
+ wifi_phy_mode_ = mode; |
+ } |
+ |
+ base::WeakPtrFactory<NetworkObserver> weak_ptr_factory_; |
+ |
bool connection_type_is_ambiguous_; |
net::NetworkChangeNotifier::ConnectionType connection_type_; |
+ bool wifi_phy_mode_is_ambiguous_; |
+ net::WifiPhyMode wifi_phy_mode_; |
+ |
DISALLOW_COPY_AND_ASSIGN(NetworkObserver); |
}; |
@@ -878,6 +954,9 @@ void MetricsLog::RecordEnvironmentProto( |
network->set_connection_type_is_ambiguous( |
network_observer_->connection_type_is_ambiguous()); |
network->set_connection_type(network_observer_->connection_type()); |
+ network->set_wifi_phy_mode_is_ambiguous( |
+ network_observer_->wifi_phy_mode_is_ambiguous()); |
+ network->set_wifi_phy_mode(network_observer_->wifi_phy_mode()); |
network_observer_->Reset(); |
SystemProfileProto::OS* os = system_profile->mutable_os(); |