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