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 "content/child/scheduler/task_queue_manager.h" | 5 #include "content/child/scheduler/task_queue_manager.h" |
6 | 6 |
7 #include <queue> | 7 #include <queue> |
8 #include <set> | 8 #include <set> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
457 scoped_refptr<NestableSingleThreadTaskRunner> main_task_runner, | 457 scoped_refptr<NestableSingleThreadTaskRunner> main_task_runner, |
458 TaskQueueSelector* selector, | 458 TaskQueueSelector* selector, |
459 const char* disabled_by_default_tracing_category) | 459 const char* disabled_by_default_tracing_category) |
460 : main_task_runner_(main_task_runner), | 460 : main_task_runner_(main_task_runner), |
461 selector_(selector), | 461 selector_(selector), |
462 pending_dowork_count_(0), | 462 pending_dowork_count_(0), |
463 work_batch_size_(1), | 463 work_batch_size_(1), |
464 time_source_(nullptr), | 464 time_source_(nullptr), |
465 disabled_by_default_tracing_category_( | 465 disabled_by_default_tracing_category_( |
466 disabled_by_default_tracing_category), | 466 disabled_by_default_tracing_category), |
467 deletion_sentinel_(new DeletionSentinel()), | |
467 weak_factory_(this) { | 468 weak_factory_(this) { |
468 DCHECK(main_task_runner->RunsTasksOnCurrentThread()); | 469 DCHECK(main_task_runner->RunsTasksOnCurrentThread()); |
469 TRACE_EVENT_OBJECT_CREATED_WITH_ID(disabled_by_default_tracing_category, | 470 TRACE_EVENT_OBJECT_CREATED_WITH_ID(disabled_by_default_tracing_category, |
470 "TaskQueueManager", this); | 471 "TaskQueueManager", this); |
471 | 472 |
472 task_queue_manager_weak_ptr_ = weak_factory_.GetWeakPtr(); | 473 task_queue_manager_weak_ptr_ = weak_factory_.GetWeakPtr(); |
473 for (size_t i = 0; i < task_queue_count; i++) { | 474 for (size_t i = 0; i < task_queue_count; i++) { |
474 scoped_refptr<internal::TaskQueue> queue(make_scoped_refptr( | 475 scoped_refptr<internal::TaskQueue> queue(make_scoped_refptr( |
475 new internal::TaskQueue(this, disabled_by_default_tracing_category))); | 476 new internal::TaskQueue(this, disabled_by_default_tracing_category))); |
476 queues_.push_back(queue); | 477 queues_.push_back(queue); |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
569 } | 570 } |
570 pending_dowork_count_++; | 571 pending_dowork_count_++; |
571 } | 572 } |
572 | 573 |
573 main_task_runner_->PostTask( | 574 main_task_runner_->PostTask( |
574 FROM_HERE, Bind(&TaskQueueManager::DoWork, task_queue_manager_weak_ptr_, | 575 FROM_HERE, Bind(&TaskQueueManager::DoWork, task_queue_manager_weak_ptr_, |
575 on_main_thread)); | 576 on_main_thread)); |
576 } | 577 } |
577 | 578 |
578 void TaskQueueManager::DoWork(bool posted_from_main_thread) { | 579 void TaskQueueManager::DoWork(bool posted_from_main_thread) { |
580 scoped_refptr<DeletionSentinel> protect(deletion_sentinel_); | |
581 | |
579 if (posted_from_main_thread) { | 582 if (posted_from_main_thread) { |
580 pending_dowork_count_--; | 583 pending_dowork_count_--; |
581 DCHECK_GE(pending_dowork_count_, 0); | 584 DCHECK_GE(pending_dowork_count_, 0); |
582 } | 585 } |
583 DCHECK(main_thread_checker_.CalledOnValidThread()); | 586 DCHECK(main_thread_checker_.CalledOnValidThread()); |
584 | 587 |
585 // Pass nullptr to UpdateWorkQueues here to prevent waking up a | 588 // Pass nullptr to UpdateWorkQueues here to prevent waking up a |
586 // pump-after-wakeup queue. | 589 // pump-after-wakeup queue. |
587 if (!UpdateWorkQueues(nullptr)) | 590 if (!UpdateWorkQueues(nullptr)) |
588 return; | 591 return; |
589 | 592 |
590 base::PendingTask previous_task((tracked_objects::Location()), | 593 base::PendingTask previous_task((tracked_objects::Location()), |
591 (base::Closure())); | 594 (base::Closure())); |
592 for (int i = 0; i < work_batch_size_; i++) { | 595 for (int i = 0; i < work_batch_size_; i++) { |
593 size_t queue_index; | 596 size_t queue_index; |
594 if (!SelectWorkQueueToService(&queue_index)) | 597 if (!SelectWorkQueueToService(&queue_index)) |
595 return; | 598 return; |
596 // Note that this function won't post another call to DoWork if one is | 599 // Note that this function won't post another call to DoWork if one is |
597 // already pending, so it is safe to call it in a loop. | 600 // already pending, so it is safe to call it in a loop. |
598 MaybePostDoWorkOnMainRunner(); | 601 MaybePostDoWorkOnMainRunner(); |
599 ProcessTaskFromWorkQueue(queue_index, i > 0, &previous_task); | 602 ProcessTaskFromWorkQueue(queue_index, i > 0, &previous_task); |
600 | 603 |
604 // Detect if the TaskQueueManager got deleted during the | |
Sami
2015/04/08 14:24:04
This should probably be moved to within ProcessTas
alex clarke (OOO till 29th)
2015/04/08 14:33:05
Done.
| |
605 // ProcessTaskFromWorkQueue call. | |
606 if (protect->HasOneRef()) | |
607 return; | |
608 | |
601 if (!UpdateWorkQueues(&previous_task)) | 609 if (!UpdateWorkQueues(&previous_task)) |
602 return; | 610 return; |
603 } | 611 } |
604 } | 612 } |
605 | 613 |
606 bool TaskQueueManager::SelectWorkQueueToService(size_t* out_queue_index) { | 614 bool TaskQueueManager::SelectWorkQueueToService(size_t* out_queue_index) { |
607 bool should_run = selector_->SelectWorkQueueToService(out_queue_index); | 615 bool should_run = selector_->SelectWorkQueueToService(out_queue_index); |
608 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( | 616 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( |
609 disabled_by_default_tracing_category_, "TaskQueueManager", this, | 617 disabled_by_default_tracing_category_, "TaskQueueManager", this, |
610 AsValueWithSelectorResult(should_run, *out_queue_index)); | 618 AsValueWithSelectorResult(should_run, *out_queue_index)); |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
705 state->EndArray(); | 713 state->EndArray(); |
706 state->BeginDictionary("selector"); | 714 state->BeginDictionary("selector"); |
707 selector_->AsValueInto(state.get()); | 715 selector_->AsValueInto(state.get()); |
708 state->EndDictionary(); | 716 state->EndDictionary(); |
709 if (should_run) | 717 if (should_run) |
710 state->SetInteger("selected_queue", selected_queue); | 718 state->SetInteger("selected_queue", selected_queue); |
711 return state; | 719 return state; |
712 } | 720 } |
713 | 721 |
714 } // namespace content | 722 } // namespace content |
OLD | NEW |