| Index: chrome/browser/rlz/rlz.cc
|
| diff --git a/chrome/browser/rlz/rlz.cc b/chrome/browser/rlz/rlz.cc
|
| index e0798fc2ec61534f52b70cf1d410367ade6d47dc..83a55bc0b3104cfc382098790bd5068837ded3a7 100644
|
| --- a/chrome/browser/rlz/rlz.cc
|
| +++ b/chrome/browser/rlz/rlz.cc
|
| @@ -1,4 +1,4 @@
|
| -// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
| //
|
| @@ -20,8 +20,10 @@
|
| #include "base/task.h"
|
| #include "base/threading/thread.h"
|
| #include "base/threading/thread_restrictions.h"
|
| +#include "base/synchronization/lock.h"
|
| #include "base/utf_string_conversions.h"
|
| #include "chrome/browser/browser_process.h"
|
| +#include "chrome/browser/browser_thread.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/profiles/profile_manager.h"
|
| #include "chrome/browser/search_engines/template_url.h"
|
| @@ -45,6 +47,7 @@ enum {
|
| // Tracks if we have tried and succeeded sending the ping. This helps us
|
| // decide if we need to refresh the some cached strings.
|
| volatile int access_values_state = ACCESS_VALUES_STALE;
|
| +base::Lock rlz_lock;
|
|
|
| bool SendFinancialPing(const std::wstring& brand, const std::wstring& lang,
|
| const std::wstring& referral, bool exclude_id) {
|
| @@ -147,6 +150,7 @@ class DailyPingTask : public Task {
|
| std::wstring referral;
|
| GoogleUpdateSettings::GetReferral(&referral);
|
| if (SendFinancialPing(brand, lang, referral, is_organic(brand))) {
|
| + base::AutoLock lock(rlz_lock);
|
| access_values_state = ACCESS_VALUES_STALE;
|
| GoogleUpdateSettings::ClearReferral();
|
| }
|
| @@ -168,9 +172,6 @@ class DelayedInitTask : public Task {
|
| virtual ~DelayedInitTask() {
|
| }
|
| virtual void Run() {
|
| - // Needs to be evaluated. See http://crbug.com/62328.
|
| - base::ThreadRestrictions::ScopedAllowIO allow_io;
|
| -
|
| // For non-interactive tests we don't do the rest of the initialization
|
| // because sometimes the very act of loading the dll causes QEMU to crash.
|
| if (::GetEnvironmentVariableW(ASCIIToWide(env_vars::kHeadless).c_str(),
|
| @@ -212,9 +213,7 @@ class DelayedInitTask : public Task {
|
| rlz_lib::FIRST_SEARCH);
|
| }
|
| // Schedule the daily RLZ ping.
|
| - base::Thread* thread = g_browser_process->file_thread();
|
| - if (thread)
|
| - thread->message_loop()->PostTask(FROM_HERE, new DailyPingTask());
|
| + MessageLoop::current()->PostTask(FROM_HERE, new DailyPingTask());
|
| }
|
|
|
| private:
|
| @@ -258,8 +257,8 @@ bool RLZTracker::InitRlzDelayed(bool first_run, int delay) {
|
| new OmniBoxUsageObserver();
|
|
|
| // Schedule the delayed init items.
|
| - MessageLoop::current()->PostDelayedTask(FROM_HERE,
|
| - new DelayedInitTask(first_run), delay);
|
| + BrowserThread::PostDelayedTask(
|
| + BrowserThread::FILE, FROM_HERE, new DelayedInitTask(first_run), delay);
|
| return true;
|
| }
|
|
|
| @@ -280,18 +279,40 @@ bool RLZTracker::ClearAllProductEvents(rlz_lib::Product product) {
|
| bool RLZTracker::GetAccessPointRlz(rlz_lib::AccessPoint point,
|
| std::wstring* rlz) {
|
| static std::wstring cached_ommibox_rlz;
|
| - if ((rlz_lib::CHROME_OMNIBOX == point) &&
|
| - (access_values_state == ACCESS_VALUES_FRESH)) {
|
| - *rlz = cached_ommibox_rlz;
|
| - return true;
|
| + if (rlz_lib::CHROME_OMNIBOX == point) {
|
| + base::AutoLock lock(rlz_lock);
|
| + if (access_values_state == ACCESS_VALUES_FRESH) {
|
| + *rlz = cached_ommibox_rlz;
|
| + return true;
|
| + }
|
| }
|
| +
|
| + // Make sure we don't access disk outside of the file context.
|
| + // In such case we repost the task on the right thread and return error.
|
| + if (!BrowserThread::CurrentlyOn(BrowserThread::FILE)) {
|
| + // Caching of access points is now only implemented for the CHROME_OMNIBOX.
|
| + // Thus it is not possible to call this function on another thread for
|
| + // other access points until proper caching for these has been implemented
|
| + // and the code that calls this function can handle synchronous fetching
|
| + // of the access point.
|
| + DCHECK_EQ(rlz_lib::CHROME_OMNIBOX, point);
|
| +
|
| + BrowserThread::PostTask(
|
| + BrowserThread::FILE, FROM_HERE,
|
| + NewRunnableFunction(&RLZTracker::GetAccessPointRlz,
|
| + point, &cached_ommibox_rlz));
|
| + rlz->erase();
|
| + return false;
|
| + }
|
| +
|
| char str_rlz[kMaxRlzLength + 1];
|
| if (!rlz_lib::GetAccessPointRlz(point, str_rlz, rlz_lib::kMaxRlzLength, NULL))
|
| return false;
|
| *rlz = ASCIIToWide(std::string(str_rlz));
|
| if (rlz_lib::CHROME_OMNIBOX == point) {
|
| - access_values_state = ACCESS_VALUES_FRESH;
|
| + base::AutoLock lock(rlz_lock);
|
| cached_ommibox_rlz.assign(*rlz);
|
| + access_values_state = ACCESS_VALUES_FRESH;
|
| }
|
| return true;
|
| }
|
|
|