| Index: net/proxy/polling_proxy_config_service.cc
|
| diff --git a/net/proxy/polling_proxy_config_service.cc b/net/proxy/polling_proxy_config_service.cc
|
| deleted file mode 100644
|
| index 7c086db3b89b7b82826e8cf48b79fa59e7650ad5..0000000000000000000000000000000000000000
|
| --- a/net/proxy/polling_proxy_config_service.cc
|
| +++ /dev/null
|
| @@ -1,200 +0,0 @@
|
| -// Copyright (c) 2012 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.
|
| -
|
| -#include "net/proxy/polling_proxy_config_service.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/location.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/message_loop/message_loop_proxy.h"
|
| -#include "base/observer_list.h"
|
| -#include "base/profiler/scoped_tracker.h"
|
| -#include "base/synchronization/lock.h"
|
| -#include "base/threading/worker_pool.h"
|
| -#include "net/proxy/proxy_config.h"
|
| -
|
| -namespace net {
|
| -
|
| -// Reference-counted wrapper that does all the work (needs to be
|
| -// reference-counted since we post tasks between threads; may outlive
|
| -// the parent PollingProxyConfigService).
|
| -class PollingProxyConfigService::Core
|
| - : public base::RefCountedThreadSafe<PollingProxyConfigService::Core> {
|
| - public:
|
| - Core(base::TimeDelta poll_interval,
|
| - GetConfigFunction get_config_func)
|
| - : get_config_func_(get_config_func),
|
| - poll_interval_(poll_interval),
|
| - have_initialized_origin_loop_(false),
|
| - has_config_(false),
|
| - poll_task_outstanding_(false),
|
| - poll_task_queued_(false) {
|
| - }
|
| -
|
| - // Called when the parent PollingProxyConfigService is destroyed
|
| - // (observers should not be called past this point).
|
| - void Orphan() {
|
| - base::AutoLock l(lock_);
|
| - origin_loop_proxy_ = NULL;
|
| - }
|
| -
|
| - bool GetLatestProxyConfig(ProxyConfig* config) {
|
| - LazyInitializeOriginLoop();
|
| - DCHECK(origin_loop_proxy_->BelongsToCurrentThread());
|
| -
|
| - OnLazyPoll();
|
| -
|
| - // If we have already retrieved the proxy settings (on worker thread)
|
| - // then return what we last saw.
|
| - if (has_config_) {
|
| - *config = last_config_;
|
| - return true;
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - void AddObserver(Observer* observer) {
|
| - LazyInitializeOriginLoop();
|
| - DCHECK(origin_loop_proxy_->BelongsToCurrentThread());
|
| - observers_.AddObserver(observer);
|
| - }
|
| -
|
| - void RemoveObserver(Observer* observer) {
|
| - DCHECK(origin_loop_proxy_->BelongsToCurrentThread());
|
| - observers_.RemoveObserver(observer);
|
| - }
|
| -
|
| - // Check for a new configuration if enough time has elapsed.
|
| - void OnLazyPoll() {
|
| - LazyInitializeOriginLoop();
|
| - DCHECK(origin_loop_proxy_->BelongsToCurrentThread());
|
| -
|
| - if (last_poll_time_.is_null() ||
|
| - (base::TimeTicks::Now() - last_poll_time_) > poll_interval_) {
|
| - CheckForChangesNow();
|
| - }
|
| - }
|
| -
|
| - void CheckForChangesNow() {
|
| - LazyInitializeOriginLoop();
|
| - DCHECK(origin_loop_proxy_->BelongsToCurrentThread());
|
| -
|
| - if (poll_task_outstanding_) {
|
| - // Only allow one task to be outstanding at a time. If we get a poll
|
| - // request while we are busy, we will defer it until the current poll
|
| - // completes.
|
| - poll_task_queued_ = true;
|
| - return;
|
| - }
|
| -
|
| - last_poll_time_ = base::TimeTicks::Now();
|
| - poll_task_outstanding_ = true;
|
| - poll_task_queued_ = false;
|
| - base::WorkerPool::PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&Core::PollOnWorkerThread, this, get_config_func_),
|
| - true);
|
| - }
|
| -
|
| - private:
|
| - friend class base::RefCountedThreadSafe<Core>;
|
| - ~Core() {}
|
| -
|
| - void PollOnWorkerThread(GetConfigFunction func) {
|
| - ProxyConfig config;
|
| - func(&config);
|
| -
|
| - base::AutoLock l(lock_);
|
| - if (origin_loop_proxy_.get()) {
|
| - origin_loop_proxy_->PostTask(
|
| - FROM_HERE, base::Bind(&Core::GetConfigCompleted, this, config));
|
| - }
|
| - }
|
| -
|
| - // Called after the worker thread has finished retrieving a configuration.
|
| - void GetConfigCompleted(const ProxyConfig& config) {
|
| - // TODO(pkasting): Remove ScopedTracker below once crbug.com/455942 is
|
| - // fixed.
|
| - tracked_objects::ScopedTracker tracking_profile(
|
| - FROM_HERE_WITH_EXPLICIT_FUNCTION(
|
| - "455942 PollingProxyConfigService::Core::GetConfigCompleted"));
|
| - DCHECK(poll_task_outstanding_);
|
| - poll_task_outstanding_ = false;
|
| -
|
| - if (!origin_loop_proxy_.get())
|
| - return; // Was orphaned (parent has already been destroyed).
|
| -
|
| - DCHECK(origin_loop_proxy_->BelongsToCurrentThread());
|
| -
|
| - if (!has_config_ || !last_config_.Equals(config)) {
|
| - // If the configuration has changed, notify the observers.
|
| - has_config_ = true;
|
| - last_config_ = config;
|
| - FOR_EACH_OBSERVER(Observer, observers_,
|
| - OnProxyConfigChanged(config,
|
| - ProxyConfigService::CONFIG_VALID));
|
| - }
|
| -
|
| - if (poll_task_queued_)
|
| - CheckForChangesNow();
|
| - }
|
| -
|
| - void LazyInitializeOriginLoop() {
|
| - // TODO(eroman): Really this should be done in the constructor, but right
|
| - // now chrome is constructing the ProxyConfigService on the
|
| - // UI thread so we can't cache the IO thread for the purpose
|
| - // of DCHECKs until the first call is made.
|
| - if (!have_initialized_origin_loop_) {
|
| - origin_loop_proxy_ = base::MessageLoopProxy::current();
|
| - have_initialized_origin_loop_ = true;
|
| - }
|
| - }
|
| -
|
| - GetConfigFunction get_config_func_;
|
| - ObserverList<Observer> observers_;
|
| - ProxyConfig last_config_;
|
| - base::TimeTicks last_poll_time_;
|
| - base::TimeDelta poll_interval_;
|
| -
|
| - base::Lock lock_;
|
| - scoped_refptr<base::MessageLoopProxy> origin_loop_proxy_;
|
| -
|
| - bool have_initialized_origin_loop_;
|
| - bool has_config_;
|
| - bool poll_task_outstanding_;
|
| - bool poll_task_queued_;
|
| -};
|
| -
|
| -void PollingProxyConfigService::AddObserver(Observer* observer) {
|
| - core_->AddObserver(observer);
|
| -}
|
| -
|
| -void PollingProxyConfigService::RemoveObserver(Observer* observer) {
|
| - core_->RemoveObserver(observer);
|
| -}
|
| -
|
| -ProxyConfigService::ConfigAvailability
|
| - PollingProxyConfigService::GetLatestProxyConfig(ProxyConfig* config) {
|
| - return core_->GetLatestProxyConfig(config) ? CONFIG_VALID : CONFIG_PENDING;
|
| -}
|
| -
|
| -void PollingProxyConfigService::OnLazyPoll() {
|
| - core_->OnLazyPoll();
|
| -}
|
| -
|
| -PollingProxyConfigService::PollingProxyConfigService(
|
| - base::TimeDelta poll_interval,
|
| - GetConfigFunction get_config_func)
|
| - : core_(new Core(poll_interval, get_config_func)) {
|
| -}
|
| -
|
| -PollingProxyConfigService::~PollingProxyConfigService() {
|
| - core_->Orphan();
|
| -}
|
| -
|
| -void PollingProxyConfigService::CheckForChangesNow() {
|
| - core_->CheckForChangesNow();
|
| -}
|
| -
|
| -} // namespace net
|
|
|