Index: components/update_client/update_client.cc |
diff --git a/components/update_client/update_client.cc b/components/update_client/update_client.cc |
index 55b096e67bc7330354b7580d32a3437389d310b8..8b8e598682e67757194e96f0186871264333b07e 100644 |
--- a/components/update_client/update_client.cc |
+++ b/components/update_client/update_client.cc |
@@ -89,7 +89,7 @@ void UpdateClientImpl::Install(const std::string& id, |
const CompletionCallback& completion_callback) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- if (update_engine_->IsUpdating(id)) { |
+ if (IsUpdating(id)) { |
completion_callback.Run(Error::ERROR_UPDATE_IN_PROGRESS); |
return; |
} |
@@ -104,6 +104,7 @@ void UpdateClientImpl::Install(const std::string& id, |
scoped_ptr<TaskUpdate> task(new TaskUpdate(update_engine_.get(), true, ids, |
crx_data_callback, callback)); |
+ // Install tasks are run concurrently and never queued up. |
auto it = tasks_.insert(task.release()).first; |
RunTask(*it); |
} |
@@ -118,6 +119,8 @@ void UpdateClientImpl::Update(const std::vector<std::string>& ids, |
scoped_ptr<TaskUpdate> task(new TaskUpdate(update_engine_.get(), false, ids, |
crx_data_callback, callback)); |
+ // If no other tasks are running at the moment, run this update task. |
+ // Otherwise, queue the task up. |
if (tasks_.empty()) { |
auto it = tasks_.insert(task.release()).first; |
RunTask(*it); |
@@ -145,7 +148,9 @@ void UpdateClientImpl::OnTaskComplete( |
tasks_.erase(task); |
delete task; |
- if (!task_queue_.empty()) { |
+ // Pick up a task from the queue if the queue has pending tasks and no other |
+ // task is running. |
+ if (tasks_.empty() && !task_queue_.empty()) { |
RunTask(task_queue_.front()); |
task_queue_.pop(); |
} |
@@ -173,7 +178,16 @@ bool UpdateClientImpl::GetCrxUpdateState(const std::string& id, |
} |
bool UpdateClientImpl::IsUpdating(const std::string& id) const { |
- return update_engine_->IsUpdating(id); |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ for (const auto& task : tasks_) { |
+ const auto ids(task->GetIds()); |
+ if (std::find(std::begin(ids), std::end(ids), id) != std::end(ids)) { |
+ return true; |
+ } |
+ } |
+ |
+ return false; |
} |
scoped_refptr<UpdateClient> UpdateClientFactory( |