summaryrefslogtreecommitdiffstats
path: root/net/proxy/polling_proxy_config_service.cc
diff options
context:
space:
mode:
Diffstat (limited to 'net/proxy/polling_proxy_config_service.cc')
-rw-r--r--net/proxy/polling_proxy_config_service.cc53
1 files changed, 37 insertions, 16 deletions
diff --git a/net/proxy/polling_proxy_config_service.cc b/net/proxy/polling_proxy_config_service.cc
index ac42d9c..2db9792 100644
--- a/net/proxy/polling_proxy_config_service.cc
+++ b/net/proxy/polling_proxy_config_service.cc
@@ -22,10 +22,11 @@ class PollingProxyConfigService::Core
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_interval_(poll_interval),
- have_initialized_origin_loop_(false) {
+ poll_task_queued_(false) {
}
// Called when the parent PollingProxyConfigService is destroyed
@@ -66,20 +67,31 @@ class PollingProxyConfigService::Core
LazyInitializeOriginLoop();
DCHECK(origin_loop_proxy_->BelongsToCurrentThread());
- if (poll_task_outstanding_)
- return; // Still waiting for earlier test to finish.
+ if (last_poll_time_.is_null() ||
+ (base::TimeTicks::Now() - last_poll_time_) > poll_interval_) {
+ CheckForChangesNow();
+ }
+ }
- base::TimeTicks now = base::TimeTicks::Now();
+ void CheckForChangesNow() {
+ LazyInitializeOriginLoop();
+ DCHECK(origin_loop_proxy_->BelongsToCurrentThread());
- if (last_poll_time_.is_null() ||
- (now - last_poll_time_) > poll_interval_) {
- last_poll_time_ = now;
- poll_task_outstanding_ = true;
- WorkerPool::PostTask(
- FROM_HERE,
- NewRunnableMethod(
- this, &Core::PollOnWorkerThread, get_config_func_), true);
+ 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;
+ WorkerPool::PostTask(
+ FROM_HERE,
+ NewRunnableMethod(
+ this, &Core::PollOnWorkerThread, get_config_func_), true);
}
private:
@@ -111,6 +123,9 @@ class PollingProxyConfigService::Core
last_config_ = config;
FOR_EACH_OBSERVER(Observer, observers_, OnProxyConfigChanged(config));
}
+
+ if (poll_task_queued_)
+ CheckForChangesNow();
}
void LazyInitializeOriginLoop() {
@@ -126,15 +141,17 @@ class PollingProxyConfigService::Core
GetConfigFunction get_config_func_;
ObserverList<Observer> observers_;
- bool has_config_;
- bool poll_task_outstanding_;
ProxyConfig last_config_;
base::TimeTicks last_poll_time_;
base::TimeDelta poll_interval_;
- bool have_initialized_origin_loop_;
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_;
};
PollingProxyConfigService::PollingProxyConfigService(
@@ -163,4 +180,8 @@ void PollingProxyConfigService::OnLazyPoll() {
core_->OnLazyPoll();
}
+void PollingProxyConfigService::CheckForChangesNow() {
+ core_->CheckForChangesNow();
+}
+
} // namespace net