// Copyright 2013 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 "content/browser/startup_task_runner.h" #include "base/bind.h" #include "base/location.h" namespace content { StartupTaskRunner::StartupTaskRunner( base::OnceCallback startup_complete_callback, scoped_refptr proxy) : startup_complete_callback_(std::move(startup_complete_callback)), proxy_(proxy) {} StartupTaskRunner::~StartupTaskRunner() {} void StartupTaskRunner::AddTask(StartupTask callback) { task_list_.push_back(std::move(callback)); } void StartupTaskRunner::StartRunningTasksAsync() { DCHECK(proxy_.get()); int result = 0; if (task_list_.empty()) { if (!startup_complete_callback_.is_null()) { std::move(startup_complete_callback_).Run(result); } } else { base::OnceClosure next_task = base::BindOnce(&StartupTaskRunner::WrappedTask, base::Unretained(this)); proxy_->PostNonNestableTask(FROM_HERE, std::move(next_task)); } } void StartupTaskRunner::RunAllTasksNow() { int result = 0; for (auto it = task_list_.begin(); it != task_list_.end(); it++) { result = std::move(*it).Run(); if (result > 0) break; } task_list_.clear(); if (!startup_complete_callback_.is_null()) { std::move(startup_complete_callback_).Run(result); } } void StartupTaskRunner::WrappedTask() { if (task_list_.empty()) { // This will happen if the remaining tasks have been run synchronously since // the WrappedTask was created. Any callback will already have been called, // so there is nothing to do return; } int result = std::move(task_list_.front()).Run(); task_list_.pop_front(); if (result > 0) { // Stop now and throw away the remaining tasks task_list_.clear(); } if (task_list_.empty()) { if (!startup_complete_callback_.is_null()) { std::move(startup_complete_callback_).Run(result); } } else { base::OnceClosure next_task = base::BindOnce(&StartupTaskRunner::WrappedTask, base::Unretained(this)); proxy_->PostNonNestableTask(FROM_HERE, std::move(next_task)); } } } // namespace content