diff options
author | tzik@chromium.org <tzik@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-02 07:50:03 +0000 |
---|---|---|
committer | tzik@chromium.org <tzik@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-02 07:50:03 +0000 |
commit | 458678932f4ed2455ebc6bae1709fd7ed96a1bf1 (patch) | |
tree | 3287d2cdd684e009d58065049e325cf5a9d05c8c | |
parent | f4c85de4aef3527a68dc6629f8b3fbd7acd3b7a1 (diff) | |
download | chromium_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
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_; |