sync_task_token.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/sync_file_system/drive_backend/sync_task_token.h"
6
7#include "base/bind.h"
8#include "base/debug/trace_event.h"
9#include "chrome/browser/sync_file_system/drive_backend/sync_task_manager.h"
10#include "chrome/browser/sync_file_system/drive_backend/task_dependency_manager.h"
11
12namespace sync_file_system {
13namespace drive_backend {
14
15const int64 SyncTaskToken::kTestingTaskTokenID = -1;
16const int64 SyncTaskToken::kForegroundTaskTokenID = 0;
17const int64 SyncTaskToken::kMinimumBackgroundTaskTokenID = 1;
18
19// static
20scoped_ptr<SyncTaskToken> SyncTaskToken::CreateForTesting(
21    const SyncStatusCallback& callback) {
22  return make_scoped_ptr(new SyncTaskToken(
23      base::WeakPtr<SyncTaskManager>(),
24      kTestingTaskTokenID,
25      scoped_ptr<BlockingFactor>(),
26      callback));
27}
28
29// static
30scoped_ptr<SyncTaskToken> SyncTaskToken::CreateForForegroundTask(
31    const base::WeakPtr<SyncTaskManager>& manager) {
32  return make_scoped_ptr(new SyncTaskToken(
33      manager,
34      kForegroundTaskTokenID,
35      scoped_ptr<BlockingFactor>(),
36      SyncStatusCallback()));
37}
38
39// static
40scoped_ptr<SyncTaskToken> SyncTaskToken::CreateForBackgroundTask(
41    const base::WeakPtr<SyncTaskManager>& manager,
42    int64 token_id,
43    scoped_ptr<BlockingFactor> blocking_factor) {
44  return make_scoped_ptr(new SyncTaskToken(
45      manager,
46      token_id,
47      blocking_factor.Pass(),
48      SyncStatusCallback()));
49}
50
51void SyncTaskToken::UpdateTask(const tracked_objects::Location& location,
52                               const SyncStatusCallback& callback) {
53  DCHECK(callback_.is_null());
54  location_ = location;
55  callback_ = callback;
56  DVLOG(2) << "Token updated: " << location_.ToString();
57}
58
59SyncTaskToken::~SyncTaskToken() {
60  // All task on Client must hold TaskToken instance to ensure
61  // no other tasks are running. Also, as soon as a task finishes to work,
62  // it must return the token to TaskManager.
63  // Destroying a token with valid |client| indicates the token was
64  // dropped by a task without returning.
65  if (manager_.get() && manager_->IsRunningTask(token_id_)) {
66    NOTREACHED()
67        << "Unexpected TaskToken deletion from: " << location_.ToString();
68
69    // Reinitializes the token.
70    SyncTaskManager::NotifyTaskDone(
71        make_scoped_ptr(new SyncTaskToken(
72            manager_, token_id_, blocking_factor_.Pass(),
73            SyncStatusCallback())),
74        SYNC_STATUS_OK);
75  }
76}
77
78// static
79SyncStatusCallback SyncTaskToken::WrapToCallback(
80    scoped_ptr<SyncTaskToken> token) {
81  return base::Bind(&SyncTaskManager::NotifyTaskDone, base::Passed(&token));
82}
83
84void SyncTaskToken::set_blocking_factor(
85    scoped_ptr<BlockingFactor> blocking_factor) {
86  blocking_factor_ = blocking_factor.Pass();
87}
88
89const BlockingFactor* SyncTaskToken::blocking_factor() const {
90  return blocking_factor_.get();
91}
92
93void SyncTaskToken::clear_blocking_factor() {
94  blocking_factor_.reset();
95}
96
97void SyncTaskToken::InitializeTaskLog(const std::string& task_description) {
98  task_log_.reset(new TaskLogger::TaskLog);
99  task_log_->start_time = base::TimeTicks::Now();
100  task_log_->task_description = task_description;
101
102  TRACE_EVENT_ASYNC_BEGIN1(
103      TRACE_DISABLED_BY_DEFAULT("SyncFileSystem"),
104      "SyncTask", task_log_->log_id,
105      "task_description", task_description);
106}
107
108void SyncTaskToken::FinalizeTaskLog(const std::string& result_description) {
109  TRACE_EVENT_ASYNC_END1(
110      TRACE_DISABLED_BY_DEFAULT("SyncFileSystem"),
111      "SyncTask", task_log_->log_id,
112      "result_description", result_description);
113
114  DCHECK(task_log_);
115  task_log_->result_description = result_description;
116  task_log_->end_time = base::TimeTicks::Now();
117}
118
119void SyncTaskToken::RecordLog(const std::string& message) {
120  DCHECK(task_log_);
121  task_log_->details.push_back(message);
122}
123
124void SyncTaskToken::SetTaskLog(scoped_ptr<TaskLogger::TaskLog> task_log) {
125  task_log_ = task_log.Pass();
126}
127
128scoped_ptr<TaskLogger::TaskLog> SyncTaskToken::PassTaskLog() {
129  return task_log_.Pass();
130}
131
132SyncTaskToken::SyncTaskToken(const base::WeakPtr<SyncTaskManager>& manager,
133                             int64 token_id,
134                             scoped_ptr<BlockingFactor> blocking_factor,
135                             const SyncStatusCallback& callback)
136    : manager_(manager),
137      token_id_(token_id),
138      callback_(callback),
139      blocking_factor_(blocking_factor.Pass()) {
140}
141
142}  // namespace drive_backend
143}  // namespace sync_file_system
144