Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/task/cancelable_task_tracker.h" | 5 #include "base/task/cancelable_task_tracker.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 65 CancelableTaskTracker::~CancelableTaskTracker() { | 65 CancelableTaskTracker::~CancelableTaskTracker() { |
| 66 DCHECK(thread_checker_.CalledOnValidThread()); | 66 DCHECK(thread_checker_.CalledOnValidThread()); |
| 67 | 67 |
| 68 TryCancelAll(); | 68 TryCancelAll(); |
| 69 } | 69 } |
| 70 | 70 |
| 71 CancelableTaskTracker::TaskId CancelableTaskTracker::PostTask( | 71 CancelableTaskTracker::TaskId CancelableTaskTracker::PostTask( |
| 72 TaskRunner* task_runner, | 72 TaskRunner* task_runner, |
| 73 const tracked_objects::Location& from_here, | 73 const tracked_objects::Location& from_here, |
| 74 const Closure& task) { | 74 const Closure& task) { |
| 75 DCHECK(thread_checker_.CalledOnValidThread()); | 75 return PostDelayedTaskAndReply(task_runner, from_here, task, |
| 76 Bind(&base::DoNothing), TimeDelta()); | |
| 77 } | |
| 76 | 78 |
| 77 return PostTaskAndReply(task_runner, from_here, task, Bind(&base::DoNothing)); | 79 CancelableTaskTracker::TaskId CancelableTaskTracker::PostDelayedTask( |
| 80 TaskRunner* task_runner, | |
| 81 const tracked_objects::Location& from_here, | |
| 82 const Closure& task, | |
| 83 TimeDelta delay) { | |
| 84 return PostDelayedTaskAndReply(task_runner, from_here, task, | |
| 85 Bind(&base::DoNothing), TimeDelta()); | |
| 78 } | 86 } |
| 79 | 87 |
| 80 CancelableTaskTracker::TaskId CancelableTaskTracker::PostTaskAndReply( | 88 CancelableTaskTracker::TaskId CancelableTaskTracker::PostTaskAndReply( |
| 81 TaskRunner* task_runner, | 89 TaskRunner* task_runner, |
| 82 const tracked_objects::Location& from_here, | 90 const tracked_objects::Location& from_here, |
| 83 const Closure& task, | 91 const Closure& task, |
| 84 const Closure& reply) { | 92 const Closure& reply) { |
| 85 DCHECK(thread_checker_.CalledOnValidThread()); | 93 return PostDelayedTaskAndReply(task_runner, from_here, task, reply, |
| 86 | 94 TimeDelta()); |
| 87 // We need a MessageLoop to run reply. | |
| 88 DCHECK(base::MessageLoopProxy::current().get()); | |
| 89 | |
| 90 // Owned by reply callback below. | |
| 91 CancellationFlag* flag = new CancellationFlag(); | |
| 92 | |
| 93 TaskId id = next_id_; | |
| 94 next_id_++; // int64 is big enough that we ignore the potential overflow. | |
| 95 | |
| 96 const Closure& untrack_closure = | |
| 97 Bind(&CancelableTaskTracker::Untrack, weak_factory_.GetWeakPtr(), id); | |
| 98 bool success = | |
| 99 task_runner->PostTaskAndReply(from_here, | |
| 100 Bind(&RunIfNotCanceled, flag, task), | |
| 101 Bind(&RunIfNotCanceledThenUntrack, | |
| 102 base::Owned(flag), | |
| 103 reply, | |
| 104 untrack_closure)); | |
| 105 | |
| 106 if (!success) | |
| 107 return kBadTaskId; | |
| 108 | |
| 109 Track(id, flag); | |
| 110 return id; | |
| 111 } | 95 } |
| 112 | 96 |
| 113 CancelableTaskTracker::TaskId CancelableTaskTracker::NewTrackedTaskId( | 97 CancelableTaskTracker::TaskId CancelableTaskTracker::NewTrackedTaskId( |
| 114 IsCanceledCallback* is_canceled_cb) { | 98 IsCanceledCallback* is_canceled_cb) { |
| 115 DCHECK(thread_checker_.CalledOnValidThread()); | 99 DCHECK(thread_checker_.CalledOnValidThread()); |
| 116 DCHECK(base::MessageLoopProxy::current().get()); | 100 DCHECK(base::MessageLoopProxy::current().get()); |
| 117 | 101 |
| 118 TaskId id = next_id_; | 102 TaskId id = next_id_; |
| 119 next_id_++; // int64 is big enough that we ignore the potential overflow. | 103 next_id_++; // int64 is big enough that we ignore the potential overflow. |
| 120 | 104 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 177 bool success = task_flags_.insert(std::make_pair(id, flag)).second; | 161 bool success = task_flags_.insert(std::make_pair(id, flag)).second; |
| 178 DCHECK(success); | 162 DCHECK(success); |
| 179 } | 163 } |
| 180 | 164 |
| 181 void CancelableTaskTracker::Untrack(TaskId id) { | 165 void CancelableTaskTracker::Untrack(TaskId id) { |
| 182 DCHECK(thread_checker_.CalledOnValidThread()); | 166 DCHECK(thread_checker_.CalledOnValidThread()); |
| 183 size_t num = task_flags_.erase(id); | 167 size_t num = task_flags_.erase(id); |
| 184 DCHECK_EQ(1u, num); | 168 DCHECK_EQ(1u, num); |
| 185 } | 169 } |
| 186 | 170 |
| 171 CancelableTaskTracker::TaskId CancelableTaskTracker::PostDelayedTaskAndReply( | |
| 172 TaskRunner* task_runner, | |
| 173 const tracked_objects::Location& from_here, | |
| 174 const Closure& task, | |
| 175 const Closure& reply, | |
| 176 TimeDelta delay) { | |
| 177 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 178 | |
| 179 // We need a MessageLoop to run reply. | |
| 180 DCHECK(base::MessageLoopProxy::current().get()); | |
|
tzik
2015/04/01 06:17:53
Can we use ThreadTaskRunnerHandle::Get() here?
Takashi Toyoshima
2015/04/01 06:51:32
Done.
| |
| 181 | |
| 182 // Owned by reply callback below. | |
| 183 CancellationFlag* flag = new CancellationFlag(); | |
| 184 | |
| 185 TaskId id = next_id_; | |
| 186 next_id_++; // int64 is big enough that we ignore the potential overflow. | |
| 187 | |
| 188 const Closure& untrack_closure = | |
| 189 Bind(&CancelableTaskTracker::Untrack, weak_factory_.GetWeakPtr(), id); | |
| 190 bool success = | |
| 191 task_runner->PostDelayedTaskAndReply(from_here, | |
| 192 Bind(&RunIfNotCanceled, flag, task), | |
| 193 Bind(&RunIfNotCanceledThenUntrack, | |
| 194 base::Owned(flag), | |
| 195 reply, | |
| 196 untrack_closure), | |
| 197 delay); | |
| 198 | |
| 199 if (!success) | |
| 200 return kBadTaskId; | |
| 201 | |
| 202 Track(id, flag); | |
| 203 return id; | |
| 204 } | |
| 205 | |
| 187 } // namespace base | 206 } // namespace base |
| OLD | NEW |