Index: base/test/sequenced_task_runner_test_template.cc |
=================================================================== |
--- base/test/sequenced_task_runner_test_template.cc (revision 0) |
+++ base/test/sequenced_task_runner_test_template.cc (revision 0) |
@@ -0,0 +1,204 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/test/sequenced_task_runner_test_template.h" |
+ |
+namespace base { |
+ |
+SeqTaskTracker::TaskStatus::TaskStatus() |
+ : lock_(), |
+ claimed_(false), |
+ completed_(false), |
+ completed_set_(false), |
+ prev_completed_(false), |
+ prev_completed_set_(false) { |
+} |
+ |
+SeqTaskTracker::TaskStatus::TaskStatus(const TaskStatus& ts) |
+ : lock_(), |
+ claimed_(ts.claimed_), |
+ completed_(ts.completed_), |
+ completed_set_(ts.completed_set_), |
+ prev_completed_(ts.prev_completed_), |
+ prev_completed_set_(ts.prev_completed_set_) { |
+} |
+ |
+SeqTaskTracker::TaskStatus& SeqTaskTracker::TaskStatus::operator=( |
+ const TaskStatus& ts) { |
+ if (&ts == this) |
+ return *this; |
+ claimed_ = ts.claimed_; |
+ completed_ = ts.completed_; |
+ prev_completed_ = ts.prev_completed_; |
+ completed_set_ = ts.completed_set_; |
+ prev_completed_set_ = ts.prev_completed_set_; |
+ return *this; |
+} |
+ |
+bool SeqTaskTracker::TaskStatus::Claim() { |
+ AutoLock lock(lock_); |
+ if (claimed_) |
+ return false; |
+ claimed_ = true; |
+ return true; |
+} |
+ |
+bool SeqTaskTracker::TaskStatus::Completed() const { |
+ AutoLock lock(lock_); |
+ return completed_; |
+} |
+ |
+// Only called after the run has completed, so locking is not required. |
+bool SeqTaskTracker::TaskStatus::PrevCompletedBefore() const { |
+ return prev_completed_; |
+} |
+ |
+void SeqTaskTracker::TaskStatus::SetCompleted() { |
+ AutoLock lock(lock_); |
+ CHECK(!completed_set_); |
+ completed_ = true; |
+ completed_set_ = true; |
+} |
+ |
+void SeqTaskTracker::TaskStatus::SetPrevCompletedBefore(const bool b) { |
+ AutoLock lock(lock_); |
+ CHECK(!prev_completed_set_); |
+ prev_completed_ = b; |
+ prev_completed_set_ = true; |
+} |
+ |
+bool SeqTaskTracker::TaskStatus::operator==(const TaskStatus& ts) const { |
+ return (Completed() == ts.Completed() && |
+ PrevCompletedBefore() == ts.PrevCompletedBefore()); |
+} |
+ |
+std::ostream& operator<<(std::ostream& os, |
+ const SeqTaskTracker::TaskStatus& ts) { |
+ return os << "completed=" << std::boolalpha << ts.Completed() |
+ << "; prev_completed_before=" << ts.PrevCompletedBefore(); |
+} |
+ |
+SeqTaskTracker::SeqTaskTracker() { |
+} |
+ |
+SeqTaskTracker::~SeqTaskTracker() { |
+} |
+ |
+void SeqTaskTracker::SetNonNestableTaskCount( |
+ const std::size_t task_count) { |
+ non_nestable_statuses_.resize(task_count); |
+} |
+ |
+void SeqTaskTracker::SetNestableTaskCount( |
+ const std::size_t task_count) { |
+ nestable_statuses_.resize(task_count); |
+} |
+ |
+void SeqTaskTracker::FastNonNestableTask(int base_status_i) { |
+ const int i = ClaimNonNestableTaskStatus(base_status_i); |
+ DLOG(INFO) << "XXX FastNonNestableTask " << i << " STARTING"; |
+ non_nestable_statuses_[i].SetPrevCompletedBefore( |
+ i > 0 ? non_nestable_statuses_[i - 1].Completed() : true); |
+ non_nestable_statuses_[i].SetCompleted(); |
+ DLOG(INFO) << "XXX FastNonNestableTask " << i << " DONE"; |
+} |
+ |
+void SeqTaskTracker::FastNestableTask(int base_status_i) { |
+ const int i = ClaimNestableTaskStatus(base_status_i); |
+ DLOG(INFO) << "XXX FastNestableTask " << i << " STARTING"; |
+ nestable_statuses_[i].SetPrevCompletedBefore(true); |
+ nestable_statuses_[i].SetCompleted(); |
+ DLOG(INFO) << "XXX FastNestableTask " << i << " DONE"; |
+} |
+ |
+void SeqTaskTracker::SlowNonNestableTask(int base_status_i) { |
+ const int i = ClaimNonNestableTaskStatus(base_status_i); |
+ DLOG(INFO) << "XXX SlowNonNestableTask " << i << " STARTING"; |
+ non_nestable_statuses_[i].SetPrevCompletedBefore( |
+ i > 0 ? non_nestable_statuses_[i - 1].Completed() : true); |
+ base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1)); |
+ non_nestable_statuses_[i].SetCompleted(); |
+ DLOG(INFO) << "XXX SlowNonNestableTask " << i << " DONE"; |
+} |
+ |
+void SeqTaskTracker::PostFastNonNestableFromSlowNonNestable( |
+ scoped_refptr<SequencedTaskRunner> tr, |
+ const int base_status_i, |
+ const int child_count) { |
+ |
+ const int i = ClaimNonNestableTaskStatus(base_status_i); |
+ |
+ DLOG(INFO) << "XXX PostFastNonNestableFromSlowNonNestable " |
+ << i << " STARTING"; |
+ |
+ non_nestable_statuses_[i].SetPrevCompletedBefore( |
+ i > 0 ? non_nestable_statuses_[i - 1].Completed() : true); |
+ |
+ for (int j = 0; j < child_count; ++j) { |
+ Closure task = Bind(&SeqTaskTracker::FastNonNestableTask, this, i); |
+ tr->PostNonNestableTask(FROM_HERE, task); |
+ DLOG(INFO) << "XXX PostFastNonNestableFromSlowNonNestable " |
+ << i << " POSTED CHILD TASK " << (i + j); |
+ } |
+ non_nestable_statuses_[i].SetCompleted(); |
+ |
+ DLOG(INFO) << "XXX PostFastNonNestableFromSlowNonNestable " << i << " DONE"; |
+} |
+ |
+void SeqTaskTracker::PostFastNestableFromSlowNonNestable( |
+ scoped_refptr<SequencedTaskRunner> tr, |
+ const int base_status_i, |
+ const int child_count) { |
+ |
+ const int i = ClaimNonNestableTaskStatus(base_status_i); |
+ |
+ DLOG(INFO) << "XXX PostNestableFromSlowNonNestable " << i << " STARTING"; |
+ |
+ non_nestable_statuses_[i].SetPrevCompletedBefore( |
+ i > 0 ? non_nestable_statuses_[i - 1].Completed() : true); |
+ |
+ for (int j = 0; j < child_count; ++j) { |
+ const int child_i = i * child_count + j; |
+ Closure task = Bind(&SeqTaskTracker::FastNestableTask, |
+ this, |
+ child_i); |
+ DLOG(INFO) << "XXX PostNestableFromSlowNonNestable " << i |
+ << " POSTED CHILD " << child_i ; |
+ tr->PostTask(FROM_HERE, task); |
+ } |
+ non_nestable_statuses_[i].SetCompleted(); |
+ DLOG(INFO) << "XXX PostNestableFromSlowNonNestable " << i << " DONE"; |
+} |
+ |
+int SeqTaskTracker::ClaimNonNestableTaskStatus(const int search_from) { |
+ const int end = static_cast<int>(non_nestable_statuses_.size()); |
+ for (int i = search_from; i < end; ++i) { |
+ if (non_nestable_statuses_[i].Claim()) |
+ return i; |
+ } |
+ CHECK(false) << "Unable to find an unclaimed non-nestable task status slot"; |
+ return -1; |
+} |
+ |
+int SeqTaskTracker::ClaimNestableTaskStatus(const int search_from) { |
+ const int end = static_cast<int>(nestable_statuses_.size()); |
+ for (int i = search_from; i < end; ++i) { |
+ if (nestable_statuses_[i].Claim()) |
+ return i; |
+ } |
+ CHECK(false) << "Unable to find an unclaimed nestable task status slot"; |
+ return -1; |
+} |
+ |
+const SeqTaskTracker::TaskStatuses& SeqTaskTracker::GetNonNestableTaskStatuses( |
+) const { |
+ return non_nestable_statuses_; |
+} |
+ |
+const SeqTaskTracker::TaskStatuses& SeqTaskTracker::GetNestableTaskStatuses( |
+) const { |
+ return nestable_statuses_; |
+} |
+ |
+} // namespace base |
Property changes on: base/test/sequenced_task_runner_test_template.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |