| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 PPAPI_SHARED_IMPL_RESOURCE_TRACKER_H_ | 5 #ifndef PPAPI_SHARED_IMPL_RESOURCE_TRACKER_H_ |
| 6 #define PPAPI_SHARED_IMPL_RESOURCE_TRACKER_H_ | 6 #define PPAPI_SHARED_IMPL_RESOURCE_TRACKER_H_ |
| 7 | 7 |
| 8 #include <set> | 8 #include <set> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| 11 #include "base/hash_tables.h" | 11 #include "base/hash_tables.h" |
| 12 #include "base/memory/linked_ptr.h" | 12 #include "base/memory/linked_ptr.h" |
| 13 #include "base/memory/scoped_ptr.h" |
| 13 #include "base/memory/weak_ptr.h" | 14 #include "base/memory/weak_ptr.h" |
| 14 #include "base/threading/thread_checker.h" | 15 #include "base/threading/thread_checker.h" |
| 15 #include "base/threading/thread_checker_impl.h" | 16 #include "base/threading/thread_checker_impl.h" |
| 16 #include "ppapi/c/pp_instance.h" | 17 #include "ppapi/c/pp_instance.h" |
| 17 #include "ppapi/c/pp_resource.h" | 18 #include "ppapi/c/pp_resource.h" |
| 18 #include "ppapi/shared_impl/ppapi_shared_export.h" | 19 #include "ppapi/shared_impl/ppapi_shared_export.h" |
| 19 | 20 |
| 20 namespace ppapi { | 21 namespace ppapi { |
| 21 | 22 |
| 22 class Resource; | 23 class Resource; |
| 23 | 24 |
| 24 class PPAPI_SHARED_EXPORT ResourceTracker { | 25 class PPAPI_SHARED_EXPORT ResourceTracker { |
| 25 public: | 26 public: |
| 26 ResourceTracker(); | 27 // A SINGLE_THREADED ResourceTracker will use a thread-checker to make sure |
| 28 // it's always invoked on the same thread on which it was constructed. A |
| 29 // THREAD_SAFE ResourceTracker will check that the ProxyLock is held. See |
| 30 // CheckThreadingPreconditions() for more details. |
| 31 enum ThreadMode { SINGLE_THREADED, THREAD_SAFE }; |
| 32 explicit ResourceTracker(ThreadMode thread_mode); |
| 27 virtual ~ResourceTracker(); | 33 virtual ~ResourceTracker(); |
| 28 | 34 |
| 29 // The returned pointer will be NULL if there is no resource. The reference | 35 // The returned pointer will be NULL if there is no resource. The reference |
| 30 // count of the resource is unaffected. | 36 // count of the resource is unaffected. |
| 31 Resource* GetResource(PP_Resource res) const; | 37 Resource* GetResource(PP_Resource res) const; |
| 32 | 38 |
| 33 void AddRefResource(PP_Resource res); | 39 void AddRefResource(PP_Resource res); |
| 34 void ReleaseResource(PP_Resource res); | 40 void ReleaseResource(PP_Resource res); |
| 35 | 41 |
| 36 // Releases a reference on the given resource once the message loop returns. | 42 // Releases a reference on the given resource once the message loop returns. |
| 37 void ReleaseResourceSoon(PP_Resource res); | 43 void ReleaseResourceSoon(PP_Resource res); |
| 38 | 44 |
| 39 // Notifies the tracker that a new instance has been created. This must be | 45 // Notifies the tracker that a new instance has been created. This must be |
| 40 // called before creating any resources associated with the instance. | 46 // called before creating any resources associated with the instance. |
| 41 void DidCreateInstance(PP_Instance instance); | 47 void DidCreateInstance(PP_Instance instance); |
| 42 | 48 |
| 43 // Called when an instance is being deleted. All plugin refs for the | 49 // Called when an instance is being deleted. All plugin refs for the |
| 44 // associated resources will be force freed, and the resources (if they still | 50 // associated resources will be force freed, and the resources (if they still |
| 45 // exist) will be disassociated from the instance. | 51 // exist) will be disassociated from the instance. |
| 46 void DidDeleteInstance(PP_Instance instance); | 52 void DidDeleteInstance(PP_Instance instance); |
| 47 | 53 |
| 48 // Returns the number of resources associated with the given instance. | 54 // Returns the number of resources associated with the given instance. |
| 49 // Returns 0 if the instance isn't known. | 55 // Returns 0 if the instance isn't known. |
| 50 int GetLiveObjectsForInstance(PP_Instance instance) const; | 56 int GetLiveObjectsForInstance(PP_Instance instance) const; |
| 51 | 57 |
| 52 protected: | 58 protected: |
| 53 // This calls AddResource and RemoveResource. | 59 // This calls AddResource and RemoveResource. |
| 54 friend class Resource; | 60 friend class Resource; |
| 55 | 61 |
| 62 // On the host-side, make sure we are called on the right thread. On the |
| 63 // plugin side, make sure we have the proxy lock. |
| 64 void CheckThreadingPreconditions() const; |
| 65 |
| 56 // Adds the given resource to the tracker, associating it with the instance | 66 // Adds the given resource to the tracker, associating it with the instance |
| 57 // stored in the resource object. The new resource ID is returned, and the | 67 // stored in the resource object. The new resource ID is returned, and the |
| 58 // resource will have 0 plugin refcount. This is called by the resource | 68 // resource will have 0 plugin refcount. This is called by the resource |
| 59 // constructor. | 69 // constructor. |
| 60 // | 70 // |
| 61 // Returns 0 if the resource could not be added. | 71 // Returns 0 if the resource could not be added. |
| 62 virtual PP_Resource AddResource(Resource* object); | 72 virtual PP_Resource AddResource(Resource* object); |
| 63 | 73 |
| 64 // The opposite of AddResource, this removes the tracking information for | 74 // The opposite of AddResource, this removes the tracking information for |
| 65 // the given resource. It's called from the resource destructor. | 75 // the given resource. It's called from the resource destructor. |
| (...skipping 25 matching lines...) Expand all Loading... |
| 91 // | 101 // |
| 92 // A resource will be in this list as long as the object is alive. | 102 // A resource will be in this list as long as the object is alive. |
| 93 typedef std::pair<Resource*, int> ResourceAndRefCount; | 103 typedef std::pair<Resource*, int> ResourceAndRefCount; |
| 94 typedef base::hash_map<PP_Resource, ResourceAndRefCount> ResourceMap; | 104 typedef base::hash_map<PP_Resource, ResourceAndRefCount> ResourceMap; |
| 95 ResourceMap live_resources_; | 105 ResourceMap live_resources_; |
| 96 | 106 |
| 97 int32 last_resource_value_; | 107 int32 last_resource_value_; |
| 98 | 108 |
| 99 base::WeakPtrFactory<ResourceTracker> weak_ptr_factory_; | 109 base::WeakPtrFactory<ResourceTracker> weak_ptr_factory_; |
| 100 | 110 |
| 101 // TODO(raymes): We won't need to do thread checks once pepper calls are | 111 // On the host side, we want to check that we are only called on the main |
| 102 // allowed off of the main thread. | 112 // thread. This is to protect us from accidentally using the tracker from |
| 103 // See http://code.google.com/p/chromium/issues/detail?id=92909. | 113 // other threads (especially the IO thread). On the plugin side, the tracker |
| 104 #ifdef ENABLE_PEPPER_THREADING | 114 // is protected by the proxy lock and is thread-safe, so this will be NULL. |
| 105 base::ThreadCheckerDoNothing thread_checker_; | 115 scoped_ptr<base::ThreadChecker> thread_checker_; |
| 106 #else | |
| 107 // TODO(raymes): We've seen plugins (Flash) creating resources from random | |
| 108 // threads. Let's always crash for now in this case. Once we have a handle | |
| 109 // over how common this is, we can change ThreadCheckerImpl->ThreadChecker | |
| 110 // so that we only crash in debug mode. See | |
| 111 // https://code.google.com/p/chromium/issues/detail?id=146415. | |
| 112 base::ThreadCheckerImpl thread_checker_; | |
| 113 #endif | |
| 114 | 116 |
| 115 DISALLOW_COPY_AND_ASSIGN(ResourceTracker); | 117 DISALLOW_COPY_AND_ASSIGN(ResourceTracker); |
| 116 }; | 118 }; |
| 117 | 119 |
| 118 } // namespace ppapi | 120 } // namespace ppapi |
| 119 | 121 |
| 120 #endif // PPAPI_SHARED_IMPL_RESOURCE_TRACKER_H_ | 122 #endif // PPAPI_SHARED_IMPL_RESOURCE_TRACKER_H_ |
| OLD | NEW |