sync_task_token.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved. 25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be 35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file. 45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/sync_file_system/drive_backend/sync_task_token.h" 65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/bind.h" 85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/sync_file_system/drive_backend/sync_task_manager.h" 95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/sync_file_system/drive_backend/task_dependency_manager.h" 1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace sync_file_system { 126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace drive_backend { 135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst int64 SyncTaskToken::kTestingTaskTokenID = -1; 155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst int64 SyncTaskToken::kForegroundTaskTokenID = 0; 165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuconst int64 SyncTaskToken::kMinimumBackgroundTaskTokenID = 1; 175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// static 195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuscoped_ptr<SyncTaskToken> SyncTaskToken::CreateForTesting( 205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const SyncStatusCallback& callback) { 215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return make_scoped_ptr(new SyncTaskToken( 225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::WeakPtr<SyncTaskManager>(), 235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu kTestingTaskTokenID, 245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<BlockingFactor>(), 255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu callback)); 265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// static 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuscoped_ptr<SyncTaskToken> SyncTaskToken::CreateForForegroundTask( 305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const base::WeakPtr<SyncTaskManager>& manager) { 315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return make_scoped_ptr(new SyncTaskToken( 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu manager, 335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu kForegroundTaskTokenID, 345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<BlockingFactor>(), 355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SyncStatusCallback())); 365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// static 395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuscoped_ptr<SyncTaskToken> SyncTaskToken::CreateForBackgroundTask( 405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const base::WeakPtr<SyncTaskManager>& manager, 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int64 token_id, 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<BlockingFactor> blocking_factor) { 435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return make_scoped_ptr(new SyncTaskToken( 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu manager, 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu token_id, 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu blocking_factor.Pass(), 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SyncStatusCallback())); 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid SyncTaskToken::UpdateTask(const tracked_objects::Location& location, 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const SyncStatusCallback& callback) { 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(callback_.is_null()); 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu location_ = location; 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu callback_ = callback; 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DVLOG(2) << "Token updated: " << location_.ToString(); 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuSyncTaskToken::~SyncTaskToken() { 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // All task on Client must hold TaskToken instance to ensure 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // no other tasks are running. Also, as soon as a task finishes to work, 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // it must return the token to TaskManager. 625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Destroying a token with valid |client| indicates the token was 635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // dropped by a task without returning. 645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (manager_.get() && manager_->IsRunningTask(token_id_)) { 6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) NOTREACHED() 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu << "Unexpected TaskToken deletion from: " << location_.ToString(); 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Reinitializes the token. 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SyncTaskManager::NotifyTaskDone( 7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) make_scoped_ptr(new SyncTaskToken( 7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) manager_, token_id_, blocking_factor_.Pass(), 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SyncStatusCallback())), 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu SYNC_STATUS_OK); 745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// static 785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuSyncStatusCallback SyncTaskToken::WrapToCallback( 7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<SyncTaskToken> token) { 805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return base::Bind(&SyncTaskManager::NotifyTaskDone, base::Passed(&token)); 815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void SyncTaskToken::set_blocking_factor( 8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<BlockingFactor> blocking_factor) { 8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) blocking_factor_ = blocking_factor.Pass(); 8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const BlockingFactor* SyncTaskToken::blocking_factor() const { 8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return blocking_factor_.get(); 9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void SyncTaskToken::clear_blocking_factor() { 9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) blocking_factor_.reset(); 9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void SyncTaskToken::InitializeTaskLog(const std::string& task_description) { 9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) task_log_.reset(new TaskLogger::TaskLog); 9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) task_log_->start_time = base::TimeTicks::Now(); 9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) task_log_->task_description = task_description; 10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void SyncTaskToken::FinalizeTaskLog(const std::string& result_description) { 10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(task_log_); 10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) task_log_->result_description = result_description; 10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) task_log_->end_time = base::TimeTicks::Now(); 10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void SyncTaskToken::RecordLog(const std::string& message) { 10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(task_log_); 11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) task_log_->details.push_back(message); 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid SyncTaskToken::SetTaskLog(scoped_ptr<TaskLogger::TaskLog> task_log) { 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch task_log_ = task_log.Pass(); 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdochscoped_ptr<TaskLogger::TaskLog> SyncTaskToken::PassTaskLog() { 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return task_log_.Pass(); 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)SyncTaskToken::SyncTaskToken(const base::WeakPtr<SyncTaskManager>& manager, 12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int64 token_id, 12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<BlockingFactor> blocking_factor, 12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const SyncStatusCallback& callback) 12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) : manager_(manager), 12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) token_id_(token_id), 12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) callback_(callback), 12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) blocking_factor_(blocking_factor.Pass()) { 12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace drive_backend 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace sync_file_system 1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)