Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/resources/pixel_buffer_raster_worker_pool.h" | 5 #include "cc/resources/pixel_buffer_raster_worker_pool.h" |
| 6 | 6 |
| 7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
| 8 #include "cc/resources/resource.h" | 8 #include "cc/resources/resource.h" |
| 9 #include "third_party/skia/include/core/SkDevice.h" | 9 #include "third_party/skia/include/core/SkDevice.h" |
| 10 | 10 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 77 | 77 |
| 78 const int kCheckForCompletedRasterTasksDelayMs = 6; | 78 const int kCheckForCompletedRasterTasksDelayMs = 6; |
| 79 | 79 |
| 80 const size_t kMaxPendingRasterBytes = | 80 const size_t kMaxPendingRasterBytes = |
| 81 kMaxBytesUploadedPerMs * kCheckForCompletedRasterTasksDelayMs; | 81 kMaxBytesUploadedPerMs * kCheckForCompletedRasterTasksDelayMs; |
| 82 | 82 |
| 83 } // namespace | 83 } // namespace |
| 84 | 84 |
| 85 PixelBufferRasterWorkerPool::PixelBufferRasterWorkerPool( | 85 PixelBufferRasterWorkerPool::PixelBufferRasterWorkerPool( |
| 86 ResourceProvider* resource_provider, | 86 ResourceProvider* resource_provider, |
| 87 size_t num_threads) : RasterWorkerPool(resource_provider, num_threads), | 87 size_t num_threads) |
| 88 shutdown_(false), | 88 : RasterWorkerPool(resource_provider, num_threads), |
| 89 bytes_pending_upload_(0), | 89 shutdown_(false), |
| 90 has_performed_uploads_since_last_flush_(false), | 90 bytes_pending_upload_(0), |
| 91 check_for_completed_raster_tasks_pending_(false) { | 91 has_performed_uploads_since_last_flush_(false), |
| 92 check_for_completed_raster_tasks_pending_(false), | |
| 93 finished_running_tasks_pending_(false), | |
| 94 finished_running_tasks_required_for_activation_pending_(false) { | |
| 92 } | 95 } |
| 93 | 96 |
| 94 PixelBufferRasterWorkerPool::~PixelBufferRasterWorkerPool() { | 97 PixelBufferRasterWorkerPool::~PixelBufferRasterWorkerPool() { |
| 95 DCHECK(shutdown_); | 98 DCHECK(shutdown_); |
| 96 DCHECK(!check_for_completed_raster_tasks_pending_); | 99 DCHECK(!check_for_completed_raster_tasks_pending_); |
| 97 DCHECK_EQ(0u, pixel_buffer_tasks_.size()); | 100 DCHECK_EQ(0u, pixel_buffer_tasks_.size()); |
| 98 DCHECK_EQ(0u, tasks_with_pending_upload_.size()); | 101 DCHECK_EQ(0u, tasks_with_pending_upload_.size()); |
| 99 DCHECK_EQ(0u, completed_tasks_.size()); | 102 DCHECK_EQ(0u, completed_tasks_.size()); |
| 100 } | 103 } |
| 101 | 104 |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 114 completed_tasks_.push_back(task); | 117 completed_tasks_.push_back(task); |
| 115 } | 118 } |
| 116 } | 119 } |
| 117 } | 120 } |
| 118 | 121 |
| 119 void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { | 122 void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { |
| 120 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleTasks"); | 123 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleTasks"); |
| 121 | 124 |
| 122 RasterWorkerPool::SetRasterTasks(queue); | 125 RasterWorkerPool::SetRasterTasks(queue); |
| 123 | 126 |
| 127 finished_running_tasks_pending_ = true; | |
| 128 finished_running_tasks_required_for_activation_pending_ = true; | |
| 129 | |
| 124 // Build new pixel buffer task set. | 130 // Build new pixel buffer task set. |
| 125 TaskMap new_pixel_buffer_tasks; | 131 TaskMap new_pixel_buffer_tasks; |
| 126 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); | 132 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); |
| 127 it != raster_tasks().end(); ++it) { | 133 it != raster_tasks().end(); ++it) { |
| 128 internal::RasterWorkerPoolTask* task = it->get(); | 134 internal::RasterWorkerPoolTask* task = it->get(); |
| 129 DCHECK(new_pixel_buffer_tasks.find(task) == new_pixel_buffer_tasks.end()); | 135 DCHECK(new_pixel_buffer_tasks.find(task) == new_pixel_buffer_tasks.end()); |
| 130 DCHECK(!task->HasCompleted()); | 136 DCHECK(!task->HasCompleted()); |
| 131 | 137 |
| 132 // Use existing pixel buffer task if available. | 138 // Use existing pixel buffer task if available. |
| 133 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task); | 139 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 153 // Inactive task can be canceled. | 159 // Inactive task can be canceled. |
| 154 if (!pixel_buffer_task && !task->HasFinishedRunning()) { | 160 if (!pixel_buffer_task && !task->HasFinishedRunning()) { |
| 155 task->DidRun(true); | 161 task->DidRun(true); |
| 156 DCHECK(std::find(completed_tasks_.begin(), | 162 DCHECK(std::find(completed_tasks_.begin(), |
| 157 completed_tasks_.end(), | 163 completed_tasks_.end(), |
| 158 task) == completed_tasks_.end()); | 164 task) == completed_tasks_.end()); |
| 159 completed_tasks_.push_back(task); | 165 completed_tasks_.push_back(task); |
| 160 } | 166 } |
| 161 } | 167 } |
| 162 | 168 |
| 169 tasks_required_for_activation_.clear(); | |
| 170 for (TaskMap::iterator it = new_pixel_buffer_tasks.begin(); | |
| 171 it != new_pixel_buffer_tasks.end(); ++it) { | |
| 172 internal::RasterWorkerPoolTask* task = it->first; | |
| 173 if (IsRasterTaskRequiredForActivation(task)) { | |
| 174 DCHECK(std::find(tasks_required_for_activation_.begin(), | |
|
vmpstr
2013/06/21 18:38:33
I don't think we need this dcheck. We already dche
reveman
2013/06/24 16:04:03
Done.
| |
| 175 tasks_required_for_activation_.end(), | |
| 176 task) == tasks_required_for_activation_.end()); | |
| 177 tasks_required_for_activation_.insert(task); | |
| 178 } | |
| 179 } | |
| 180 | |
| 163 pixel_buffer_tasks_.swap(new_pixel_buffer_tasks); | 181 pixel_buffer_tasks_.swap(new_pixel_buffer_tasks); |
| 164 | 182 |
| 165 // This will schedule more tasks after checking for completed raster | 183 // This will schedule more tasks after checking for completed raster |
| 166 // tasks. It's worth checking for completed tasks when ScheduleTasks() | 184 // tasks. It's worth checking for completed tasks when ScheduleTasks() |
| 167 // is called as priorities might have changed and this allows us to | 185 // is called as priorities might have changed and this allows us to |
| 168 // schedule as many new top priority tasks as possible. | 186 // schedule as many new top priority tasks as possible. |
| 169 CheckForCompletedRasterTasks(); | 187 CheckForCompletedRasterTasks(); |
| 170 } | 188 } |
| 171 | 189 |
| 172 void PixelBufferRasterWorkerPool::CheckForCompletedTasks() { | 190 void PixelBufferRasterWorkerPool::CheckForCompletedTasks() { |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 189 } | 207 } |
| 190 } | 208 } |
| 191 | 209 |
| 192 void PixelBufferRasterWorkerPool::OnRasterTasksFinished() { | 210 void PixelBufferRasterWorkerPool::OnRasterTasksFinished() { |
| 193 // Call CheckForCompletedTasks() when we've finished running all raster | 211 // Call CheckForCompletedTasks() when we've finished running all raster |
| 194 // tasks needed since last time ScheduleMoreTasks() was called. This | 212 // tasks needed since last time ScheduleMoreTasks() was called. This |
| 195 // reduces latency when processing only a small number of raster tasks. | 213 // reduces latency when processing only a small number of raster tasks. |
| 196 CheckForCompletedRasterTasks(); | 214 CheckForCompletedRasterTasks(); |
| 197 } | 215 } |
| 198 | 216 |
| 217 void PixelBufferRasterWorkerPool:: | |
| 218 OnRasterTasksRequiredForActivationFinished() { | |
| 219 OnRasterTasksFinished(); | |
| 220 } | |
| 221 | |
| 199 void PixelBufferRasterWorkerPool::FlushUploads() { | 222 void PixelBufferRasterWorkerPool::FlushUploads() { |
| 200 if (!has_performed_uploads_since_last_flush_) | 223 if (!has_performed_uploads_since_last_flush_) |
| 201 return; | 224 return; |
| 202 | 225 |
| 203 resource_provider()->ShallowFlushIfSupported(); | 226 resource_provider()->ShallowFlushIfSupported(); |
| 204 has_performed_uploads_since_last_flush_ = false; | 227 has_performed_uploads_since_last_flush_ = false; |
| 205 } | 228 } |
| 206 | 229 |
| 207 void PixelBufferRasterWorkerPool::CheckForCompletedUploads() { | 230 void PixelBufferRasterWorkerPool::CheckForCompletedUploads() { |
| 208 TaskDeque tasks_with_completed_uploads; | 231 TaskDeque tasks_with_completed_uploads; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 256 | 279 |
| 257 bytes_pending_upload_ -= task->resource()->bytes(); | 280 bytes_pending_upload_ -= task->resource()->bytes(); |
| 258 | 281 |
| 259 task->DidRun(false); | 282 task->DidRun(false); |
| 260 | 283 |
| 261 DCHECK(std::find(completed_tasks_.begin(), | 284 DCHECK(std::find(completed_tasks_.begin(), |
| 262 completed_tasks_.end(), | 285 completed_tasks_.end(), |
| 263 task) == completed_tasks_.end()); | 286 task) == completed_tasks_.end()); |
| 264 completed_tasks_.push_back(task); | 287 completed_tasks_.push_back(task); |
| 265 | 288 |
| 289 tasks_required_for_activation_.erase(task); | |
| 290 | |
| 266 tasks_with_completed_uploads.pop_front(); | 291 tasks_with_completed_uploads.pop_front(); |
| 267 } | 292 } |
| 268 } | 293 } |
| 269 | 294 |
| 270 void PixelBufferRasterWorkerPool::ScheduleCheckForCompletedRasterTasks() { | 295 void PixelBufferRasterWorkerPool::ScheduleCheckForCompletedRasterTasks() { |
| 271 if (check_for_completed_raster_tasks_pending_) | 296 if (check_for_completed_raster_tasks_pending_) |
| 272 return; | 297 return; |
| 273 | 298 |
| 274 check_for_completed_raster_tasks_callback_.Reset( | 299 check_for_completed_raster_tasks_callback_.Reset( |
| 275 base::Bind(&PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks, | 300 base::Bind(&PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks, |
| 276 base::Unretained(this))); | 301 base::Unretained(this))); |
| 277 base::MessageLoopProxy::current()->PostDelayedTask( | 302 base::MessageLoopProxy::current()->PostDelayedTask( |
| 278 FROM_HERE, | 303 FROM_HERE, |
| 279 check_for_completed_raster_tasks_callback_.callback(), | 304 check_for_completed_raster_tasks_callback_.callback(), |
| 280 base::TimeDelta::FromMilliseconds(kCheckForCompletedRasterTasksDelayMs)); | 305 base::TimeDelta::FromMilliseconds(kCheckForCompletedRasterTasksDelayMs)); |
| 281 check_for_completed_raster_tasks_pending_ = true; | 306 check_for_completed_raster_tasks_pending_ = true; |
| 282 } | 307 } |
| 283 | 308 |
| 284 void PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks() { | 309 void PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks() { |
| 285 TRACE_EVENT0( | 310 TRACE_EVENT0( |
| 286 "cc", "PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks"); | 311 "cc", "PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks"); |
| 287 | 312 |
| 288 check_for_completed_raster_tasks_callback_.Cancel(); | 313 check_for_completed_raster_tasks_callback_.Cancel(); |
| 289 check_for_completed_raster_tasks_pending_ = false; | 314 check_for_completed_raster_tasks_pending_ = false; |
| 290 | 315 |
| 291 RasterWorkerPool::CheckForCompletedTasks(); | 316 RasterWorkerPool::CheckForCompletedTasks(); |
| 292 CheckForCompletedUploads(); | 317 CheckForCompletedUploads(); |
| 293 FlushUploads(); | 318 FlushUploads(); |
| 294 | 319 |
| 295 ScheduleMoreTasks(); | 320 if (NumPendingRasterTasks()) |
| 321 ScheduleMoreTasks(); | |
| 296 | 322 |
| 297 // Make sure another check for completed uploads is scheduled | 323 // Schedule another check for completed raster tasks while there are |
| 298 // while there is still pending uploads left. | 324 // pending raster tasks or pending uploads. |
| 299 if (!tasks_with_pending_upload_.empty()) | 325 if (NumPendingRasterTasks() || !tasks_with_pending_upload_.empty()) |
| 300 ScheduleCheckForCompletedRasterTasks(); | 326 ScheduleCheckForCompletedRasterTasks(); |
| 327 | |
| 328 CheckIfFinishedRunningTasks(); | |
| 329 CheckIfFinishedRunningTasksRequiredForActivation(); | |
| 301 } | 330 } |
| 302 | 331 |
| 303 void PixelBufferRasterWorkerPool::ScheduleMoreTasks() { | 332 void PixelBufferRasterWorkerPool::ScheduleMoreTasks() { |
| 304 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks"); | 333 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks"); |
| 305 | 334 |
| 306 size_t bytes_pending_upload = bytes_pending_upload_; | 335 size_t bytes_pending_upload = bytes_pending_upload_; |
| 307 size_t bytes_pending_raster = 0; | 336 size_t bytes_pending_raster = 0; |
| 308 | 337 |
| 309 RasterTaskGraph graph; | 338 RasterTaskGraph graph; |
| 310 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); | 339 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 345 if (new_bytes_pending_raster > kMaxPendingRasterBytes) | 374 if (new_bytes_pending_raster > kMaxPendingRasterBytes) |
| 346 break; | 375 break; |
| 347 | 376 |
| 348 // Update both |bytes_pending_raster| and |bytes_pending_upload| | 377 // Update both |bytes_pending_raster| and |bytes_pending_upload| |
| 349 // now that task has cleared all throttling limits. | 378 // now that task has cleared all throttling limits. |
| 350 bytes_pending_raster = new_bytes_pending_raster; | 379 bytes_pending_raster = new_bytes_pending_raster; |
| 351 bytes_pending_upload = new_bytes_pending_upload; | 380 bytes_pending_upload = new_bytes_pending_upload; |
| 352 | 381 |
| 353 // Use existing pixel buffer task if available. | 382 // Use existing pixel buffer task if available. |
| 354 if (pixel_buffer_task) { | 383 if (pixel_buffer_task) { |
| 355 graph.InsertRasterTask(pixel_buffer_task, task->dependencies()); | 384 graph.InsertRasterTask(pixel_buffer_task, |
| 385 task->dependencies(), | |
| 386 IsRasterTaskRequiredForActivation(task)); | |
| 356 continue; | 387 continue; |
| 357 } | 388 } |
| 358 | 389 |
| 359 // Request a pixel buffer. This will reserve shared memory. | 390 // Request a pixel buffer. This will reserve shared memory. |
| 360 resource_provider()->AcquirePixelBuffer(task->resource()->id()); | 391 resource_provider()->AcquirePixelBuffer(task->resource()->id()); |
| 361 | 392 |
| 362 // MapPixelBuffer() returns NULL if context was lost at the time | 393 // MapPixelBuffer() returns NULL if context was lost at the time |
| 363 // AcquirePixelBuffer() was called. For simplicity we still post | 394 // AcquirePixelBuffer() was called. For simplicity we still post |
| 364 // a raster task that is essentially a noop in these situations. | 395 // a raster task that is essentially a noop in these situations. |
| 365 uint8* buffer = resource_provider()->MapPixelBuffer( | 396 uint8* buffer = resource_provider()->MapPixelBuffer( |
| 366 task->resource()->id()); | 397 task->resource()->id()); |
| 367 | 398 |
| 368 scoped_refptr<internal::WorkerPoolTask> new_pixel_buffer_task( | 399 scoped_refptr<internal::WorkerPoolTask> new_pixel_buffer_task( |
| 369 new PixelBufferWorkerPoolTaskImpl( | 400 new PixelBufferWorkerPoolTaskImpl( |
| 370 task, | 401 task, |
| 371 buffer, | 402 buffer, |
| 372 base::Bind(&PixelBufferRasterWorkerPool::OnRasterTaskCompleted, | 403 base::Bind(&PixelBufferRasterWorkerPool::OnRasterTaskCompleted, |
| 373 base::Unretained(this), | 404 base::Unretained(this), |
| 374 make_scoped_refptr(task)))); | 405 make_scoped_refptr(task)))); |
| 375 pixel_buffer_tasks_[task] = new_pixel_buffer_task; | 406 pixel_buffer_tasks_[task] = new_pixel_buffer_task; |
| 376 graph.InsertRasterTask(new_pixel_buffer_task.get(), task->dependencies()); | 407 graph.InsertRasterTask(new_pixel_buffer_task.get(), |
| 408 task->dependencies(), | |
| 409 IsRasterTaskRequiredForActivation(task)); | |
| 377 } | 410 } |
| 378 | 411 |
| 379 SetRasterTaskGraph(&graph); | 412 SetRasterTaskGraph(&graph); |
| 380 | |
| 381 // At least one task that could need an upload is now pending, schedule | |
| 382 // a check for completed raster tasks to ensure this upload is dispatched | |
| 383 // without too much latency. | |
| 384 if (bytes_pending_raster) | |
| 385 ScheduleCheckForCompletedRasterTasks(); | |
| 386 } | 413 } |
| 387 | 414 |
| 388 void PixelBufferRasterWorkerPool::OnRasterTaskCompleted( | 415 void PixelBufferRasterWorkerPool::OnRasterTaskCompleted( |
| 389 scoped_refptr<internal::RasterWorkerPoolTask> task, | 416 scoped_refptr<internal::RasterWorkerPoolTask> task, |
| 390 bool was_canceled, | 417 bool was_canceled, |
| 391 bool needs_upload) { | 418 bool needs_upload) { |
| 392 TRACE_EVENT2("cc", "PixelBufferRasterWorkerPool::OnRasterTaskCompleted", | 419 TRACE_EVENT2("cc", "PixelBufferRasterWorkerPool::OnRasterTaskCompleted", |
| 393 "was_canceled", was_canceled, | 420 "was_canceled", was_canceled, |
| 394 "needs_upload", needs_upload); | 421 "needs_upload", needs_upload); |
| 395 | 422 |
| 396 DCHECK(pixel_buffer_tasks_.find(task.get()) != pixel_buffer_tasks_.end()); | 423 DCHECK(pixel_buffer_tasks_.find(task.get()) != pixel_buffer_tasks_.end()); |
| 397 | 424 |
| 398 // Balanced with MapPixelBuffer() call in ScheduleMoreTasks(). | 425 // Balanced with MapPixelBuffer() call in ScheduleMoreTasks(). |
| 399 resource_provider()->UnmapPixelBuffer(task->resource()->id()); | 426 resource_provider()->UnmapPixelBuffer(task->resource()->id()); |
| 400 | 427 |
| 401 if (!needs_upload) { | 428 if (!needs_upload) { |
| 402 resource_provider()->ReleasePixelBuffer(task->resource()->id()); | 429 resource_provider()->ReleasePixelBuffer(task->resource()->id()); |
| 403 task->DidRun(was_canceled); | 430 task->DidRun(was_canceled); |
| 404 DCHECK(std::find(completed_tasks_.begin(), | 431 DCHECK(std::find(completed_tasks_.begin(), |
| 405 completed_tasks_.end(), | 432 completed_tasks_.end(), |
| 406 task) == completed_tasks_.end()); | 433 task) == completed_tasks_.end()); |
| 407 completed_tasks_.push_back(task); | 434 completed_tasks_.push_back(task); |
| 435 tasks_required_for_activation_.erase(task); | |
| 408 return; | 436 return; |
| 409 } | 437 } |
| 410 | 438 |
| 411 resource_provider()->BeginSetPixels(task->resource()->id()); | 439 resource_provider()->BeginSetPixels(task->resource()->id()); |
| 412 has_performed_uploads_since_last_flush_ = true; | 440 has_performed_uploads_since_last_flush_ = true; |
| 413 | 441 |
| 414 bytes_pending_upload_ += task->resource()->bytes(); | 442 bytes_pending_upload_ += task->resource()->bytes(); |
| 415 tasks_with_pending_upload_.push_back(task); | 443 tasks_with_pending_upload_.push_back(task); |
| 416 } | 444 } |
| 417 | 445 |
| 446 unsigned PixelBufferRasterWorkerPool::NumPendingRasterTasks() const { | |
|
vmpstr
2013/06/21 18:38:33
nit: I prefer PendingRasterTaskCount
reveman
2013/06/24 16:04:03
Done.
| |
| 447 DCHECK_GE(pixel_buffer_tasks_.size(), completed_tasks_.size()); | |
| 448 return pixel_buffer_tasks_.size() - completed_tasks_.size(); | |
| 449 } | |
| 450 | |
| 451 void PixelBufferRasterWorkerPool::CheckIfFinishedRunningTasks() { | |
|
vmpstr
2013/06/21 18:38:33
Maybe something like NotifyClientIfFinishedRunning
reveman
2013/06/24 16:04:03
Done.
| |
| 452 if (!finished_running_tasks_pending_) | |
| 453 return; | |
| 454 | |
| 455 if (NumPendingRasterTasks()) | |
| 456 return; | |
| 457 | |
| 458 if (tasks_with_pending_upload_.empty()) | |
| 459 return; | |
| 460 | |
| 461 client()->DidFinishedRunningTasks(); | |
| 462 finished_running_tasks_pending_ = false; | |
| 463 } | |
| 464 | |
| 465 void PixelBufferRasterWorkerPool:: | |
| 466 CheckIfFinishedRunningTasksRequiredForActivation() { | |
|
vmpstr
2013/06/21 18:38:33
NotifyClient... The function name gets to be a bit
reveman
2013/06/24 16:04:03
Done.
| |
| 467 if (!finished_running_tasks_required_for_activation_pending_) | |
| 468 return; | |
| 469 | |
| 470 if (!tasks_required_for_activation_.empty()) | |
| 471 return; | |
| 472 | |
| 473 client()->DidFinishedRunningTasksRequiredForActivation(); | |
| 474 finished_running_tasks_required_for_activation_pending_ = false; | |
| 475 } | |
| 476 | |
| 418 } // namespace cc | 477 } // namespace cc |
| OLD | NEW |