summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos
diff options
context:
space:
mode:
authorhashimoto <hashimoto@chromium.org>2015-04-21 19:39:40 -0700
committerCommit bot <commit-bot@chromium.org>2015-04-22 02:39:57 +0000
commit64ced6f9cbc4708963d671462a54bc7292a2dc2a (patch)
tree429827e2bfd29a2f24533c0b6618b09a596685a6 /chrome/browser/chromeos
parent2bcbc6bceb6017c762ef01553a55a12fe390de16 (diff)
downloadchromium_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')
-rw-r--r--chrome/browser/chromeos/drive/change_list_loader.cc8
-rw-r--r--chrome/browser/chromeos/drive/change_list_loader.h2
-rw-r--r--chrome/browser/chromeos/drive/change_list_processor.cc11
-rw-r--r--chrome/browser/chromeos/drive/change_list_processor.h10
-rw-r--r--chrome/browser/chromeos/drive/change_list_processor_unittest.cc4
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 */);