| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 WEBKIT_PLUGINS_PPAPI_RESOURCE_TRACKER_H_ | 5 #ifndef WEBKIT_PLUGINS_PPAPI_RESOURCE_TRACKER_H_ |
| 6 #define WEBKIT_PLUGINS_PPAPI_RESOURCE_TRACKER_H_ | 6 #define WEBKIT_PLUGINS_PPAPI_RESOURCE_TRACKER_H_ |
| 7 | 7 |
| 8 #include <map> | 8 #include <map> |
| 9 #include <set> | 9 #include <set> |
| 10 #include <utility> | 10 #include <utility> |
| 11 | 11 |
| 12 #include "base/basictypes.h" | 12 #include "base/basictypes.h" |
| 13 #include "base/gtest_prod_util.h" | 13 #include "base/gtest_prod_util.h" |
| 14 #include "base/hash_tables.h" | 14 #include "base/hash_tables.h" |
| 15 #include "base/memory/linked_ptr.h" | 15 #include "base/memory/linked_ptr.h" |
| 16 #include "base/memory/ref_counted.h" | 16 #include "base/memory/ref_counted.h" |
| 17 #include "base/memory/scoped_ptr.h" | 17 #include "base/memory/scoped_ptr.h" |
| 18 #include "ppapi/c/pp_instance.h" | 18 #include "ppapi/c/pp_instance.h" |
| 19 #include "ppapi/c/pp_module.h" | 19 #include "ppapi/c/pp_module.h" |
| 20 #include "ppapi/c/pp_resource.h" | 20 #include "ppapi/c/pp_resource.h" |
| 21 #include "ppapi/proxy/interface_id.h" | 21 #include "ppapi/proxy/interface_id.h" |
| 22 #include "ppapi/shared_impl/function_group_base.h" | 22 #include "ppapi/shared_impl/function_group_base.h" |
| 23 #include "ppapi/shared_impl/tracker_base.h" | 23 #include "ppapi/shared_impl/tracker_base.h" |
| 24 #include "ppapi/shared_impl/var_tracker.h" |
| 24 | 25 |
| 25 typedef struct NPObject NPObject; | 26 typedef struct NPObject NPObject; |
| 26 | 27 |
| 27 namespace ppapi { | 28 namespace ppapi { |
| 28 class NPObjectVar; | 29 class NPObjectVar; |
| 29 class Var; | 30 class Var; |
| 30 } | 31 } |
| 31 | 32 |
| 32 namespace webkit { | 33 namespace webkit { |
| 33 namespace ppapi { | 34 namespace ppapi { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 56 scoped_refptr<Resource> GetResource(PP_Resource res) const; | 57 scoped_refptr<Resource> GetResource(PP_Resource res) const; |
| 57 | 58 |
| 58 // Increment resource's plugin refcount. See ResourceAndRefCount comments | 59 // Increment resource's plugin refcount. See ResourceAndRefCount comments |
| 59 // below. | 60 // below. |
| 60 bool AddRefResource(PP_Resource res); | 61 bool AddRefResource(PP_Resource res); |
| 61 bool UnrefResource(PP_Resource res); | 62 bool UnrefResource(PP_Resource res); |
| 62 | 63 |
| 63 // Returns the number of resources associated with this module. | 64 // Returns the number of resources associated with this module. |
| 64 uint32 GetLiveObjectsForInstance(PP_Instance instance) const; | 65 uint32 GetLiveObjectsForInstance(PP_Instance instance) const; |
| 65 | 66 |
| 66 // ResourceTrackerBase. | 67 // TrackerBase. |
| 67 virtual ::ppapi::ResourceObjectBase* GetResourceAPI( | 68 virtual ::ppapi::ResourceObjectBase* GetResourceAPI( |
| 68 PP_Resource res) OVERRIDE; | 69 PP_Resource res) OVERRIDE; |
| 69 virtual ::ppapi::FunctionGroupBase* GetFunctionAPI( | 70 virtual ::ppapi::FunctionGroupBase* GetFunctionAPI( |
| 70 PP_Instance pp_instance, | 71 PP_Instance pp_instance, |
| 71 pp::proxy::InterfaceID id) OVERRIDE; | 72 pp::proxy::InterfaceID id) OVERRIDE; |
| 72 virtual PP_Instance GetInstanceForResource(PP_Resource resource) OVERRIDE; | 73 virtual PP_Instance GetInstanceForResource(PP_Resource resource) OVERRIDE; |
| 74 virtual ::ppapi::VarTracker* GetVarTracker() OVERRIDE; |
| 73 | 75 |
| 74 // PP_Vars ------------------------------------------------------------------- | 76 // PP_Vars ------------------------------------------------------------------- |
| 75 | 77 |
| 76 // TrackerBase implementation. | |
| 77 virtual int32 AddVar(::ppapi::Var* var) OVERRIDE; | |
| 78 virtual scoped_refptr< ::ppapi::Var > GetVar(int32 var_id) const OVERRIDE; | |
| 79 virtual bool AddRefVar(int32 var_id) OVERRIDE; | |
| 80 virtual bool UnrefVar(int32 var_id) OVERRIDE; | |
| 81 | |
| 82 // Tracks all live NPObjectVar. This is so we can map between instance + | 78 // Tracks all live NPObjectVar. This is so we can map between instance + |
| 83 // NPObject and get the NPObjectVar corresponding to it. This Add/Remove | 79 // NPObject and get the NPObjectVar corresponding to it. This Add/Remove |
| 84 // function is called by the NPObjectVar when it is created and | 80 // function is called by the NPObjectVar when it is created and |
| 85 // destroyed. | 81 // destroyed. |
| 86 void AddNPObjectVar(::ppapi::NPObjectVar* object_var); | 82 void AddNPObjectVar(::ppapi::NPObjectVar* object_var); |
| 87 void RemoveNPObjectVar(::ppapi::NPObjectVar* object_var); | 83 void RemoveNPObjectVar(::ppapi::NPObjectVar* object_var); |
| 88 | 84 |
| 89 // Looks up a previously registered NPObjectVar for the given NPObject and | 85 // Looks up a previously registered NPObjectVar for the given NPObject and |
| 90 // instance. Returns NULL if there is no NPObjectVar corresponding to the | 86 // instance. Returns NULL if there is no NPObjectVar corresponding to the |
| 91 // given NPObject for the given instance. See AddNPObjectVar above. | 87 // given NPObject for the given instance. See AddNPObjectVar above. |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 // layer via the delegate, which may be in a random state of shutdown. | 171 // layer via the delegate, which may be in a random state of shutdown. |
| 176 // | 172 // |
| 177 // So effectively our rule is: any resources still around at shutdown are | 173 // So effectively our rule is: any resources still around at shutdown are |
| 178 // associated with leaked plugins in WebKit, so it's also OK to leak those | 174 // associated with leaked plugins in WebKit, so it's also OK to leak those |
| 179 // resources from here (avoiding the shutdown race). | 175 // resources from here (avoiding the shutdown race). |
| 180 static ResourceTracker* global_tracker_; | 176 static ResourceTracker* global_tracker_; |
| 181 | 177 |
| 182 // See SetSingletonOverride above. | 178 // See SetSingletonOverride above. |
| 183 static ResourceTracker* singleton_override_; | 179 static ResourceTracker* singleton_override_; |
| 184 | 180 |
| 185 // Last assigned resource & var ID. | 181 // Last assigned resource ID. |
| 186 PP_Resource last_resource_id_; | 182 PP_Resource last_resource_id_; |
| 187 int32 last_var_id_; | 183 |
| 184 ::ppapi::VarTracker var_tracker_; |
| 188 | 185 |
| 189 // For each PP_Resource, keep the Resource* (as refptr) and plugin use count. | 186 // For each PP_Resource, keep the Resource* (as refptr) and plugin use count. |
| 190 // This use count is different then Resource's RefCount, and is manipulated | 187 // This use count is different then Resource's RefCount, and is manipulated |
| 191 // using this AddRefResource/UnrefResource. When it drops to zero, we just | 188 // using this AddRefResource/UnrefResource. When it drops to zero, we just |
| 192 // remove the resource from this resource tracker, but the resource object | 189 // remove the resource from this resource tracker, but the resource object |
| 193 // will be alive so long as some scoped_refptr still holds it's | 190 // will be alive so long as some scoped_refptr still holds it's |
| 194 // reference. This prevents plugins from forcing destruction of Resource | 191 // reference. This prevents plugins from forcing destruction of Resource |
| 195 // objects. | 192 // objects. |
| 196 typedef std::pair<scoped_refptr<Resource>, size_t> ResourceAndRefCount; | 193 typedef std::pair<scoped_refptr<Resource>, size_t> ResourceAndRefCount; |
| 197 typedef base::hash_map<PP_Resource, ResourceAndRefCount> ResourceMap; | 194 typedef base::hash_map<PP_Resource, ResourceAndRefCount> ResourceMap; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 211 typedef std::map<PP_Module, PluginModule*> ModuleMap; | 208 typedef std::map<PP_Module, PluginModule*> ModuleMap; |
| 212 ModuleMap module_map_; | 209 ModuleMap module_map_; |
| 213 | 210 |
| 214 DISALLOW_COPY_AND_ASSIGN(ResourceTracker); | 211 DISALLOW_COPY_AND_ASSIGN(ResourceTracker); |
| 215 }; | 212 }; |
| 216 | 213 |
| 217 } // namespace ppapi | 214 } // namespace ppapi |
| 218 } // namespace webkit | 215 } // namespace webkit |
| 219 | 216 |
| 220 #endif // WEBKIT_PLUGINS_PPAPI_RESOURCE_TRACKER_H_ | 217 #endif // WEBKIT_PLUGINS_PPAPI_RESOURCE_TRACKER_H_ |
| OLD | NEW |