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)