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

Side by Side Diff: components/scheduler/base/time_domain.cc

Issue 1855453002: Remove registered_task_queues_ and associated DCHECKS from TimeDomain (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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
« no previous file with comments | « components/scheduler/base/time_domain.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "components/scheduler/base/time_domain.h" 5 #include "components/scheduler/base/time_domain.h"
6 6
7 #include <set> 7 #include <set>
8 8
9 #include "components/scheduler/base/task_queue_impl.h" 9 #include "components/scheduler/base/task_queue_impl.h"
10 #include "components/scheduler/base/task_queue_manager_delegate.h" 10 #include "components/scheduler/base/task_queue_manager_delegate.h"
11 #include "components/scheduler/base/work_queue.h" 11 #include "components/scheduler/base/work_queue.h"
12 #include "components/scheduler/scheduler_export.h" 12 #include "components/scheduler/scheduler_export.h"
13 13
14 namespace scheduler { 14 namespace scheduler {
15 15
16 TimeDomain::TimeDomain(Observer* observer) : observer_(observer) {} 16 TimeDomain::TimeDomain(Observer* observer) : observer_(observer) {}
17 17
18 TimeDomain::~TimeDomain() { 18 TimeDomain::~TimeDomain() {
19 DCHECK(main_thread_checker_.CalledOnValidThread()); 19 DCHECK(main_thread_checker_.CalledOnValidThread());
20 #if DCHECK_IS_ON()
21 DCHECK(registered_task_queues_.empty());
22 #endif
23 } 20 }
24 21
25 void TimeDomain::RegisterQueue(internal::TaskQueueImpl* queue) { 22 void TimeDomain::RegisterQueue(internal::TaskQueueImpl* queue) {
26 DCHECK(main_thread_checker_.CalledOnValidThread()); 23 DCHECK(main_thread_checker_.CalledOnValidThread());
27 DCHECK_EQ(queue->GetTimeDomain(), this); 24 DCHECK_EQ(queue->GetTimeDomain(), this);
28 #if DCHECK_IS_ON()
29 registered_task_queues_.insert(queue);
30 #endif
31 } 25 }
32 26
33 void TimeDomain::UnregisterQueue(internal::TaskQueueImpl* queue) { 27 void TimeDomain::UnregisterQueue(internal::TaskQueueImpl* queue) {
34 DCHECK(main_thread_checker_.CalledOnValidThread()); 28 DCHECK(main_thread_checker_.CalledOnValidThread());
35 DCHECK_EQ(queue->GetTimeDomain(), this); 29 DCHECK_EQ(queue->GetTimeDomain(), this);
36 UnregisterAsUpdatableTaskQueue(queue); 30 UnregisterAsUpdatableTaskQueue(queue);
37 #if DCHECK_IS_ON()
38 registered_task_queues_.erase(queue);
39 #endif
40 31
41 // We need to remove |task_queue| from delayed_wakeup_multimap_ which is a 32 // We need to remove |task_queue| from delayed_wakeup_multimap_ which is a
42 // little awkward since it's keyed by time. O(n) running time. 33 // little awkward since it's keyed by time. O(n) running time.
43 for (DelayedWakeupMultimap::iterator iter = delayed_wakeup_multimap_.begin(); 34 for (DelayedWakeupMultimap::iterator iter = delayed_wakeup_multimap_.begin();
44 iter != delayed_wakeup_multimap_.end();) { 35 iter != delayed_wakeup_multimap_.end();) {
45 if (iter->second == queue) { 36 if (iter->second == queue) {
46 // O(1) amortized. 37 // O(1) amortized.
47 iter = delayed_wakeup_multimap_.erase(iter); 38 iter = delayed_wakeup_multimap_.erase(iter);
48 } else { 39 } else {
49 iter++; 40 iter++;
50 } 41 }
51 } 42 }
52 } 43 }
53 44
54 void TimeDomain::MigrateQueue(internal::TaskQueueImpl* queue, 45 void TimeDomain::MigrateQueue(internal::TaskQueueImpl* queue,
55 TimeDomain* destination_time_domain) { 46 TimeDomain* destination_time_domain) {
56 DCHECK(main_thread_checker_.CalledOnValidThread()); 47 DCHECK(main_thread_checker_.CalledOnValidThread());
57 DCHECK_EQ(queue->GetTimeDomain(), this); 48 DCHECK_EQ(queue->GetTimeDomain(), this);
58 DCHECK(destination_time_domain); 49 DCHECK(destination_time_domain);
59 UnregisterAsUpdatableTaskQueue(queue); 50 UnregisterAsUpdatableTaskQueue(queue);
60 #if DCHECK_IS_ON()
61 DCHECK(registered_task_queues_.find(queue) != registered_task_queues_.end());
62 registered_task_queues_.erase(queue);
63
64 // NOTE it's the responsibility of the caller to make sure
65 // |queue->GetTimeDomain()| is updated.
66 destination_time_domain->registered_task_queues_.insert(queue);
67 #endif
68 51
69 base::TimeTicks destination_now = destination_time_domain->Now(); 52 base::TimeTicks destination_now = destination_time_domain->Now();
70 // We need to remove |task_queue| from delayed_wakeup_multimap_ which is a 53 // We need to remove |task_queue| from delayed_wakeup_multimap_ which is a
71 // little awkward since it's keyed by time. O(n) running time. 54 // little awkward since it's keyed by time. O(n) running time.
72 for (DelayedWakeupMultimap::iterator iter = delayed_wakeup_multimap_.begin(); 55 for (DelayedWakeupMultimap::iterator iter = delayed_wakeup_multimap_.begin();
73 iter != delayed_wakeup_multimap_.end();) { 56 iter != delayed_wakeup_multimap_.end();) {
74 if (iter->second == queue) { 57 if (iter->second == queue) {
75 destination_time_domain->ScheduleDelayedWork(queue, iter->first, 58 destination_time_domain->ScheduleDelayedWork(queue, iter->first,
76 destination_now); 59 destination_now);
77 // O(1) amortized. 60 // O(1) amortized.
78 iter = delayed_wakeup_multimap_.erase(iter); 61 iter = delayed_wakeup_multimap_.erase(iter);
79 } else { 62 } else {
80 iter++; 63 iter++;
81 } 64 }
82 } 65 }
83 } 66 }
84 67
85 void TimeDomain::ScheduleDelayedWork(internal::TaskQueueImpl* queue, 68 void TimeDomain::ScheduleDelayedWork(internal::TaskQueueImpl* queue,
86 base::TimeTicks delayed_run_time, 69 base::TimeTicks delayed_run_time,
87 base::TimeTicks now) { 70 base::TimeTicks now) {
88 DCHECK(main_thread_checker_.CalledOnValidThread()); 71 DCHECK(main_thread_checker_.CalledOnValidThread());
89 #if DCHECK_IS_ON()
90 DCHECK(registered_task_queues_.find(queue) != registered_task_queues_.end());
91 #endif
92 if (delayed_wakeup_multimap_.empty() || 72 if (delayed_wakeup_multimap_.empty() ||
93 delayed_run_time < delayed_wakeup_multimap_.begin()->first) { 73 delayed_run_time < delayed_wakeup_multimap_.begin()->first) {
94 base::TimeDelta delay = std::max(base::TimeDelta(), delayed_run_time - now); 74 base::TimeDelta delay = std::max(base::TimeDelta(), delayed_run_time - now);
95 RequestWakeup(now, delay); 75 RequestWakeup(now, delay);
96 } 76 }
97 77
98 delayed_wakeup_multimap_.insert(std::make_pair(delayed_run_time, queue)); 78 delayed_wakeup_multimap_.insert(std::make_pair(delayed_run_time, queue));
99 if (observer_) 79 if (observer_)
100 observer_->OnTimeDomainHasDelayedWork(); 80 observer_->OnTimeDomainHasDelayedWork();
101 } 81 }
102 82
103 void TimeDomain::RegisterAsUpdatableTaskQueue(internal::TaskQueueImpl* queue) { 83 void TimeDomain::RegisterAsUpdatableTaskQueue(internal::TaskQueueImpl* queue) {
104 #if DCHECK_IS_ON()
105 DCHECK(registered_task_queues_.find(queue) != registered_task_queues_.end());
106 #endif
107 { 84 {
108 base::AutoLock lock(newly_updatable_lock_); 85 base::AutoLock lock(newly_updatable_lock_);
109 newly_updatable_.push_back(queue); 86 newly_updatable_.push_back(queue);
110 } 87 }
111 if (observer_) 88 if (observer_)
112 observer_->OnTimeDomainHasImmediateWork(); 89 observer_->OnTimeDomainHasImmediateWork();
113 } 90 }
114 91
115 void TimeDomain::UnregisterAsUpdatableTaskQueue( 92 void TimeDomain::UnregisterAsUpdatableTaskQueue(
116 internal::TaskQueueImpl* queue) { 93 internal::TaskQueueImpl* queue) {
117 #if DCHECK_IS_ON()
118 DCHECK(registered_task_queues_.find(queue) != registered_task_queues_.end());
119 #endif
120 DCHECK(main_thread_checker_.CalledOnValidThread()); 94 DCHECK(main_thread_checker_.CalledOnValidThread());
121 95
122 updatable_queue_set_.erase(queue); 96 updatable_queue_set_.erase(queue);
123 97
124 base::AutoLock lock(newly_updatable_lock_); 98 base::AutoLock lock(newly_updatable_lock_);
125 // Remove all copies of |queue| from |newly_updatable_|. 99 // Remove all copies of |queue| from |newly_updatable_|.
126 for (size_t i = 0; i < newly_updatable_.size();) { 100 for (size_t i = 0; i < newly_updatable_.size();) {
127 if (newly_updatable_[i] == queue) { 101 if (newly_updatable_[i] == queue) {
128 // Move last element into slot #i and then compact. 102 // Move last element into slot #i and then compact.
129 newly_updatable_[i] = newly_updatable_.back(); 103 newly_updatable_[i] = newly_updatable_.back();
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 state->SetInteger("registered_delay_count", delayed_wakeup_multimap_.size()); 206 state->SetInteger("registered_delay_count", delayed_wakeup_multimap_.size());
233 if (!delayed_wakeup_multimap_.empty()) { 207 if (!delayed_wakeup_multimap_.empty()) {
234 base::TimeDelta delay = delayed_wakeup_multimap_.begin()->first - Now(); 208 base::TimeDelta delay = delayed_wakeup_multimap_.begin()->first - Now();
235 state->SetDouble("next_delay_ms", delay.InMillisecondsF()); 209 state->SetDouble("next_delay_ms", delay.InMillisecondsF());
236 } 210 }
237 AsValueIntoInternal(state); 211 AsValueIntoInternal(state);
238 state->EndDictionary(); 212 state->EndDictionary();
239 } 213 }
240 214
241 } // namespace scheduler 215 } // namespace scheduler
OLDNEW
« no previous file with comments | « components/scheduler/base/time_domain.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698