summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortzik@chromium.org <tzik@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-02 07:50:03 +0000
committertzik@chromium.org <tzik@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-02 07:50:03 +0000
commit458678932f4ed2455ebc6bae1709fd7ed96a1bf1 (patch)
tree3287d2cdd684e009d58065049e325cf5a9d05c8c
parentf4c85de4aef3527a68dc6629f8b3fbd7acd3b7a1 (diff)
downloadchromium_src-458678932f4ed2455ebc6bae1709fd7ed96a1bf1.zip
chromium_src-458678932f4ed2455ebc6bae1709fd7ed96a1bf1.tar.gz
chromium_src-458678932f4ed2455ebc6bae1709fd7ed96a1bf1.tar.bz2
[SyncFS] Check thread in SyncTaskToken before regenerating Token
Token regerenration causes DCHECK failure on shutdown phase. BUG=347425 Review URL: https://codereview.chromium.org/367603003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@280979 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/sync_file_system/drive_backend/sync_task_manager.cc6
-rw-r--r--chrome/browser/sync_file_system/drive_backend/sync_task_token.cc14
-rw-r--r--chrome/browser/sync_file_system/drive_backend/sync_task_token.h6
3 files changed, 20 insertions, 6 deletions
diff --git a/chrome/browser/sync_file_system/drive_backend/sync_task_manager.cc b/chrome/browser/sync_file_system/drive_backend/sync_task_manager.cc
index 00cabd2..6cc5896 100644
--- a/chrome/browser/sync_file_system/drive_backend/sync_task_manager.cc
+++ b/chrome/browser/sync_file_system/drive_backend/sync_task_manager.cc
@@ -71,8 +71,9 @@ SyncTaskManager::~SyncTaskManager() {
void SyncTaskManager::Initialize(SyncStatusCode status) {
DCHECK(sequence_checker_.CalledOnValidSequencedThread());
DCHECK(!token_);
- NotifyTaskDone(SyncTaskToken::CreateForForegroundTask(AsWeakPtr()),
- status);
+ NotifyTaskDone(
+ SyncTaskToken::CreateForForegroundTask(AsWeakPtr(), task_runner_),
+ status);
}
void SyncTaskManager::ScheduleTask(
@@ -328,6 +329,7 @@ void SyncTaskManager::UpdateBlockingFactorBody(
background_task_token =
SyncTaskToken::CreateForBackgroundTask(
AsWeakPtr(),
+ task_runner_,
task_token_seq_++,
blocking_factor.Pass());
background_task_token->UpdateTask(from_here, callback);
diff --git a/chrome/browser/sync_file_system/drive_backend/sync_task_token.cc b/chrome/browser/sync_file_system/drive_backend/sync_task_token.cc
index ffd8ca8..2473e81 100644
--- a/chrome/browser/sync_file_system/drive_backend/sync_task_token.cc
+++ b/chrome/browser/sync_file_system/drive_backend/sync_task_token.cc
@@ -21,6 +21,7 @@ scoped_ptr<SyncTaskToken> SyncTaskToken::CreateForTesting(
const SyncStatusCallback& callback) {
return make_scoped_ptr(new SyncTaskToken(
base::WeakPtr<SyncTaskManager>(),
+ base::MessageLoopProxy::current(),
kTestingTaskTokenID,
scoped_ptr<BlockingFactor>(),
callback));
@@ -28,9 +29,11 @@ scoped_ptr<SyncTaskToken> SyncTaskToken::CreateForTesting(
// static
scoped_ptr<SyncTaskToken> SyncTaskToken::CreateForForegroundTask(
- const base::WeakPtr<SyncTaskManager>& manager) {
+ const base::WeakPtr<SyncTaskManager>& manager,
+ base::SequencedTaskRunner* task_runner) {
return make_scoped_ptr(new SyncTaskToken(
manager,
+ task_runner,
kForegroundTaskTokenID,
scoped_ptr<BlockingFactor>(),
SyncStatusCallback()));
@@ -39,10 +42,12 @@ scoped_ptr<SyncTaskToken> SyncTaskToken::CreateForForegroundTask(
// static
scoped_ptr<SyncTaskToken> SyncTaskToken::CreateForBackgroundTask(
const base::WeakPtr<SyncTaskManager>& manager,
+ base::SequencedTaskRunner* task_runner,
int64 token_id,
scoped_ptr<BlockingFactor> blocking_factor) {
return make_scoped_ptr(new SyncTaskToken(
manager,
+ task_runner,
token_id,
blocking_factor.Pass(),
SyncStatusCallback()));
@@ -62,14 +67,15 @@ SyncTaskToken::~SyncTaskToken() {
// it must return the token to TaskManager.
// Destroying a token with valid |client| indicates the token was
// dropped by a task without returning.
- if (manager_.get() && manager_->IsRunningTask(token_id_)) {
+ if (task_runner_ && task_runner_->RunsTasksOnCurrentThread() &&
+ manager_ && manager_->IsRunningTask(token_id_)) {
NOTREACHED()
<< "Unexpected TaskToken deletion from: " << location_.ToString();
// Reinitializes the token.
SyncTaskManager::NotifyTaskDone(
make_scoped_ptr(new SyncTaskToken(
- manager_, token_id_, blocking_factor_.Pass(),
+ manager_, task_runner_, token_id_, blocking_factor_.Pass(),
SyncStatusCallback())),
SYNC_STATUS_OK);
}
@@ -130,10 +136,12 @@ scoped_ptr<TaskLogger::TaskLog> SyncTaskToken::PassTaskLog() {
}
SyncTaskToken::SyncTaskToken(const base::WeakPtr<SyncTaskManager>& manager,
+ base::SequencedTaskRunner* task_runner,
int64 token_id,
scoped_ptr<BlockingFactor> blocking_factor,
const SyncStatusCallback& callback)
: manager_(manager),
+ task_runner_(task_runner),
token_id_(token_id),
callback_(callback),
blocking_factor_(blocking_factor.Pass()) {
diff --git a/chrome/browser/sync_file_system/drive_backend/sync_task_token.h b/chrome/browser/sync_file_system/drive_backend/sync_task_token.h
index c6e7ed0e..ae11b69 100644
--- a/chrome/browser/sync_file_system/drive_backend/sync_task_token.h
+++ b/chrome/browser/sync_file_system/drive_backend/sync_task_token.h
@@ -29,9 +29,11 @@ class SyncTaskToken {
static scoped_ptr<SyncTaskToken> CreateForTesting(
const SyncStatusCallback& callback);
static scoped_ptr<SyncTaskToken> CreateForForegroundTask(
- const base::WeakPtr<SyncTaskManager>& manager);
+ const base::WeakPtr<SyncTaskManager>& manager,
+ base::SequencedTaskRunner* task_runner);
static scoped_ptr<SyncTaskToken> CreateForBackgroundTask(
const base::WeakPtr<SyncTaskManager>& manager,
+ base::SequencedTaskRunner* task_runner,
int64 token_id,
scoped_ptr<BlockingFactor> blocking_factor);
@@ -64,11 +66,13 @@ class SyncTaskToken {
private:
SyncTaskToken(const base::WeakPtr<SyncTaskManager>& manager,
+ base::SequencedTaskRunner* task_runner,
int64 token_id,
scoped_ptr<BlockingFactor> blocking_factor,
const SyncStatusCallback& callback);
base::WeakPtr<SyncTaskManager> manager_;
+ scoped_refptr<base::SequencedTaskRunner> task_runner_;
tracked_objects::Location location_;
int64 token_id_;
SyncStatusCallback callback_;