| Index: chrome/browser/chromeos/drive/change_list_loader.cc
|
| diff --git a/chrome/browser/chromeos/drive/change_list_loader.cc b/chrome/browser/chromeos/drive/change_list_loader.cc
|
| index fe24054280721e7b23dfa3da0f28973974f66849..fc22c5442cf72b8cf64a6af9d0c9bc6a4f9eaf04 100644
|
| --- a/chrome/browser/chromeos/drive/change_list_loader.cc
|
| +++ b/chrome/browser/chromeos/drive/change_list_loader.cc
|
| @@ -299,16 +299,60 @@ FileError RefreshMyDriveIfNeeded(
|
|
|
| } // namespace
|
|
|
| +LoaderController::LoaderController()
|
| + : lock_count_(0),
|
| + weak_ptr_factory_(this) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +}
|
| +
|
| +LoaderController::~LoaderController() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +}
|
| +
|
| +scoped_ptr<base::ScopedClosureRunner> LoaderController::GetLock() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + ++lock_count_;
|
| + return make_scoped_ptr(new base::ScopedClosureRunner(
|
| + base::Bind(&LoaderController::Unlock,
|
| + weak_ptr_factory_.GetWeakPtr())));
|
| +}
|
| +
|
| +void LoaderController::ScheduleRun(const base::Closure& task) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + DCHECK(!task.is_null());
|
| +
|
| + if (lock_count_ > 0) {
|
| + pending_tasks_.push_back(task);
|
| + } else {
|
| + task.Run();
|
| + }
|
| +}
|
| +
|
| +void LoaderController::Unlock() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + DCHECK_LT(0, lock_count_);
|
| +
|
| + if (--lock_count_ > 0)
|
| + return;
|
| +
|
| + std::vector<base::Closure> tasks;
|
| + tasks.swap(pending_tasks_);
|
| + for (size_t i = 0; i < tasks.size(); ++i)
|
| + tasks[i].Run();
|
| +}
|
| +
|
| ChangeListLoader::ChangeListLoader(
|
| base::SequencedTaskRunner* blocking_task_runner,
|
| ResourceMetadata* resource_metadata,
|
| JobScheduler* scheduler,
|
| - DriveServiceInterface* drive_service)
|
| + DriveServiceInterface* drive_service,
|
| + LoaderController* loader_controller)
|
| : blocking_task_runner_(blocking_task_runner),
|
| resource_metadata_(resource_metadata),
|
| scheduler_(scheduler),
|
| drive_service_(drive_service),
|
| - lock_count_(0),
|
| + loader_controller_(loader_controller),
|
| loaded_(false),
|
| weak_ptr_factory_(this) {
|
| }
|
| @@ -407,14 +451,6 @@ void ChangeListLoader::GetAboutResource(
|
| }
|
| }
|
|
|
| -scoped_ptr<base::ScopedClosureRunner> ChangeListLoader::GetLock() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - ++lock_count_;
|
| - return make_scoped_ptr(new base::ScopedClosureRunner(
|
| - base::Bind(&ChangeListLoader::Unlock,
|
| - weak_ptr_factory_.GetWeakPtr())));
|
| -}
|
| -
|
| void ChangeListLoader::LoadDirectoryIfNeededAfterGetEntry(
|
| const base::FilePath& directory_path,
|
| const FileOperationCallback& callback,
|
| @@ -763,7 +799,7 @@ void ChangeListLoader::LoadChangeListFromServerAfterLoadChangeList(
|
| util::Log(logging::LOG_INFO,
|
| "Apply change lists (is delta: %d)",
|
| is_delta_update);
|
| - ApplyChange(base::Bind(
|
| + loader_controller_->ScheduleRun(base::Bind(
|
| base::IgnoreResult(
|
| &base::PostTaskAndReplyWithResult<FileError, FileError>),
|
| blocking_task_runner_,
|
| @@ -873,7 +909,7 @@ void ChangeListLoader::LoadDirectoryFromServerAfterLoad(
|
| }
|
|
|
| base::FilePath* directory_path = new base::FilePath;
|
| - ApplyChange(base::Bind(
|
| + loader_controller_->ScheduleRun(base::Bind(
|
| base::IgnoreResult(
|
| &base::PostTaskAndReplyWithResult<FileError, FileError>),
|
| blocking_task_runner_,
|
| @@ -907,29 +943,6 @@ void ChangeListLoader::LoadDirectoryFromServerAfterRefresh(
|
| }
|
| }
|
|
|
| -void ChangeListLoader::ApplyChange(const base::Closure& closure) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - DCHECK(!closure.is_null());
|
| - if (lock_count_ > 0) {
|
| - pending_apply_closures_.push_back(closure);
|
| - } else {
|
| - closure.Run();
|
| - }
|
| -}
|
| -
|
| -void ChangeListLoader::Unlock() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - DCHECK_LT(0, lock_count_);
|
| -
|
| - if (--lock_count_ > 0)
|
| - return;
|
| -
|
| - std::vector<base::Closure> callbacks;
|
| - callbacks.swap(pending_apply_closures_);
|
| - for (size_t i = 0; i < callbacks.size(); ++i)
|
| - callbacks[i].Run();
|
| -}
|
| -
|
| void ChangeListLoader::UpdateAboutResource(
|
| const google_apis::AboutResourceCallback& callback) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|