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.
5 #include "chrome/browser/sync_file_system/drive_backend/sync_task_token.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"
13 namespace sync_file_system {
14 namespace drive_backend {
16 const int64 SyncTaskToken::kTestingTaskTokenID = -1;
17 const int64 SyncTaskToken::kForegroundTaskTokenID = 0;
18 const int64 SyncTaskToken::kMinimumBackgroundTaskTokenID = 1;
21 scoped_ptr<SyncTaskToken> SyncTaskToken::CreateForTesting(
22 const SyncStatusCallback& callback) {
23 return make_scoped_ptr(new SyncTaskToken(
24 base::WeakPtr<SyncTaskManager>(),
25 base::ThreadTaskRunnerHandle::Get(),
27 scoped_ptr<TaskBlocker>(),
32 scoped_ptr<SyncTaskToken> SyncTaskToken::CreateForForegroundTask(
33 const base::WeakPtr<SyncTaskManager>& manager,
34 base::SequencedTaskRunner* task_runner) {
35 return make_scoped_ptr(new SyncTaskToken(
38 kForegroundTaskTokenID,
39 scoped_ptr<TaskBlocker>(),
40 SyncStatusCallback()));
44 scoped_ptr<SyncTaskToken> SyncTaskToken::CreateForBackgroundTask(
45 const base::WeakPtr<SyncTaskManager>& manager,
46 base::SequencedTaskRunner* task_runner,
48 scoped_ptr<TaskBlocker> task_blocker) {
49 return make_scoped_ptr(new SyncTaskToken(
54 SyncStatusCallback()));
57 void SyncTaskToken::UpdateTask(const tracked_objects::Location& location,
58 const SyncStatusCallback& callback) {
59 DCHECK(callback_.is_null());
62 DVLOG(2) << "Token updated: " << location_.ToString();
65 SyncTaskToken::~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_)) {
74 << "Unexpected TaskToken deletion from: " << location_.ToString();
76 // Reinitializes the token.
77 SyncTaskManager::NotifyTaskDone(
78 make_scoped_ptr(new SyncTaskToken(manager_,
82 SyncStatusCallback())),
88 SyncStatusCallback SyncTaskToken::WrapToCallback(
89 scoped_ptr<SyncTaskToken> token) {
90 return base::Bind(&SyncTaskManager::NotifyTaskDone, base::Passed(&token));
93 void SyncTaskToken::set_task_blocker(
94 scoped_ptr<TaskBlocker> task_blocker) {
95 task_blocker_ = task_blocker.Pass();
98 const TaskBlocker* SyncTaskToken::task_blocker() const {
99 return task_blocker_.get();
102 void SyncTaskToken::clear_task_blocker() {
103 task_blocker_.reset();
106 void 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;
111 TRACE_EVENT_ASYNC_BEGIN1(
112 TRACE_DISABLED_BY_DEFAULT("SyncFileSystem"),
113 "SyncTask", task_log_->log_id,
114 "task_description", task_description);
117 void 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);
124 task_log_->result_description = result_description;
125 task_log_->end_time = base::TimeTicks::Now();
128 void SyncTaskToken::RecordLog(const std::string& message) {
130 task_log_->details.push_back(message);
133 void SyncTaskToken::SetTaskLog(scoped_ptr<TaskLogger::TaskLog> task_log) {
134 task_log_ = task_log.Pass();
137 scoped_ptr<TaskLogger::TaskLog> SyncTaskToken::PassTaskLog() {
138 return task_log_.Pass();
141 SyncTaskToken::SyncTaskToken(
142 const base::WeakPtr<SyncTaskManager>& manager,
143 const scoped_refptr<base::SequencedTaskRunner>& task_runner,
145 scoped_ptr<TaskBlocker> task_blocker,
146 const SyncStatusCallback& callback)
148 task_runner_(task_runner),
151 task_blocker_(task_blocker.Pass()) {
154 } // namespace drive_backend
155 } // namespace sync_file_system