OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. | 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 BLINK_FROM_HERE, | 151 BLINK_FROM_HERE, |
152 CrossThreadBind(&NetworkStateNotifier::NotifyObserversOnTaskRunner, | 152 CrossThreadBind(&NetworkStateNotifier::NotifyObserversOnTaskRunner, |
153 CrossThreadUnretained(this), | 153 CrossThreadUnretained(this), |
154 CrossThreadUnretained(&map), type, task_runner, state)); | 154 CrossThreadUnretained(&map), type, task_runner, state)); |
155 } | 155 } |
156 } | 156 } |
157 | 157 |
158 void NetworkStateNotifier::NotifyObserversOnTaskRunner( | 158 void NetworkStateNotifier::NotifyObserversOnTaskRunner( |
159 ObserverListMap* map, | 159 ObserverListMap* map, |
160 ObserverType type, | 160 ObserverType type, |
161 PassRefPtr<WebTaskRunner> pass_task_runner, | 161 RefPtr<WebTaskRunner> task_runner, |
162 const NetworkState& state) { | 162 const NetworkState& state) { |
163 RefPtr<WebTaskRunner> task_runner = pass_task_runner; | |
164 ObserverList* observer_list = LockAndFindObserverList(*map, task_runner); | 163 ObserverList* observer_list = LockAndFindObserverList(*map, task_runner); |
165 | 164 |
166 // The context could have been removed before the notification task got to | 165 // The context could have been removed before the notification task got to |
167 // run. | 166 // run. |
168 if (!observer_list) | 167 if (!observer_list) |
169 return; | 168 return; |
170 | 169 |
171 DCHECK(task_runner->RunsTasksOnCurrentThread()); | 170 DCHECK(task_runner->RunsTasksOnCurrentThread()); |
172 | 171 |
173 observer_list->iterating = true; | 172 observer_list->iterating = true; |
(...skipping 10 matching lines...) Expand all Loading... |
184 observer_list->observers[i]->ConnectionChange(state.type, | 183 observer_list->observers[i]->ConnectionChange(state.type, |
185 state.max_bandwidth_mbps); | 184 state.max_bandwidth_mbps); |
186 continue; | 185 continue; |
187 } | 186 } |
188 NOTREACHED(); | 187 NOTREACHED(); |
189 } | 188 } |
190 | 189 |
191 observer_list->iterating = false; | 190 observer_list->iterating = false; |
192 | 191 |
193 if (!observer_list->zeroed_observers.IsEmpty()) | 192 if (!observer_list->zeroed_observers.IsEmpty()) |
194 CollectZeroedObservers(*map, observer_list, task_runner); | 193 CollectZeroedObservers(*map, observer_list, std::move(task_runner)); |
195 } | 194 } |
196 | 195 |
197 void NetworkStateNotifier::AddObserver(ObserverListMap& map, | 196 void NetworkStateNotifier::AddObserver(ObserverListMap& map, |
198 NetworkStateObserver* observer, | 197 NetworkStateObserver* observer, |
199 PassRefPtr<WebTaskRunner> task_runner) { | 198 PassRefPtr<WebTaskRunner> task_runner) { |
200 DCHECK(task_runner->RunsTasksOnCurrentThread()); | 199 DCHECK(task_runner->RunsTasksOnCurrentThread()); |
201 DCHECK(observer); | 200 DCHECK(observer); |
202 | 201 |
203 MutexLocker locker(mutex_); | 202 MutexLocker locker(mutex_); |
204 ObserverListMap::AddResult result = | 203 ObserverListMap::AddResult result = |
205 map.insert(std::move(task_runner), nullptr); | 204 map.insert(std::move(task_runner), nullptr); |
206 if (result.is_new_entry) | 205 if (result.is_new_entry) |
207 result.stored_value->value = WTF::MakeUnique<ObserverList>(); | 206 result.stored_value->value = WTF::MakeUnique<ObserverList>(); |
208 | 207 |
209 DCHECK(result.stored_value->value->observers.Find(observer) == kNotFound); | 208 DCHECK(result.stored_value->value->observers.Find(observer) == kNotFound); |
210 result.stored_value->value->observers.push_back(observer); | 209 result.stored_value->value->observers.push_back(observer); |
211 } | 210 } |
212 | 211 |
213 void NetworkStateNotifier::RemoveObserver( | 212 void NetworkStateNotifier::RemoveObserver(ObserverListMap& map, |
214 ObserverListMap& map, | 213 NetworkStateObserver* observer, |
215 NetworkStateObserver* observer, | 214 RefPtr<WebTaskRunner> task_runner) { |
216 PassRefPtr<WebTaskRunner> pass_task_runner) { | |
217 RefPtr<WebTaskRunner> task_runner = pass_task_runner; | |
218 DCHECK(task_runner->RunsTasksOnCurrentThread()); | 215 DCHECK(task_runner->RunsTasksOnCurrentThread()); |
219 DCHECK(observer); | 216 DCHECK(observer); |
220 | 217 |
221 ObserverList* observer_list = LockAndFindObserverList(map, task_runner); | 218 ObserverList* observer_list = LockAndFindObserverList(map, task_runner); |
222 if (!observer_list) | 219 if (!observer_list) |
223 return; | 220 return; |
224 | 221 |
225 Vector<NetworkStateObserver*>& observers = observer_list->observers; | 222 Vector<NetworkStateObserver*>& observers = observer_list->observers; |
226 size_t index = observers.Find(observer); | 223 size_t index = observers.Find(observer); |
227 if (index != kNotFound) { | 224 if (index != kNotFound) { |
228 observers[index] = 0; | 225 observers[index] = 0; |
229 observer_list->zeroed_observers.push_back(index); | 226 observer_list->zeroed_observers.push_back(index); |
230 } | 227 } |
231 | 228 |
232 if (!observer_list->iterating && !observer_list->zeroed_observers.IsEmpty()) | 229 if (!observer_list->iterating && !observer_list->zeroed_observers.IsEmpty()) |
233 CollectZeroedObservers(map, observer_list, task_runner); | 230 CollectZeroedObservers(map, observer_list, std::move(task_runner)); |
234 } | 231 } |
235 | 232 |
236 NetworkStateNotifier::ObserverList* | 233 NetworkStateNotifier::ObserverList* |
237 NetworkStateNotifier::LockAndFindObserverList( | 234 NetworkStateNotifier::LockAndFindObserverList( |
238 ObserverListMap& map, | 235 ObserverListMap& map, |
239 PassRefPtr<WebTaskRunner> task_runner) { | 236 PassRefPtr<WebTaskRunner> task_runner) { |
240 MutexLocker locker(mutex_); | 237 MutexLocker locker(mutex_); |
241 ObserverListMap::iterator it = map.Find(task_runner); | 238 ObserverListMap::iterator it = map.Find(task_runner); |
242 return it == map.end() ? nullptr : it->value.get(); | 239 return it == map.end() ? nullptr : it->value.get(); |
243 } | 240 } |
(...skipping 12 matching lines...) Expand all Loading... |
256 | 253 |
257 list->zeroed_observers.Clear(); | 254 list->zeroed_observers.Clear(); |
258 | 255 |
259 if (list->observers.IsEmpty()) { | 256 if (list->observers.IsEmpty()) { |
260 MutexLocker locker(mutex_); | 257 MutexLocker locker(mutex_); |
261 map.erase(task_runner); // deletes list | 258 map.erase(task_runner); // deletes list |
262 } | 259 } |
263 } | 260 } |
264 | 261 |
265 } // namespace blink | 262 } // namespace blink |
OLD | NEW |