Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(390)

Side by Side Diff: base/test/sequenced_task_runner_test_template.cc

Issue 9663075: Implementation of SequencedTaskRunner based on SequencedWorkerPool. (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
1 // Copyright (c) 2012 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 "base/test/sequenced_task_runner_test_template.h"
6
7 namespace base {
8
9 SeqTaskTracker::TaskStatus::TaskStatus()
10 : lock_(),
11 claimed_(false),
12 completed_(false),
13 completed_set_(false),
14 prev_completed_(false),
15 prev_completed_set_(false) {
16 }
17
18 SeqTaskTracker::TaskStatus::TaskStatus(const TaskStatus& ts)
19 : lock_(),
20 claimed_(ts.claimed_),
21 completed_(ts.completed_),
22 completed_set_(ts.completed_set_),
23 prev_completed_(ts.prev_completed_),
24 prev_completed_set_(ts.prev_completed_set_) {
25 }
26
27 SeqTaskTracker::TaskStatus& SeqTaskTracker::TaskStatus::operator=(
28 const TaskStatus& ts) {
29 if (&ts == this)
30 return *this;
31 claimed_ = ts.claimed_;
32 completed_ = ts.completed_;
33 prev_completed_ = ts.prev_completed_;
34 completed_set_ = ts.completed_set_;
35 prev_completed_set_ = ts.prev_completed_set_;
36 return *this;
37 }
38
39 bool SeqTaskTracker::TaskStatus::Claim() {
40 AutoLock lock(lock_);
41 if (claimed_)
42 return false;
43 claimed_ = true;
44 return true;
45 }
46
47 bool SeqTaskTracker::TaskStatus::Completed() const {
48 AutoLock lock(lock_);
49 return completed_;
50 }
51
52 // Only called after the run has completed, so locking is not required.
53 bool SeqTaskTracker::TaskStatus::PrevCompletedBefore() const {
54 return prev_completed_;
55 }
56
57 void SeqTaskTracker::TaskStatus::SetCompleted() {
58 AutoLock lock(lock_);
59 CHECK(!completed_set_);
60 completed_ = true;
61 completed_set_ = true;
62 }
63
64 void SeqTaskTracker::TaskStatus::SetPrevCompletedBefore(const bool b) {
65 AutoLock lock(lock_);
66 CHECK(!prev_completed_set_);
67 prev_completed_ = b;
68 prev_completed_set_ = true;
69 }
70
71 bool SeqTaskTracker::TaskStatus::operator==(const TaskStatus& ts) const {
72 return (Completed() == ts.Completed() &&
73 PrevCompletedBefore() == ts.PrevCompletedBefore());
74 }
75
76 std::ostream& operator<<(std::ostream& os,
77 const SeqTaskTracker::TaskStatus& ts) {
78 return os << "completed=" << std::boolalpha << ts.Completed()
79 << "; prev_completed_before=" << ts.PrevCompletedBefore();
80 }
81
82 SeqTaskTracker::SeqTaskTracker() {
83 }
84
85 SeqTaskTracker::~SeqTaskTracker() {
86 }
87
88 void SeqTaskTracker::SetNonNestableTaskCount(
89 const std::size_t task_count) {
90 non_nestable_statuses_.resize(task_count);
91 }
92
93 void SeqTaskTracker::SetNestableTaskCount(
94 const std::size_t task_count) {
95 nestable_statuses_.resize(task_count);
96 }
97
98 void SeqTaskTracker::FastNonNestableTask(int base_status_i) {
99 const int i = ClaimNonNestableTaskStatus(base_status_i);
100 DLOG(INFO) << "XXX FastNonNestableTask " << i << " STARTING";
101 non_nestable_statuses_[i].SetPrevCompletedBefore(
102 i > 0 ? non_nestable_statuses_[i - 1].Completed() : true);
103 non_nestable_statuses_[i].SetCompleted();
104 DLOG(INFO) << "XXX FastNonNestableTask " << i << " DONE";
105 }
106
107 void SeqTaskTracker::FastNestableTask(int base_status_i) {
108 const int i = ClaimNestableTaskStatus(base_status_i);
109 DLOG(INFO) << "XXX FastNestableTask " << i << " STARTING";
110 nestable_statuses_[i].SetPrevCompletedBefore(true);
111 nestable_statuses_[i].SetCompleted();
112 DLOG(INFO) << "XXX FastNestableTask " << i << " DONE";
113 }
114
115 void SeqTaskTracker::SlowNonNestableTask(int base_status_i) {
116 const int i = ClaimNonNestableTaskStatus(base_status_i);
117 DLOG(INFO) << "XXX SlowNonNestableTask " << i << " STARTING";
118 non_nestable_statuses_[i].SetPrevCompletedBefore(
119 i > 0 ? non_nestable_statuses_[i - 1].Completed() : true);
120 base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1));
121 non_nestable_statuses_[i].SetCompleted();
122 DLOG(INFO) << "XXX SlowNonNestableTask " << i << " DONE";
123 }
124
125 void SeqTaskTracker::PostFastNonNestableFromSlowNonNestable(
126 scoped_refptr<SequencedTaskRunner> tr,
127 const int base_status_i,
128 const int child_count) {
129
130 const int i = ClaimNonNestableTaskStatus(base_status_i);
131
132 DLOG(INFO) << "XXX PostFastNonNestableFromSlowNonNestable "
133 << i << " STARTING";
134
135 non_nestable_statuses_[i].SetPrevCompletedBefore(
136 i > 0 ? non_nestable_statuses_[i - 1].Completed() : true);
137
138 for (int j = 0; j < child_count; ++j) {
139 Closure task = Bind(&SeqTaskTracker::FastNonNestableTask, this, i);
140 tr->PostNonNestableTask(FROM_HERE, task);
141 DLOG(INFO) << "XXX PostFastNonNestableFromSlowNonNestable "
142 << i << " POSTED CHILD TASK " << (i + j);
143 }
144 non_nestable_statuses_[i].SetCompleted();
145
146 DLOG(INFO) << "XXX PostFastNonNestableFromSlowNonNestable " << i << " DONE";
147 }
148
149 void SeqTaskTracker::PostFastNestableFromSlowNonNestable(
150 scoped_refptr<SequencedTaskRunner> tr,
151 const int base_status_i,
152 const int child_count) {
153
154 const int i = ClaimNonNestableTaskStatus(base_status_i);
155
156 DLOG(INFO) << "XXX PostNestableFromSlowNonNestable " << i << " STARTING";
157
158 non_nestable_statuses_[i].SetPrevCompletedBefore(
159 i > 0 ? non_nestable_statuses_[i - 1].Completed() : true);
160
161 for (int j = 0; j < child_count; ++j) {
162 const int child_i = i * child_count + j;
163 Closure task = Bind(&SeqTaskTracker::FastNestableTask,
164 this,
165 child_i);
166 DLOG(INFO) << "XXX PostNestableFromSlowNonNestable " << i
167 << " POSTED CHILD " << child_i ;
168 tr->PostTask(FROM_HERE, task);
169 }
170 non_nestable_statuses_[i].SetCompleted();
171 DLOG(INFO) << "XXX PostNestableFromSlowNonNestable " << i << " DONE";
172 }
173
174 int SeqTaskTracker::ClaimNonNestableTaskStatus(const int search_from) {
175 const int end = static_cast<int>(non_nestable_statuses_.size());
176 for (int i = search_from; i < end; ++i) {
177 if (non_nestable_statuses_[i].Claim())
178 return i;
179 }
180 CHECK(false) << "Unable to find an unclaimed non-nestable task status slot";
181 return -1;
182 }
183
184 int SeqTaskTracker::ClaimNestableTaskStatus(const int search_from) {
185 const int end = static_cast<int>(nestable_statuses_.size());
186 for (int i = search_from; i < end; ++i) {
187 if (nestable_statuses_[i].Claim())
188 return i;
189 }
190 CHECK(false) << "Unable to find an unclaimed nestable task status slot";
191 return -1;
192 }
193
194 const SeqTaskTracker::TaskStatuses& SeqTaskTracker::GetNonNestableTaskStatuses(
195 ) const {
196 return non_nestable_statuses_;
197 }
198
199 const SeqTaskTracker::TaskStatuses& SeqTaskTracker::GetNestableTaskStatuses(
200 ) const {
201 return nestable_statuses_;
202 }
203
204 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698