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: extensions/browser/api/api_resource_manager.h

Issue 2310593002: Remove call to IsRunningSequenceOnCurrentThread() from api_resource_manager.h. (Closed)
Patch Set: Created 4 years, 3 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 | « no previous file | 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 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 #ifndef EXTENSIONS_BROWSER_API_API_RESOURCE_MANAGER_H_ 5 #ifndef EXTENSIONS_BROWSER_API_API_RESOURCE_MANAGER_H_
6 #define EXTENSIONS_BROWSER_API_API_RESOURCE_MANAGER_H_ 6 #define EXTENSIONS_BROWSER_API_API_RESOURCE_MANAGER_H_
7 7
8 #include <map> 8 #include <map>
9 #include <memory> 9 #include <memory>
10 10
11 #include "base/containers/hash_tables.h" 11 #include "base/containers/hash_tables.h"
12 #include "base/memory/ptr_util.h" 12 #include "base/memory/ptr_util.h"
13 #include "base/memory/ref_counted.h" 13 #include "base/memory/ref_counted.h"
14 #include "base/scoped_observer.h" 14 #include "base/scoped_observer.h"
15 #include "base/sequence_checker.h"
15 #include "base/threading/non_thread_safe.h" 16 #include "base/threading/non_thread_safe.h"
16 #include "components/keyed_service/core/keyed_service.h" 17 #include "components/keyed_service/core/keyed_service.h"
17 #include "content/public/browser/browser_thread.h" 18 #include "content/public/browser/browser_thread.h"
18 #include "extensions/browser/browser_context_keyed_api_factory.h" 19 #include "extensions/browser/browser_context_keyed_api_factory.h"
19 #include "extensions/browser/extension_registry.h" 20 #include "extensions/browser/extension_registry.h"
20 #include "extensions/browser/extension_registry_observer.h" 21 #include "extensions/browser/extension_registry_observer.h"
21 #include "extensions/browser/process_manager.h" 22 #include "extensions/browser/process_manager.h"
22 #include "extensions/browser/process_manager_observer.h" 23 #include "extensions/browser/process_manager_observer.h"
23 #include "extensions/common/extension.h" 24 #include "extensions/common/extension.h"
24 25
25 namespace extensions { 26 namespace extensions {
26 class CastChannelAsyncApiFunction; 27 class CastChannelAsyncApiFunction;
27 28
28 namespace api { 29 namespace api {
29 class BluetoothSocketApiFunction; 30 class BluetoothSocketApiFunction;
30 class BluetoothSocketEventDispatcher; 31 class BluetoothSocketEventDispatcher;
31 class SerialEventDispatcher; 32 class SerialEventDispatcher;
32 class TCPServerSocketEventDispatcher; 33 class TCPServerSocketEventDispatcher;
33 class TCPSocketEventDispatcher; 34 class TCPSocketEventDispatcher;
34 class UDPSocketEventDispatcher; 35 class UDPSocketEventDispatcher;
35 } 36 }
36 37
37 template <typename T> 38 template <typename T>
38 struct NamedThreadTraits { 39 struct NamedThreadTraits {
39 static bool IsCalledOnValidThread() {
40 return content::BrowserThread::CurrentlyOn(T::kThreadId);
41 }
42
43 static bool IsMessageLoopValid() { 40 static bool IsMessageLoopValid() {
44 return content::BrowserThread::IsMessageLoopValid(T::kThreadId); 41 return content::BrowserThread::IsMessageLoopValid(T::kThreadId);
45 } 42 }
46 43
47 static scoped_refptr<base::SequencedTaskRunner> GetSequencedTaskRunner() { 44 static scoped_refptr<base::SequencedTaskRunner> GetSequencedTaskRunner() {
48 return content::BrowserThread::GetTaskRunnerForThread(T::kThreadId); 45 return content::BrowserThread::GetTaskRunnerForThread(T::kThreadId);
49 } 46 }
50 }; 47 };
51 48
52 // An ApiResourceManager manages the lifetime of a set of resources that 49 // An ApiResourceManager manages the lifetime of a set of resources that
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 static const bool kServiceIsNULLWhileTesting = true; 175 static const bool kServiceIsNULLWhileTesting = true;
179 176
180 // ApiResourceData class handles resource bookkeeping on a thread 177 // ApiResourceData class handles resource bookkeeping on a thread
181 // where resource lifetime is handled. 178 // where resource lifetime is handled.
182 class ApiResourceData : public base::RefCountedThreadSafe<ApiResourceData> { 179 class ApiResourceData : public base::RefCountedThreadSafe<ApiResourceData> {
183 public: 180 public:
184 typedef std::map<int, std::unique_ptr<T>> ApiResourceMap; 181 typedef std::map<int, std::unique_ptr<T>> ApiResourceMap;
185 // Lookup map from extension id's to allocated resource id's. 182 // Lookup map from extension id's to allocated resource id's.
186 typedef std::map<std::string, base::hash_set<int> > ExtensionToResourceMap; 183 typedef std::map<std::string, base::hash_set<int> > ExtensionToResourceMap;
187 184
188 ApiResourceData() : next_id_(1) {} 185 ApiResourceData() : next_id_(1) { sequence_checker_.DetachFromSequence(); }
189 186
190 // TODO(lazyboy): Pass unique_ptr<T> instead of T*. 187 // TODO(lazyboy): Pass unique_ptr<T> instead of T*.
191 int Add(T* api_resource) { 188 int Add(T* api_resource) {
192 DCHECK(ThreadingTraits::IsCalledOnValidThread()); 189 DCHECK(sequence_checker_.CalledOnValidSequence());
193 int id = GenerateId(); 190 int id = GenerateId();
194 if (id > 0) { 191 if (id > 0) {
195 api_resource_map_[id] = base::WrapUnique<T>(api_resource); 192 api_resource_map_[id] = base::WrapUnique<T>(api_resource);
196 193
197 const std::string& extension_id = api_resource->owner_extension_id(); 194 const std::string& extension_id = api_resource->owner_extension_id();
198 ExtensionToResourceMap::iterator it = 195 ExtensionToResourceMap::iterator it =
199 extension_resource_map_.find(extension_id); 196 extension_resource_map_.find(extension_id);
200 if (it == extension_resource_map_.end()) { 197 if (it == extension_resource_map_.end()) {
201 it = extension_resource_map_.insert( 198 it = extension_resource_map_.insert(
202 std::make_pair(extension_id, base::hash_set<int>())).first; 199 std::make_pair(extension_id, base::hash_set<int>())).first;
203 } 200 }
204 it->second.insert(id); 201 it->second.insert(id);
205 return id; 202 return id;
206 } 203 }
207 return 0; 204 return 0;
208 } 205 }
209 206
210 void Remove(const std::string& extension_id, int api_resource_id) { 207 void Remove(const std::string& extension_id, int api_resource_id) {
211 DCHECK(ThreadingTraits::IsCalledOnValidThread()); 208 DCHECK(sequence_checker_.CalledOnValidSequence());
212 if (GetOwnedResource(extension_id, api_resource_id)) { 209 if (GetOwnedResource(extension_id, api_resource_id)) {
213 ExtensionToResourceMap::iterator it = 210 ExtensionToResourceMap::iterator it =
214 extension_resource_map_.find(extension_id); 211 extension_resource_map_.find(extension_id);
215 it->second.erase(api_resource_id); 212 it->second.erase(api_resource_id);
216 api_resource_map_.erase(api_resource_id); 213 api_resource_map_.erase(api_resource_id);
217 } 214 }
218 } 215 }
219 216
220 T* Get(const std::string& extension_id, int api_resource_id) { 217 T* Get(const std::string& extension_id, int api_resource_id) {
221 DCHECK(ThreadingTraits::IsCalledOnValidThread()); 218 DCHECK(sequence_checker_.CalledOnValidSequence());
222 return GetOwnedResource(extension_id, api_resource_id); 219 return GetOwnedResource(extension_id, api_resource_id);
223 } 220 }
224 221
225 // Change the resource mapped to this |extension_id| at this 222 // Change the resource mapped to this |extension_id| at this
226 // |api_resource_id| to |resource|. Returns true and succeeds unless 223 // |api_resource_id| to |resource|. Returns true and succeeds unless
227 // |api_resource_id| does not already identify a resource held by 224 // |api_resource_id| does not already identify a resource held by
228 // |extension_id|. 225 // |extension_id|.
229 bool Replace(const std::string& extension_id, 226 bool Replace(const std::string& extension_id,
230 int api_resource_id, 227 int api_resource_id,
231 T* api_resource) { 228 T* api_resource) {
232 DCHECK(ThreadingTraits::IsCalledOnValidThread()); 229 DCHECK(sequence_checker_.CalledOnValidSequence());
233 T* old_resource = api_resource_map_[api_resource_id].get(); 230 T* old_resource = api_resource_map_[api_resource_id].get();
234 if (old_resource && extension_id == old_resource->owner_extension_id()) { 231 if (old_resource && extension_id == old_resource->owner_extension_id()) {
235 api_resource_map_[api_resource_id] = base::WrapUnique<T>(api_resource); 232 api_resource_map_[api_resource_id] = base::WrapUnique<T>(api_resource);
236 return true; 233 return true;
237 } 234 }
238 return false; 235 return false;
239 } 236 }
240 237
241 base::hash_set<int>* GetResourceIds(const std::string& extension_id) { 238 base::hash_set<int>* GetResourceIds(const std::string& extension_id) {
242 DCHECK(ThreadingTraits::IsCalledOnValidThread()); 239 DCHECK(sequence_checker_.CalledOnValidSequence());
243 return GetOwnedResourceIds(extension_id); 240 return GetOwnedResourceIds(extension_id);
244 } 241 }
245 242
246 void InitiateExtensionUnloadedCleanup(const std::string& extension_id) { 243 void InitiateExtensionUnloadedCleanup(const std::string& extension_id) {
247 if (ThreadingTraits::IsCalledOnValidThread()) {
248 CleanupResourcesFromUnloadedExtension(extension_id);
249 } else {
250 ThreadingTraits::GetSequencedTaskRunner()->PostTask( 244 ThreadingTraits::GetSequencedTaskRunner()->PostTask(
251 FROM_HERE, 245 FROM_HERE,
252 base::Bind(&ApiResourceData::CleanupResourcesFromUnloadedExtension, 246 base::Bind(&ApiResourceData::CleanupResourcesFromUnloadedExtension,
253 this, 247 this,
254 extension_id)); 248 extension_id));
255 }
256 } 249 }
257 250
258 void InitiateExtensionSuspendedCleanup(const std::string& extension_id) { 251 void InitiateExtensionSuspendedCleanup(const std::string& extension_id) {
259 if (ThreadingTraits::IsCalledOnValidThread()) {
260 CleanupResourcesFromSuspendedExtension(extension_id);
261 } else {
262 ThreadingTraits::GetSequencedTaskRunner()->PostTask( 252 ThreadingTraits::GetSequencedTaskRunner()->PostTask(
263 FROM_HERE, 253 FROM_HERE,
264 base::Bind(&ApiResourceData::CleanupResourcesFromSuspendedExtension, 254 base::Bind(&ApiResourceData::CleanupResourcesFromSuspendedExtension,
265 this, 255 this,
266 extension_id)); 256 extension_id));
267 }
268 } 257 }
269 258
270 void InititateCleanup() { 259 void InititateCleanup() {
271 if (ThreadingTraits::IsCalledOnValidThread()) {
272 Cleanup();
273 } else {
274 ThreadingTraits::GetSequencedTaskRunner()->PostTask( 260 ThreadingTraits::GetSequencedTaskRunner()->PostTask(
275 FROM_HERE, base::Bind(&ApiResourceData::Cleanup, this)); 261 FROM_HERE, base::Bind(&ApiResourceData::Cleanup, this));
276 }
277 } 262 }
278 263
279 private: 264 private:
280 friend class base::RefCountedThreadSafe<ApiResourceData>; 265 friend class base::RefCountedThreadSafe<ApiResourceData>;
281 266
282 virtual ~ApiResourceData() {} 267 virtual ~ApiResourceData() {}
283 268
284 T* GetOwnedResource(const std::string& extension_id, int api_resource_id) { 269 T* GetOwnedResource(const std::string& extension_id, int api_resource_id) {
285 const std::unique_ptr<T>& ptr = api_resource_map_[api_resource_id]; 270 const std::unique_ptr<T>& ptr = api_resource_map_[api_resource_id];
286 T* resource = ptr.get(); 271 T* resource = ptr.get();
287 if (resource && extension_id == resource->owner_extension_id()) 272 if (resource && extension_id == resource->owner_extension_id())
288 return resource; 273 return resource;
289 return NULL; 274 return NULL;
290 } 275 }
291 276
292 base::hash_set<int>* GetOwnedResourceIds(const std::string& extension_id) { 277 base::hash_set<int>* GetOwnedResourceIds(const std::string& extension_id) {
293 DCHECK(ThreadingTraits::IsCalledOnValidThread()); 278 DCHECK(sequence_checker_.CalledOnValidSequence());
294 ExtensionToResourceMap::iterator it = 279 ExtensionToResourceMap::iterator it =
295 extension_resource_map_.find(extension_id); 280 extension_resource_map_.find(extension_id);
296 if (it == extension_resource_map_.end()) 281 if (it == extension_resource_map_.end())
297 return NULL; 282 return NULL;
298 return &(it->second); 283 return &(it->second);
299 } 284 }
300 285
301 void CleanupResourcesFromUnloadedExtension( 286 void CleanupResourcesFromUnloadedExtension(
302 const std::string& extension_id) { 287 const std::string& extension_id) {
303 CleanupResourcesFromExtension(extension_id, true); 288 CleanupResourcesFromExtension(extension_id, true);
304 } 289 }
305 290
306 void CleanupResourcesFromSuspendedExtension( 291 void CleanupResourcesFromSuspendedExtension(
307 const std::string& extension_id) { 292 const std::string& extension_id) {
308 CleanupResourcesFromExtension(extension_id, false); 293 CleanupResourcesFromExtension(extension_id, false);
309 } 294 }
310 295
311 void CleanupResourcesFromExtension(const std::string& extension_id, 296 void CleanupResourcesFromExtension(const std::string& extension_id,
312 bool remove_all) { 297 bool remove_all) {
313 DCHECK(ThreadingTraits::IsCalledOnValidThread()); 298 DCHECK(sequence_checker_.CalledOnValidSequence());
314 299
315 ExtensionToResourceMap::iterator it = 300 ExtensionToResourceMap::iterator it =
316 extension_resource_map_.find(extension_id); 301 extension_resource_map_.find(extension_id);
317 if (it == extension_resource_map_.end()) 302 if (it == extension_resource_map_.end())
318 return; 303 return;
319 304
320 // Remove all resources, or the non persistent ones only if |remove_all| 305 // Remove all resources, or the non persistent ones only if |remove_all|
321 // is false. 306 // is false.
322 base::hash_set<int>& resource_ids = it->second; 307 base::hash_set<int>& resource_ids = it->second;
323 for (base::hash_set<int>::iterator it = resource_ids.begin(); 308 for (base::hash_set<int>::iterator it = resource_ids.begin();
(...skipping 15 matching lines...) Expand all
339 } 324 }
340 } // end for 325 } // end for
341 326
342 // Remove extension entry if we removed all its resources. 327 // Remove extension entry if we removed all its resources.
343 if (resource_ids.size() == 0) { 328 if (resource_ids.size() == 0) {
344 extension_resource_map_.erase(extension_id); 329 extension_resource_map_.erase(extension_id);
345 } 330 }
346 } 331 }
347 332
348 void Cleanup() { 333 void Cleanup() {
349 DCHECK(ThreadingTraits::IsCalledOnValidThread()); 334 DCHECK(sequence_checker_.CalledOnValidSequence());
350 335
351 api_resource_map_.clear(); 336 api_resource_map_.clear();
352 extension_resource_map_.clear(); 337 extension_resource_map_.clear();
353 } 338 }
354 339
355 int GenerateId() { return next_id_++; } 340 int GenerateId() { return next_id_++; }
356 341
357 int next_id_; 342 int next_id_;
358 ApiResourceMap api_resource_map_; 343 ApiResourceMap api_resource_map_;
359 ExtensionToResourceMap extension_resource_map_; 344 ExtensionToResourceMap extension_resource_map_;
345 base::SequenceChecker sequence_checker_;
360 }; 346 };
361 347
362 content::NotificationRegistrar registrar_; 348 content::NotificationRegistrar registrar_;
363 scoped_refptr<ApiResourceData> data_; 349 scoped_refptr<ApiResourceData> data_;
364 350
365 ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> 351 ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
366 extension_registry_observer_; 352 extension_registry_observer_;
367 ScopedObserver<ProcessManager, ProcessManagerObserver> 353 ScopedObserver<ProcessManager, ProcessManagerObserver>
368 process_manager_observer_; 354 process_manager_observer_;
369 }; 355 };
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 // 393 //
408 // 394 //
409 // template <> 395 // template <>
410 // BrowserContextKeyedAPIFactory<ApiResourceManager<WorkerPoolResource> >* 396 // BrowserContextKeyedAPIFactory<ApiResourceManager<WorkerPoolResource> >*
411 // ApiResourceManager<WorkerPoolPoolResource, 397 // ApiResourceManager<WorkerPoolPoolResource,
412 // WorkerPoolThreadTraits>::GetFactoryInstance() { 398 // WorkerPoolThreadTraits>::GetFactoryInstance() {
413 // return g_factory.Pointer(); 399 // return g_factory.Pointer();
414 // } 400 // }
415 template <typename T> 401 template <typename T>
416 struct WorkerPoolThreadTraits { 402 struct WorkerPoolThreadTraits {
417 static bool IsCalledOnValidThread() {
418 return content::BrowserThread::GetBlockingPool()
419 ->IsRunningSequenceOnCurrentThread(
420 content::BrowserThread::GetBlockingPool()->GetNamedSequenceToken(
421 T::kSequenceToken));
422 }
423
424 static bool IsMessageLoopValid() { 403 static bool IsMessageLoopValid() {
425 return content::BrowserThread::GetBlockingPool() != NULL; 404 return content::BrowserThread::GetBlockingPool() != NULL;
426 } 405 }
427 406
428 static scoped_refptr<base::SequencedTaskRunner> GetSequencedTaskRunner() { 407 static scoped_refptr<base::SequencedTaskRunner> GetSequencedTaskRunner() {
429 return content::BrowserThread::GetBlockingPool() 408 return content::BrowserThread::GetBlockingPool()
430 ->GetSequencedTaskRunnerWithShutdownBehavior( 409 ->GetSequencedTaskRunnerWithShutdownBehavior(
431 content::BrowserThread::GetBlockingPool()->GetNamedSequenceToken( 410 content::BrowserThread::GetBlockingPool()->GetNamedSequenceToken(
432 T::kSequenceToken), 411 T::kSequenceToken),
433 T::kShutdownBehavior); 412 T::kShutdownBehavior);
434 } 413 }
435 }; 414 };
436 415
437 } // namespace extensions 416 } // namespace extensions
438 417
439 #endif // EXTENSIONS_BROWSER_API_API_RESOURCE_MANAGER_H_ 418 #endif // EXTENSIONS_BROWSER_API_API_RESOURCE_MANAGER_H_
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698