// 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" #include "base/message_loop/message_loop.h" namespace content { StartupTaskRunner::StartupTaskRunner( base::Callback const startup_complete_callback, scoped_refptr proxy) : startup_complete_callback_(startup_complete_callback), proxy_(proxy) {} StartupTaskRunner::~StartupTaskRunner() {} void StartupTaskRunner::AddTask(StartupTask& callback) { task_list_.push_back(callback); } void StartupTaskRunner::StartRunningTasksAsync() { DCHECK(proxy_.get()); int result = 0; if (task_list_.empty()) { if (!startup_complete_callback_.is_null()) { startup_complete_callback_.Run(result); // Clear the callback to prevent it being called a second time startup_complete_callback_.Reset(); } } else { const base::Closure next_task = base::Bind(&StartupTaskRunner::WrappedTask, base::Unretained(this)); proxy_->PostNonNestableTask(FROM_HERE, next_task); } } void StartupTaskRunner::RunAllTasksNow() { int result = 0; for (std::list::iterator it = task_list_.begin(); it != task_list_.end(); it++) { result = it->Run(); if (result > 0) break; } task_list_.clear(); if (!startup_complete_callback_.is_null()) { startup_complete_callback_.Run(result); // Clear the callback to prevent it being called a second time startup_complete_callback_.Reset(); } } 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 = 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()) { startup_complete_callback_.Run(result); // Clear the callback to prevent it being called a second time startup_complete_callback_.Reset(); } } else { const base::Closure next_task = base::Bind(&StartupTaskRunner::WrappedTask, base::Unretained(this)); proxy_->PostNonNestableTask(FROM_HERE, next_task); } } } // namespace content