diff options
author | joth@chromium.org <joth@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-25 18:21:56 +0000 |
---|---|---|
committer | joth@chromium.org <joth@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-25 18:21:56 +0000 |
commit | c6d31b1617d16638a7ac84832e56d0cb2cc4cd19 (patch) | |
tree | 5c321fcfe03f2d7913374ed7b935212c807cb8c7 /chrome/browser/geolocation | |
parent | 934f64699934345bac4a2e83747889dbb978f580 (diff) | |
download | chromium_src-c6d31b1617d16638a7ac84832e56d0cb2cc4cd19.zip chromium_src-c6d31b1617d16638a7ac84832e56d0cb2cc4cd19.tar.gz chromium_src-c6d31b1617d16638a7ac84832e56d0cb2cc4cd19.tar.bz2 |
Fix an issue in the common wifi data provider to make esp. mac wifi work correctly:-
it was waiting for the initial polling policy interval before making the initial scan, on windows this means a 10s latency in getting first fix, but on mac this was creating a 2min latency.
Adds detailed logging for the mac wifi data provider as this is the easiest way to debug on Mac it seems.
BUG=none
TEST=run browser with --enable-geolocation. open maps.google.com & click my location dot.
Review URL: http://codereview.chromium.org/661084
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@40032 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/geolocation')
-rw-r--r-- | chrome/browser/geolocation/wifi_data_provider_common.cc | 25 | ||||
-rw-r--r-- | chrome/browser/geolocation/wifi_data_provider_common.h | 2 | ||||
-rw-r--r-- | chrome/browser/geolocation/wifi_data_provider_mac.cc | 35 |
3 files changed, 41 insertions, 21 deletions
diff --git a/chrome/browser/geolocation/wifi_data_provider_common.cc b/chrome/browser/geolocation/wifi_data_provider_common.cc index 2aba3ab..0edb721 100644 --- a/chrome/browser/geolocation/wifi_data_provider_common.cc +++ b/chrome/browser/geolocation/wifi_data_provider_common.cc @@ -62,7 +62,9 @@ void WifiDataProviderCommon::Init() { polling_policy_.reset(NewPolicyPolicy()); DCHECK(polling_policy_ != NULL); - ScheduleNextScan(); + // Perform first scan ASAP regardless of the polling policy. If this scan + // fails we'll retry at a rate in line with the polling policy. + ScheduleNextScan(0); } void WifiDataProviderCommon::CleanUp() { @@ -72,23 +74,26 @@ void WifiDataProviderCommon::CleanUp() { } void WifiDataProviderCommon::DoWifiScanTask() { + bool update_available = false; WifiData new_data; if (wlan_api_->GetAccessPointData(&new_data.access_point_data)) { - data_mutex_.Acquire(); - bool update_available = wifi_data_.DiffersSignificantly(new_data); - wifi_data_ = new_data; - data_mutex_.Release(); - polling_policy_->UpdatePollingInterval(update_available); + { + AutoLock lock(data_mutex_); + update_available = wifi_data_.DiffersSignificantly(new_data); + wifi_data_ = new_data; + } if (update_available || !is_first_scan_complete_) { is_first_scan_complete_ = true; NotifyListeners(); } } - ScheduleNextScan(); + polling_policy_->UpdatePollingInterval(update_available); + ScheduleNextScan(polling_policy_->PollingInterval()); } -void WifiDataProviderCommon::ScheduleNextScan() { - message_loop()->PostDelayedTask(FROM_HERE, +void WifiDataProviderCommon::ScheduleNextScan(int interval) { + message_loop()->PostDelayedTask( + FROM_HERE, task_factory_.NewRunnableMethod(&WifiDataProviderCommon::DoWifiScanTask), - polling_policy_->PollingInterval()); + interval); } diff --git a/chrome/browser/geolocation/wifi_data_provider_common.h b/chrome/browser/geolocation/wifi_data_provider_common.h index ac8befa..15ac8eb 100644 --- a/chrome/browser/geolocation/wifi_data_provider_common.h +++ b/chrome/browser/geolocation/wifi_data_provider_common.h @@ -97,7 +97,7 @@ class WifiDataProviderCommon void DoWifiScanTask(); // Will schedule a scan; i.e. enqueue DoWifiScanTask deferred task. - void ScheduleNextScan(); + void ScheduleNextScan(int interval); WifiData wifi_data_; Lock data_mutex_; diff --git a/chrome/browser/geolocation/wifi_data_provider_mac.cc b/chrome/browser/geolocation/wifi_data_provider_mac.cc index e9c2b0f..bfe0a5c 100644 --- a/chrome/browser/geolocation/wifi_data_provider_mac.cc +++ b/chrome/browser/geolocation/wifi_data_provider_mac.cc @@ -11,7 +11,6 @@ #include <dlfcn.h> #include <stdio.h> -#include "base/lock.h" #include "base/utf_string_conversions.h" #include "chrome/browser/geolocation/osx_wifi.h" #include "chrome/browser/geolocation/wifi_data_provider_common.h" @@ -41,7 +40,6 @@ class OsxWlanApi : public WifiDataProviderCommon::WlanApiInterface { WirelessDetachFunction WirelessDetach_function_; WifiData wifi_data_; - Lock data_mutex_; }; OsxWlanApi::OsxWlanApi() @@ -57,12 +55,14 @@ OsxWlanApi::~OsxWlanApi() { } bool OsxWlanApi::Init() { + DLOG(INFO) << "OsxWlanApi::Init"; apple_80211_library_ = dlopen( "/System/Library/PrivateFrameworks/Apple80211.framework/Apple80211", RTLD_LAZY); - if (!apple_80211_library_) + if (!apple_80211_library_) { + DLOG(WARNING) << "Could not open Apple80211 library"; return false; - + } WirelessAttach_function_ = reinterpret_cast<WirelessAttachFunction>( dlsym(apple_80211_library_, "WirelessAttach")); WirelessScanSplit_function_ = reinterpret_cast<WirelessScanSplitFunction>( @@ -75,30 +75,42 @@ bool OsxWlanApi::Init() { if (!WirelessAttach_function_ || !WirelessScanSplit_function_ || !WirelessDetach_function_) { + DLOG(WARNING) << "Symbol error. Attach: " << !!WirelessAttach_function_ + << " Split: " << !!WirelessScanSplit_function_ + << " Detach: " << !!WirelessDetach_function_; return false; } - if ((*WirelessAttach_function_)(&wifi_context_, 0) != noErr) + WIErr err = (*WirelessAttach_function_)(&wifi_context_, 0); + if (err != noErr) { + DLOG(WARNING) << "Error attaching: " << err; return false; + } return true; } bool OsxWlanApi::GetAccessPointData(WifiData::AccessPointDataSet* data) { + DLOG(INFO) << "OsxWlanApi::GetAccessPointData"; DCHECK(data); DCHECK(WirelessScanSplit_function_); CFArrayRef managed_access_points = NULL; CFArrayRef adhoc_access_points = NULL; - if ((*WirelessScanSplit_function_)(wifi_context_, - &managed_access_points, - &adhoc_access_points, - 0) != noErr) { + WIErr err = (*WirelessScanSplit_function_)(wifi_context_, + &managed_access_points, + &adhoc_access_points, + 0); + if (err != noErr) { + DLOG(WARNING) << "Error spliting scan: " << err; return false; } - if (managed_access_points == NULL) + if (managed_access_points == NULL) { + DLOG(WARNING) << "managed_access_points == NULL"; return false; + } int num_access_points = CFArrayGetCount(managed_access_points); + DLOG(INFO) << "Found " << num_access_points << " managed access points:-"; for (int i = 0; i < num_access_points; ++i) { const WirelessNetworkInfo* access_point_info = reinterpret_cast<const WirelessNetworkInfo*>( @@ -124,6 +136,9 @@ bool OsxWlanApi::GetAccessPointData(WifiData::AccessPointDataSet* data) { access_point_data.ssid.clear(); } + DLOG(INFO) << " AP " << i + << " mac: " << access_point_data.mac_address + << " ssid: " << access_point_data.ssid; data->insert(access_point_data); } return true; |