summaryrefslogtreecommitdiffstats
path: root/chrome/browser/geolocation
diff options
context:
space:
mode:
authorjoth@chromium.org <joth@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-25 18:21:56 +0000
committerjoth@chromium.org <joth@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-25 18:21:56 +0000
commitc6d31b1617d16638a7ac84832e56d0cb2cc4cd19 (patch)
tree5c321fcfe03f2d7913374ed7b935212c807cb8c7 /chrome/browser/geolocation
parent934f64699934345bac4a2e83747889dbb978f580 (diff)
downloadchromium_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.cc25
-rw-r--r--chrome/browser/geolocation/wifi_data_provider_common.h2
-rw-r--r--chrome/browser/geolocation/wifi_data_provider_mac.cc35
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;