diff options
author | hashimoto <hashimoto@chromium.org> | 2015-04-21 19:39:40 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-04-22 02:39:57 +0000 |
commit | 64ced6f9cbc4708963d671462a54bc7292a2dc2a (patch) | |
tree | 429827e2bfd29a2f24533c0b6618b09a596685a6 /chrome/browser/chromeos | |
parent | 2bcbc6bceb6017c762ef01553a55a12fe390de16 (diff) | |
download | chromium_src-64ced6f9cbc4708963d671462a54bc7292a2dc2a.zip chromium_src-64ced6f9cbc4708963d671462a54bc7292a2dc2a.tar.gz chromium_src-64ced6f9cbc4708963d671462a54bc7292a2dc2a.tar.bz2 |
Abort ChangeListProcessor::ApplyEntryMap on shutdown
BUG=477572
Review URL: https://codereview.chromium.org/1091213002
Cr-Commit-Position: refs/heads/master@{#326223}
Diffstat (limited to 'chrome/browser/chromeos')
5 files changed, 28 insertions, 7 deletions
diff --git a/chrome/browser/chromeos/drive/change_list_loader.cc b/chrome/browser/chromeos/drive/change_list_loader.cc index 081d9a7..143927a 100644 --- a/chrome/browser/chromeos/drive/change_list_loader.cc +++ b/chrome/browser/chromeos/drive/change_list_loader.cc @@ -10,6 +10,7 @@ #include "base/callback_helpers.h" #include "base/metrics/histogram.h" #include "base/strings/string_number_conversions.h" +#include "base/synchronization/cancellation_flag.h" #include "base/time/time.h" #include "chrome/browser/chromeos/drive/change_list_loader_observer.h" #include "chrome/browser/chromeos/drive/change_list_processor.h" @@ -294,6 +295,7 @@ ChangeListLoader::ChangeListLoader( LoaderController* loader_controller) : logger_(logger), blocking_task_runner_(blocking_task_runner), + in_shutdown_(new base::CancellationFlag), resource_metadata_(resource_metadata), scheduler_(scheduler), about_resource_loader_(about_resource_loader), @@ -303,6 +305,10 @@ ChangeListLoader::ChangeListLoader( } ChangeListLoader::~ChangeListLoader() { + in_shutdown_->Set(); + // Delete |in_shutdown_| with the blocking task runner so that it gets deleted + // after all active ChangeListProcessors. + blocking_task_runner_->DeleteSoon(FROM_HERE, in_shutdown_.release()); } bool ChangeListLoader::IsRefreshing() const { @@ -526,7 +532,7 @@ void ChangeListLoader::LoadChangeListFromServerAfterLoadChangeList( } ChangeListProcessor* change_list_processor = - new ChangeListProcessor(resource_metadata_); + new ChangeListProcessor(resource_metadata_, in_shutdown_.get()); // Don't send directory content change notification while performing // the initial content retrieval. const bool should_notify_changed_directories = is_delta_update; diff --git a/chrome/browser/chromeos/drive/change_list_loader.h b/chrome/browser/chromeos/drive/change_list_loader.h index 3486aa4..7bdac52 100644 --- a/chrome/browser/chromeos/drive/change_list_loader.h +++ b/chrome/browser/chromeos/drive/change_list_loader.h @@ -20,6 +20,7 @@ class GURL; namespace base { +class CancellationFlag; class ScopedClosureRunner; class SequencedTaskRunner; class Time; @@ -213,6 +214,7 @@ class ChangeListLoader { EventLogger* logger_; // Not owned. scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_; + scoped_ptr<base::CancellationFlag> in_shutdown_; ResourceMetadata* resource_metadata_; // Not owned. JobScheduler* scheduler_; // Not owned. AboutResourceLoader* about_resource_loader_; // Not owned. diff --git a/chrome/browser/chromeos/drive/change_list_processor.cc b/chrome/browser/chromeos/drive/change_list_processor.cc index fb4f46e..4f1b4ce 100644 --- a/chrome/browser/chromeos/drive/change_list_processor.cc +++ b/chrome/browser/chromeos/drive/change_list_processor.cc @@ -6,6 +6,7 @@ #include "base/metrics/histogram.h" #include "base/strings/string_number_conversions.h" +#include "base/synchronization/cancellation_flag.h" #include "chrome/browser/chromeos/drive/drive.pb.h" #include "chrome/browser/chromeos/drive/file_change.h" #include "chrome/browser/chromeos/drive/file_system_util.h" @@ -113,8 +114,11 @@ ChangeList::ChangeList(const google_apis::FileList& file_list) ChangeList::~ChangeList() {} -ChangeListProcessor::ChangeListProcessor(ResourceMetadata* resource_metadata) - : resource_metadata_(resource_metadata), changed_files_(new FileChange) { +ChangeListProcessor::ChangeListProcessor(ResourceMetadata* resource_metadata, + base::CancellationFlag* in_shutdown) + : resource_metadata_(resource_metadata), + in_shutdown_(in_shutdown), + changed_files_(new FileChange) { } ChangeListProcessor::~ChangeListProcessor() { @@ -230,6 +234,9 @@ FileError ChangeListProcessor::ApplyEntryMap( // Apply all entries except deleted ones to the metadata. std::vector<std::string> deleted_resource_ids; while (!entry_map_.empty()) { + if (in_shutdown_ && in_shutdown_->IsSet()) + return FILE_ERROR_ABORT; + ResourceEntryMap::iterator it = entry_map_.begin(); // Process deleted entries later to avoid deleting moved entries under it. diff --git a/chrome/browser/chromeos/drive/change_list_processor.h b/chrome/browser/chromeos/drive/change_list_processor.h index 61ecf65..83a056e 100644 --- a/chrome/browser/chromeos/drive/change_list_processor.h +++ b/chrome/browser/chromeos/drive/change_list_processor.h @@ -16,11 +16,15 @@ #include "chrome/browser/chromeos/drive/file_errors.h" #include "url/gurl.h" +namespace base { +class CancellationFlag; +} // namespace base + namespace google_apis { class AboutResource; class ChangeList; class FileList; -} // google_apis +} // namespace google_apis namespace drive { @@ -103,7 +107,8 @@ class ChangeList { // updates the resource metadata stored locally. class ChangeListProcessor { public: - explicit ChangeListProcessor(ResourceMetadata* resource_metadata); + ChangeListProcessor(ResourceMetadata* resource_metadata, + base::CancellationFlag* in_shutdown); ~ChangeListProcessor(); // Applies change lists or full resource lists to |resource_metadata_|. @@ -151,6 +156,7 @@ class ChangeListProcessor { void UpdateChangedDirs(const ResourceEntry& entry); ResourceMetadata* resource_metadata_; // Not owned. + base::CancellationFlag* in_shutdown_; // Not owned. ResourceEntryMap entry_map_; ParentResourceIdMap parent_resource_id_map_; diff --git a/chrome/browser/chromeos/drive/change_list_processor_unittest.cc b/chrome/browser/chromeos/drive/change_list_processor_unittest.cc index be3457c..5ba073e 100644 --- a/chrome/browser/chromeos/drive/change_list_processor_unittest.cc +++ b/chrome/browser/chromeos/drive/change_list_processor_unittest.cc @@ -126,7 +126,7 @@ class ChangeListProcessorTest : public testing::Test { about_resource->set_largest_change_id(kBaseResourceListChangestamp); about_resource->set_root_folder_id(kRootId); - ChangeListProcessor processor(metadata_.get()); + ChangeListProcessor processor(metadata_.get(), nullptr); return processor.Apply(about_resource.Pass(), changes.Pass(), false /* is_delta_update */); @@ -141,7 +141,7 @@ class ChangeListProcessorTest : public testing::Test { about_resource->set_largest_change_id(kBaseResourceListChangestamp); about_resource->set_root_folder_id(kRootId); - ChangeListProcessor processor(metadata_.get()); + ChangeListProcessor processor(metadata_.get(), nullptr); FileError error = processor.Apply(about_resource.Pass(), changes.Pass(), true /* is_delta_update */); |