diff options
author | brettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-20 21:50:11 +0000 |
---|---|---|
committer | brettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-20 21:50:11 +0000 |
commit | 0bc2efd12616518e3952be87a078d53ab5adfca5 (patch) | |
tree | 5cb3aea9931d3d629a3dcc3d30a6806b4c411bb8 /webkit/plugins/ppapi/host_resource_tracker.cc | |
parent | a0c33d1073c9f10672aef2ab6e2eec4eb712827e (diff) | |
download | chromium_src-0bc2efd12616518e3952be87a078d53ab5adfca5.zip chromium_src-0bc2efd12616518e3952be87a078d53ab5adfca5.tar.gz chromium_src-0bc2efd12616518e3952be87a078d53ab5adfca5.tar.bz2 |
Split HostVarTracker out of HostResourceTracker.
For the shared stuff we have a ppapi/shared_impl/VarTracker and a
ppapi/shared_impl/ResourceTracker. The host side of the proxy inherits
HostResourceTracker from ResourceTracker and then adds a bunch of var tracking
stuff to that, which makes no sense.
This moves the var tracking stuff out into a separate HostVarTracker so that's
all in one object. The host version just adds the NPObject tracking on top of
the shared VarTracking.
BUG=
TEST=
Review URL: http://codereview.chromium.org/8322017
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@106593 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/plugins/ppapi/host_resource_tracker.cc')
-rw-r--r-- | webkit/plugins/ppapi/host_resource_tracker.cc | 95 |
1 files changed, 5 insertions, 90 deletions
diff --git a/webkit/plugins/ppapi/host_resource_tracker.cc b/webkit/plugins/ppapi/host_resource_tracker.cc index 63a37dd..69119e49 100644 --- a/webkit/plugins/ppapi/host_resource_tracker.cc +++ b/webkit/plugins/ppapi/host_resource_tracker.cc @@ -29,7 +29,6 @@ using ppapi::CheckIdType; using ppapi::MakeTypedId; using ppapi::NPObjectVar; using ppapi::PPIdType; -using ppapi::Var; namespace webkit { namespace ppapi { @@ -42,8 +41,6 @@ namespace { } // namespace -typedef std::map<NPObject*, NPObjectVar*> NPObjectToNPObjectVarMap; - struct HostResourceTracker::InstanceData { InstanceData() : instance(0) {} @@ -51,12 +48,6 @@ struct HostResourceTracker::InstanceData { // destroyed, it will notify us and we'll delete all associated data. PluginInstance* instance; - // Tracks all live NPObjectVars used by this module so we can map NPObjects - // to the corresponding object, and also release these properly if the - // instance goes away when there are still refs. These are non-owning - // references. - NPObjectToNPObjectVarMap np_object_to_object_var; - // Lazily allocated function proxies for the different interfaces. scoped_ptr< ::ppapi::FunctionGroupBase > function_proxies[::ppapi::proxy::INTERFACE_ID_COUNT]; @@ -70,39 +61,6 @@ HostResourceTracker::HostResourceTracker() { HostResourceTracker::~HostResourceTracker() { } -void HostResourceTracker::CleanupInstanceData(PP_Instance instance, - bool delete_instance) { - DLOG_IF(ERROR, !CheckIdType(instance, ::ppapi::PP_ID_TYPE_INSTANCE)) - << instance << " is not a PP_Instance."; - InstanceMap::iterator found = instance_map_.find(instance); - if (found == instance_map_.end()) { - NOTREACHED(); - return; - } - InstanceData& data = *found->second; - - // Force delete all var references. Need to make a copy so we can iterate over - // the map while deleting stuff from it. - NPObjectToNPObjectVarMap np_object_map_copy = data.np_object_to_object_var; - NPObjectToNPObjectVarMap::iterator cur_var = - np_object_map_copy.begin(); - while (cur_var != np_object_map_copy.end()) { - NPObjectToNPObjectVarMap::iterator current = cur_var++; - - // Clear the object from the var mapping and the live instance object list. - int32 var_id = current->second->GetExistingVarID(); - if (var_id) - live_vars_.erase(var_id); - - current->second->InstanceDeleted(); - data.np_object_to_object_var.erase(current->first); - } - DCHECK(data.np_object_to_object_var.empty()); - - if (delete_instance) - instance_map_.erase(found); -} - ::ppapi::FunctionGroupBase* HostResourceTracker::GetFunctionAPI( PP_Instance pp_instance, ::ppapi::proxy::InterfaceID id) { @@ -163,52 +121,6 @@ void HostResourceTracker::LastPluginRefWasDeleted(::ppapi::Resource* object) { } } -void HostResourceTracker::AddNPObjectVar(NPObjectVar* object_var) { - DCHECK(instance_map_.find(object_var->pp_instance()) != instance_map_.end()); - InstanceData& data = *instance_map_[object_var->pp_instance()].get(); - - DCHECK(data.np_object_to_object_var.find(object_var->np_object()) == - data.np_object_to_object_var.end()) << "NPObjectVar already in map"; - data.np_object_to_object_var[object_var->np_object()] = object_var; -} - -void HostResourceTracker::RemoveNPObjectVar(NPObjectVar* object_var) { - DCHECK(instance_map_.find(object_var->pp_instance()) != instance_map_.end()); - InstanceData& data = *instance_map_[object_var->pp_instance()].get(); - - NPObjectToNPObjectVarMap::iterator found = - data.np_object_to_object_var.find(object_var->np_object()); - if (found == data.np_object_to_object_var.end()) { - NOTREACHED() << "NPObjectVar not registered."; - return; - } - if (found->second != object_var) { - NOTREACHED() << "NPObjectVar doesn't match."; - return; - } - data.np_object_to_object_var.erase(found); -} - -NPObjectVar* HostResourceTracker::NPObjectVarForNPObject(PP_Instance instance, - NPObject* np_object) { - DCHECK(instance_map_.find(instance) != instance_map_.end()); - InstanceData& data = *instance_map_[instance].get(); - - NPObjectToNPObjectVarMap::iterator found = - data.np_object_to_object_var.find(np_object); - if (found == data.np_object_to_object_var.end()) - return NULL; - return found->second; -} - -int HostResourceTracker::GetLiveNPObjectVarsForInstance( - PP_Instance instance) const { - InstanceMap::const_iterator found = instance_map_.find(instance); - if (found == instance_map_.end()) - return 0; - return static_cast<int>(found->second->np_object_to_object_var.size()); -} - PP_Instance HostResourceTracker::AddInstance(PluginInstance* instance) { DCHECK(instance_map_.find(instance->pp_instance()) == instance_map_.end()); @@ -233,12 +145,15 @@ PP_Instance HostResourceTracker::AddInstance(PluginInstance* instance) { void HostResourceTracker::InstanceDeleted(PP_Instance instance) { DidDeleteInstance(instance); - CleanupInstanceData(instance, true); + HostGlobals::Get()->host_var_tracker()->ForceFreeNPObjectsForInstance( + instance); + instance_map_.erase(instance); } void HostResourceTracker::InstanceCrashed(PP_Instance instance) { DidDeleteInstance(instance); - CleanupInstanceData(instance, false); + HostGlobals::Get()->host_var_tracker()->ForceFreeNPObjectsForInstance( + instance); } PluginInstance* HostResourceTracker::GetInstance(PP_Instance instance) { |