| 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 |