OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "cc/surfaces/display_scheduler.h" | 5 #include "cc/surfaces/display_scheduler.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/test/null_task_runner.h" | 8 #include "base/test/null_task_runner.h" |
| 9 #include "base/test/simple_test_tick_clock.h" |
9 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
10 #include "cc/output/begin_frame_args.h" | 11 #include "cc/output/begin_frame_args.h" |
11 #include "cc/surfaces/display.h" | 12 #include "cc/surfaces/display.h" |
12 #include "cc/test/scheduler_test_common.h" | 13 #include "cc/test/scheduler_test_common.h" |
13 #include "cc/test/test_now_source.h" | |
14 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
15 | 15 |
16 namespace cc { | 16 namespace cc { |
17 namespace { | 17 namespace { |
18 | 18 |
19 class FakeDisplaySchedulerClient : public DisplaySchedulerClient { | 19 class FakeDisplaySchedulerClient : public DisplaySchedulerClient { |
20 public: | 20 public: |
21 FakeDisplaySchedulerClient() : draw_and_swap_count_(0) {} | 21 FakeDisplaySchedulerClient() : draw_and_swap_count_(0) {} |
22 | 22 |
23 ~FakeDisplaySchedulerClient() override {} | 23 ~FakeDisplaySchedulerClient() override {} |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 int scheduler_begin_frame_deadline_count() { | 61 int scheduler_begin_frame_deadline_count() { |
62 return scheduler_begin_frame_deadline_count_; | 62 return scheduler_begin_frame_deadline_count_; |
63 } | 63 } |
64 | 64 |
65 protected: | 65 protected: |
66 int scheduler_begin_frame_deadline_count_; | 66 int scheduler_begin_frame_deadline_count_; |
67 }; | 67 }; |
68 | 68 |
69 class DisplaySchedulerTest : public testing::Test { | 69 class DisplaySchedulerTest : public testing::Test { |
70 public: | 70 public: |
71 DisplaySchedulerTest() { | 71 DisplaySchedulerTest() : now_src_(new base::SimpleTestTickClock()) { |
72 const int max_pending_swaps = 1; | 72 const int max_pending_swaps = 1; |
73 now_src_ = TestNowSource::Create(); | 73 now_src_->Advance(base::TimeDelta::FromMicroseconds(10000)); |
74 null_task_runner_ = make_scoped_refptr(new base::NullTaskRunner); | 74 null_task_runner_ = make_scoped_refptr(new base::NullTaskRunner); |
75 client_ = make_scoped_ptr(new FakeDisplaySchedulerClient); | 75 client_ = make_scoped_ptr(new FakeDisplaySchedulerClient); |
76 scheduler_ = make_scoped_ptr( | 76 scheduler_ = make_scoped_ptr( |
77 new TestDisplayScheduler(client_.get(), &fake_begin_frame_source_, | 77 new TestDisplayScheduler(client_.get(), &fake_begin_frame_source_, |
78 null_task_runner_, max_pending_swaps)); | 78 null_task_runner_, max_pending_swaps)); |
79 } | 79 } |
80 | 80 |
81 ~DisplaySchedulerTest() override {} | 81 ~DisplaySchedulerTest() override {} |
82 | 82 |
83 void SetUp() override { scheduler_->SetRootSurfaceResourcesLocked(false); } | 83 void SetUp() override { scheduler_->SetRootSurfaceResourcesLocked(false); } |
84 | 84 |
85 void BeginFrameForTest() { | 85 void BeginFrameForTest() { |
86 base::TimeTicks frame_time = now_src_->Now(); | 86 base::TimeTicks frame_time = now_src_->NowTicks(); |
87 base::TimeDelta interval = BeginFrameArgs::DefaultInterval(); | 87 base::TimeDelta interval = BeginFrameArgs::DefaultInterval(); |
88 base::TimeTicks deadline = frame_time + interval; | 88 base::TimeTicks deadline = frame_time + interval; |
89 fake_begin_frame_source_.TestOnBeginFrame( | 89 fake_begin_frame_source_.TestOnBeginFrame( |
90 BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, | 90 BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, |
91 interval, BeginFrameArgs::NORMAL)); | 91 interval, BeginFrameArgs::NORMAL)); |
92 } | 92 } |
93 | 93 |
94 protected: | 94 protected: |
95 TestNowSource& now_src() { return *now_src_; } | 95 base::SimpleTestTickClock& now_src() { return *now_src_; } |
96 FakeDisplaySchedulerClient& client() { return *client_; } | 96 FakeDisplaySchedulerClient& client() { return *client_; } |
97 DisplayScheduler& scheduler() { return *scheduler_; } | 97 DisplayScheduler& scheduler() { return *scheduler_; } |
98 | 98 |
99 scoped_refptr<TestNowSource> now_src_; | 99 scoped_ptr<base::SimpleTestTickClock> now_src_; |
100 scoped_refptr<base::NullTaskRunner> null_task_runner_; | 100 scoped_refptr<base::NullTaskRunner> null_task_runner_; |
101 | 101 |
102 FakeBeginFrameSource fake_begin_frame_source_; | 102 FakeBeginFrameSource fake_begin_frame_source_; |
103 scoped_ptr<FakeDisplaySchedulerClient> client_; | 103 scoped_ptr<FakeDisplaySchedulerClient> client_; |
104 scoped_ptr<TestDisplayScheduler> scheduler_; | 104 scoped_ptr<TestDisplayScheduler> scheduler_; |
105 }; | 105 }; |
106 | 106 |
107 TEST_F(DisplaySchedulerTest, EntireDisplayDamagedDrawsImmediately) { | 107 TEST_F(DisplaySchedulerTest, EntireDisplayDamagedDrawsImmediately) { |
108 SurfaceId root_surface_id(1); | 108 SurfaceId root_surface_id(1); |
109 BeginFrameForTest(); | 109 BeginFrameForTest(); |
110 EXPECT_LT(now_src().Now(), | 110 EXPECT_LT(now_src().NowTicks(), |
111 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 111 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
112 scheduler_->EntireDisplayDamaged(root_surface_id); | 112 scheduler_->EntireDisplayDamaged(root_surface_id); |
113 EXPECT_GE(now_src().Now(), | 113 EXPECT_GE(now_src().NowTicks(), |
114 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 114 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
115 } | 115 } |
116 | 116 |
117 TEST_F(DisplaySchedulerTest, SurfaceDamaged) { | 117 TEST_F(DisplaySchedulerTest, SurfaceDamaged) { |
118 SurfaceId root_surface_id(0); | 118 SurfaceId root_surface_id(0); |
119 SurfaceId sid1(1); | 119 SurfaceId sid1(1); |
120 SurfaceId sid2(2); | 120 SurfaceId sid2(2); |
121 | 121 |
122 // Set the root surface | 122 // Set the root surface |
123 scheduler_->EntireDisplayDamaged(root_surface_id); | 123 scheduler_->EntireDisplayDamaged(root_surface_id); |
124 | 124 |
125 // Get scheduler to detect surface 1 as active by drawing | 125 // Get scheduler to detect surface 1 as active by drawing |
126 // two frames in a row with damage from surface 1. | 126 // two frames in a row with damage from surface 1. |
127 BeginFrameForTest(); | 127 BeginFrameForTest(); |
128 scheduler_->SurfaceDamaged(sid1); | 128 scheduler_->SurfaceDamaged(sid1); |
129 scheduler_->BeginFrameDeadlineForTest(); | 129 scheduler_->BeginFrameDeadlineForTest(); |
130 BeginFrameForTest(); | 130 BeginFrameForTest(); |
131 scheduler_->SurfaceDamaged(sid1); | 131 scheduler_->SurfaceDamaged(sid1); |
132 scheduler_->BeginFrameDeadlineForTest(); | 132 scheduler_->BeginFrameDeadlineForTest(); |
133 | 133 |
134 // Damage only from surface 2 (inactive) does not trigger deadline early. | 134 // Damage only from surface 2 (inactive) does not trigger deadline early. |
135 BeginFrameForTest(); | 135 BeginFrameForTest(); |
136 scheduler_->SurfaceDamaged(sid2); | 136 scheduler_->SurfaceDamaged(sid2); |
137 EXPECT_LT(now_src().Now(), | 137 EXPECT_LT(now_src().NowTicks(), |
138 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 138 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
139 | 139 |
140 // Damage from surface 1 triggers deadline early. | 140 // Damage from surface 1 triggers deadline early. |
141 scheduler_->SurfaceDamaged(sid1); | 141 scheduler_->SurfaceDamaged(sid1); |
142 EXPECT_GE(now_src().Now(), | 142 EXPECT_GE(now_src().NowTicks(), |
143 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 143 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
144 scheduler_->BeginFrameDeadlineForTest(); | 144 scheduler_->BeginFrameDeadlineForTest(); |
145 | 145 |
146 // Make both surface 1 and 2 active. | 146 // Make both surface 1 and 2 active. |
147 BeginFrameForTest(); | 147 BeginFrameForTest(); |
148 scheduler_->SurfaceDamaged(sid2); | 148 scheduler_->SurfaceDamaged(sid2); |
149 scheduler_->SurfaceDamaged(sid1); | 149 scheduler_->SurfaceDamaged(sid1); |
150 scheduler_->BeginFrameDeadlineForTest(); | 150 scheduler_->BeginFrameDeadlineForTest(); |
151 | 151 |
152 // Deadline doesn't trigger early until surface 1 and 2 are both damaged. | 152 // Deadline doesn't trigger early until surface 1 and 2 are both damaged. |
153 BeginFrameForTest(); | 153 BeginFrameForTest(); |
154 EXPECT_LT(now_src().Now(), | 154 EXPECT_LT(now_src().NowTicks(), |
155 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 155 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
156 scheduler_->SurfaceDamaged(sid1); | 156 scheduler_->SurfaceDamaged(sid1); |
157 EXPECT_LT(now_src().Now(), | 157 EXPECT_LT(now_src().NowTicks(), |
158 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 158 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
159 scheduler_->SurfaceDamaged(sid2); | 159 scheduler_->SurfaceDamaged(sid2); |
160 EXPECT_GE(now_src().Now(), | 160 EXPECT_GE(now_src().NowTicks(), |
161 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 161 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
162 scheduler_->BeginFrameDeadlineForTest(); | 162 scheduler_->BeginFrameDeadlineForTest(); |
163 | 163 |
164 // Make the system idle | 164 // Make the system idle |
165 BeginFrameForTest(); | 165 BeginFrameForTest(); |
166 scheduler_->BeginFrameDeadlineForTest(); | 166 scheduler_->BeginFrameDeadlineForTest(); |
167 BeginFrameForTest(); | 167 BeginFrameForTest(); |
168 scheduler_->BeginFrameDeadlineForTest(); | 168 scheduler_->BeginFrameDeadlineForTest(); |
169 | 169 |
170 // Deadline should trigger early if child surfaces are idle and | 170 // Deadline should trigger early if child surfaces are idle and |
171 // we get damage on the root surface. | 171 // we get damage on the root surface. |
172 BeginFrameForTest(); | 172 BeginFrameForTest(); |
173 EXPECT_LT(now_src().Now(), | 173 EXPECT_LT(now_src().NowTicks(), |
174 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 174 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
175 scheduler_->SurfaceDamaged(root_surface_id); | 175 scheduler_->SurfaceDamaged(root_surface_id); |
176 EXPECT_GE(now_src().Now(), | 176 EXPECT_GE(now_src().NowTicks(), |
177 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 177 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
178 scheduler_->BeginFrameDeadlineForTest(); | 178 scheduler_->BeginFrameDeadlineForTest(); |
179 } | 179 } |
180 | 180 |
181 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { | 181 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { |
182 SurfaceId sid1(1); | 182 SurfaceId sid1(1); |
183 | 183 |
184 // DrawAndSwap normally. | 184 // DrawAndSwap normally. |
185 BeginFrameForTest(); | 185 BeginFrameForTest(); |
186 EXPECT_LT(now_src().Now(), | 186 EXPECT_LT(now_src().NowTicks(), |
187 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 187 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
188 EXPECT_EQ(0, client_->draw_and_swap_count()); | 188 EXPECT_EQ(0, client_->draw_and_swap_count()); |
189 scheduler_->SurfaceDamaged(sid1); | 189 scheduler_->SurfaceDamaged(sid1); |
190 scheduler_->BeginFrameDeadlineForTest(); | 190 scheduler_->BeginFrameDeadlineForTest(); |
191 EXPECT_EQ(1, client_->draw_and_swap_count()); | 191 EXPECT_EQ(1, client_->draw_and_swap_count()); |
192 | 192 |
193 // Deadline triggers immediately on OutputSurfaceLost. | 193 // Deadline triggers immediately on OutputSurfaceLost. |
194 BeginFrameForTest(); | 194 BeginFrameForTest(); |
195 EXPECT_LT(now_src().Now(), | 195 EXPECT_LT(now_src().NowTicks(), |
196 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 196 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
197 scheduler_->OutputSurfaceLost(); | 197 scheduler_->OutputSurfaceLost(); |
198 EXPECT_GE(now_src().Now(), | 198 EXPECT_GE(now_src().NowTicks(), |
199 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 199 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
200 | 200 |
201 // Deadline does not DrawAndSwap after OutputSurfaceLost. | 201 // Deadline does not DrawAndSwap after OutputSurfaceLost. |
202 EXPECT_EQ(1, client_->draw_and_swap_count()); | 202 EXPECT_EQ(1, client_->draw_and_swap_count()); |
203 scheduler_->SurfaceDamaged(sid1); | 203 scheduler_->SurfaceDamaged(sid1); |
204 scheduler_->BeginFrameDeadlineForTest(); | 204 scheduler_->BeginFrameDeadlineForTest(); |
205 EXPECT_EQ(1, client_->draw_and_swap_count()); | 205 EXPECT_EQ(1, client_->draw_and_swap_count()); |
206 } | 206 } |
207 | 207 |
208 TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { | 208 TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { |
209 SurfaceId sid1(1); | 209 SurfaceId sid1(1); |
210 base::TimeTicks late_deadline; | 210 base::TimeTicks late_deadline; |
211 | 211 |
212 // DrawAndSwap normally. | 212 // DrawAndSwap normally. |
213 BeginFrameForTest(); | 213 BeginFrameForTest(); |
214 EXPECT_LT(now_src().Now(), | 214 EXPECT_LT(now_src().NowTicks(), |
215 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 215 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
216 EXPECT_EQ(0, client_->draw_and_swap_count()); | 216 EXPECT_EQ(0, client_->draw_and_swap_count()); |
217 scheduler_->SurfaceDamaged(sid1); | 217 scheduler_->SurfaceDamaged(sid1); |
218 scheduler_->BeginFrameDeadlineForTest(); | 218 scheduler_->BeginFrameDeadlineForTest(); |
219 EXPECT_EQ(1, client_->draw_and_swap_count()); | 219 EXPECT_EQ(1, client_->draw_and_swap_count()); |
220 | 220 |
221 // Deadline triggers late while root resources are locked. | 221 // Deadline triggers late while root resources are locked. |
222 late_deadline = now_src().Now() + BeginFrameArgs::DefaultInterval(); | 222 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
223 BeginFrameForTest(); | 223 BeginFrameForTest(); |
224 scheduler_->SurfaceDamaged(sid1); | 224 scheduler_->SurfaceDamaged(sid1); |
225 EXPECT_GT(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 225 EXPECT_GT(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
226 scheduler_->SetRootSurfaceResourcesLocked(true); | 226 scheduler_->SetRootSurfaceResourcesLocked(true); |
227 EXPECT_EQ(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 227 EXPECT_EQ(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
228 | 228 |
229 // Deadline does not DrawAndSwap while root resources are locked. | 229 // Deadline does not DrawAndSwap while root resources are locked. |
230 EXPECT_EQ(1, client_->draw_and_swap_count()); | 230 EXPECT_EQ(1, client_->draw_and_swap_count()); |
231 scheduler_->SurfaceDamaged(sid1); | 231 scheduler_->SurfaceDamaged(sid1); |
232 scheduler_->BeginFrameDeadlineForTest(); | 232 scheduler_->BeginFrameDeadlineForTest(); |
233 EXPECT_EQ(1, client_->draw_and_swap_count()); | 233 EXPECT_EQ(1, client_->draw_and_swap_count()); |
234 | 234 |
235 // Deadline triggers normally when root resources are unlocked. | 235 // Deadline triggers normally when root resources are unlocked. |
236 late_deadline = now_src().Now() + BeginFrameArgs::DefaultInterval(); | 236 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
237 BeginFrameForTest(); | 237 BeginFrameForTest(); |
238 scheduler_->SurfaceDamaged(sid1); | 238 scheduler_->SurfaceDamaged(sid1); |
239 EXPECT_EQ(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 239 EXPECT_EQ(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
240 scheduler_->SetRootSurfaceResourcesLocked(false); | 240 scheduler_->SetRootSurfaceResourcesLocked(false); |
241 EXPECT_EQ(base::TimeTicks(), | 241 EXPECT_EQ(base::TimeTicks(), |
242 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 242 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
243 | 243 |
244 EXPECT_EQ(1, client_->draw_and_swap_count()); | 244 EXPECT_EQ(1, client_->draw_and_swap_count()); |
245 scheduler_->BeginFrameDeadlineForTest(); | 245 scheduler_->BeginFrameDeadlineForTest(); |
246 EXPECT_EQ(2, client_->draw_and_swap_count()); | 246 EXPECT_EQ(2, client_->draw_and_swap_count()); |
247 } | 247 } |
248 | 248 |
249 TEST_F(DisplaySchedulerTest, DidSwapBuffers) { | 249 TEST_F(DisplaySchedulerTest, DidSwapBuffers) { |
250 SurfaceId sid1(1); | 250 SurfaceId sid1(1); |
251 SurfaceId sid2(2); | 251 SurfaceId sid2(2); |
252 base::TimeTicks expected_deadline; | 252 base::TimeTicks expected_deadline; |
253 | 253 |
254 // Get scheduler to detect surface 1 and 2 as active. | 254 // Get scheduler to detect surface 1 and 2 as active. |
255 BeginFrameForTest(); | 255 BeginFrameForTest(); |
256 scheduler_->SurfaceDamaged(sid1); | 256 scheduler_->SurfaceDamaged(sid1); |
257 scheduler_->SurfaceDamaged(sid2); | 257 scheduler_->SurfaceDamaged(sid2); |
258 scheduler_->BeginFrameDeadlineForTest(); | 258 scheduler_->BeginFrameDeadlineForTest(); |
259 BeginFrameForTest(); | 259 BeginFrameForTest(); |
260 scheduler_->SurfaceDamaged(sid1); | 260 scheduler_->SurfaceDamaged(sid1); |
261 scheduler_->SurfaceDamaged(sid2); | 261 scheduler_->SurfaceDamaged(sid2); |
262 scheduler_->BeginFrameDeadlineForTest(); | 262 scheduler_->BeginFrameDeadlineForTest(); |
263 | 263 |
264 // DrawAndSwap normally. | 264 // DrawAndSwap normally. |
265 BeginFrameForTest(); | 265 BeginFrameForTest(); |
266 EXPECT_LT(now_src().Now(), | 266 EXPECT_LT(now_src().NowTicks(), |
267 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 267 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
268 EXPECT_EQ(2, client_->draw_and_swap_count()); | 268 EXPECT_EQ(2, client_->draw_and_swap_count()); |
269 scheduler_->SurfaceDamaged(sid1); | 269 scheduler_->SurfaceDamaged(sid1); |
270 scheduler_->SurfaceDamaged(sid2); | 270 scheduler_->SurfaceDamaged(sid2); |
271 scheduler_->BeginFrameDeadlineForTest(); | 271 scheduler_->BeginFrameDeadlineForTest(); |
272 EXPECT_EQ(3, client_->draw_and_swap_count()); | 272 EXPECT_EQ(3, client_->draw_and_swap_count()); |
273 scheduler_->DidSwapBuffers(); | 273 scheduler_->DidSwapBuffers(); |
274 | 274 |
275 // Deadline triggers normally when swap throttled. | 275 // Deadline triggers normally when swap throttled. |
276 expected_deadline = | 276 expected_deadline = |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
335 | 335 |
336 scheduler_->SetRootSurfaceResourcesLocked(true); | 336 scheduler_->SetRootSurfaceResourcesLocked(true); |
337 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 337 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); |
338 | 338 |
339 scheduler_->OutputSurfaceLost(); | 339 scheduler_->OutputSurfaceLost(); |
340 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 340 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); |
341 } | 341 } |
342 | 342 |
343 } // namespace | 343 } // namespace |
344 } // namespace cc | 344 } // namespace cc |
OLD | NEW |