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

Side by Side Diff: third_party/WebKit/Source/platform/network/NetworkStateNotifier.cpp

Issue 2807073002: Removed local RefPtr objects created from PassRefPtr arguments. (Closed)
Patch Set: Created 3 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
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698