| Index: webkit/plugins/ppapi/resource_tracker.cc
|
| diff --git a/webkit/plugins/ppapi/resource_tracker.cc b/webkit/plugins/ppapi/resource_tracker.cc
|
| index 5e15103037531ca0f768c39782947e7fca3d1cb0..1405a302d7a3f7158f87e016853ff2eb6ac9bfb4 100644
|
| --- a/webkit/plugins/ppapi/resource_tracker.cc
|
| +++ b/webkit/plugins/ppapi/resource_tracker.cc
|
| @@ -50,10 +50,6 @@ struct ResourceTracker::InstanceData {
|
| // destroyed, it will notify us and we'll delete all associated data.
|
| PluginInstance* instance;
|
|
|
| - // Resources associated with the instance.
|
| - ResourceSet ref_resources;
|
| - std::set<Resource*> assoc_resources;
|
| -
|
| // 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
|
| @@ -65,16 +61,6 @@ struct ResourceTracker::InstanceData {
|
| function_proxies[::pp::proxy::INTERFACE_ID_COUNT];
|
| };
|
|
|
| -scoped_refptr<Resource> ResourceTracker::GetResource(PP_Resource res) const {
|
| - DLOG_IF(ERROR, !CheckIdType(res, ::ppapi::PP_ID_TYPE_RESOURCE))
|
| - << res << " is not a PP_Resource.";
|
| - ResourceMap::const_iterator result = live_resources_.find(res);
|
| - if (result == live_resources_.end()) {
|
| - return scoped_refptr<Resource>();
|
| - }
|
| - return result->second.first;
|
| -}
|
| -
|
| // static
|
| ResourceTracker* ResourceTracker::global_tracker_ = NULL;
|
| ResourceTracker* ResourceTracker::singleton_override_ = NULL;
|
| @@ -97,81 +83,6 @@ ResourceTracker* ResourceTracker::Get() {
|
| return global_tracker_;
|
| }
|
|
|
| -void ResourceTracker::ResourceCreated(Resource* resource,
|
| - PluginInstance* instance) {
|
| - if (!instance)
|
| - return;
|
| - PP_Instance pp_instance = instance->pp_instance();
|
| - DCHECK(pp_instance);
|
| - DCHECK(instance_map_.find(pp_instance) != instance_map_.end());
|
| - instance_map_[pp_instance]->assoc_resources.insert(resource);
|
| -}
|
| -
|
| -void ResourceTracker::ResourceDestroyed(Resource* resource) {
|
| - if (!resource->instance())
|
| - return;
|
| -
|
| - PP_Instance pp_instance = resource->instance()->pp_instance();
|
| - DCHECK(pp_instance);
|
| - DCHECK(instance_map_.find(pp_instance) != instance_map_.end());
|
| -
|
| - instance_map_[pp_instance]->assoc_resources.erase(resource);
|
| -}
|
| -
|
| -PP_Resource ResourceTracker::AddResource(Resource* resource) {
|
| - // If the plugin manages to create 1 billion resources, don't do crazy stuff.
|
| - if (last_resource_id_ ==
|
| - (std::numeric_limits<PP_Resource>::max() >> ::ppapi::kPPIdTypeBits))
|
| - return 0;
|
| -
|
| - // Add the resource with plugin use-count 1.
|
| - PP_Resource new_id = MakeTypedId(++last_resource_id_,
|
| - ::ppapi::PP_ID_TYPE_RESOURCE);
|
| - live_resources_.insert(std::make_pair(new_id, std::make_pair(resource, 1)));
|
| -
|
| - // Track associated with the instance.
|
| - PP_Instance pp_instance = resource->instance()->pp_instance();
|
| - DCHECK(instance_map_.find(pp_instance) != instance_map_.end());
|
| - instance_map_[pp_instance]->ref_resources.insert(new_id);
|
| - return new_id;
|
| -}
|
| -
|
| -bool ResourceTracker::AddRefResource(PP_Resource res) {
|
| - DLOG_IF(ERROR, !CheckIdType(res, ::ppapi::PP_ID_TYPE_RESOURCE))
|
| - << res << " is not a PP_Resource.";
|
| - ResourceMap::iterator i = live_resources_.find(res);
|
| - if (i != live_resources_.end()) {
|
| - // We don't protect against overflow, since a plugin as malicious as to ref
|
| - // once per every byte in the address space could have just as well unrefed
|
| - // one time too many.
|
| - ++i->second.second;
|
| - return true;
|
| - } else {
|
| - return false;
|
| - }
|
| -}
|
| -
|
| -bool ResourceTracker::UnrefResource(PP_Resource res) {
|
| - DLOG_IF(ERROR, !CheckIdType(res, ::ppapi::PP_ID_TYPE_RESOURCE))
|
| - << res << " is not a PP_Resource.";
|
| - ResourceMap::iterator i = live_resources_.find(res);
|
| - if (i != live_resources_.end()) {
|
| - if (!--i->second.second) {
|
| - Resource* to_release = i->second.first;
|
| - // LastPluginRefWasDeleted will clear the instance pointer, so save it
|
| - // first.
|
| - PP_Instance instance = to_release->instance()->pp_instance();
|
| - to_release->LastPluginRefWasDeleted();
|
| -
|
| - instance_map_[instance]->ref_resources.erase(res);
|
| - live_resources_.erase(i);
|
| - }
|
| - return true;
|
| - } else {
|
| - return false;
|
| - }
|
| -}
|
| -
|
| void ResourceTracker::CleanupInstanceData(PP_Instance instance,
|
| bool delete_instance) {
|
| DLOG_IF(ERROR, !CheckIdType(instance, ::ppapi::PP_ID_TYPE_INSTANCE))
|
| @@ -183,30 +94,6 @@ void ResourceTracker::CleanupInstanceData(PP_Instance instance,
|
| }
|
| InstanceData& data = *found->second;
|
|
|
| - // Force release all plugin references to resources associated with the
|
| - // deleted instance.
|
| - ResourceSet::iterator cur_res = data.ref_resources.begin();
|
| - while (cur_res != data.ref_resources.end()) {
|
| - ResourceMap::iterator found_resource = live_resources_.find(*cur_res);
|
| - if (found_resource == live_resources_.end()) {
|
| - NOTREACHED();
|
| - } else {
|
| - Resource* resource = found_resource->second.first;
|
| -
|
| - // Must delete from the resource set first since the resource's instance
|
| - // pointer will get zeroed out in LastPluginRefWasDeleted.
|
| - resource->LastPluginRefWasDeleted();
|
| - live_resources_.erase(*cur_res);
|
| - }
|
| -
|
| - // Iterators to a set are stable so we can iterate the set while the items
|
| - // are being deleted as long as we're careful not to delete the item we're
|
| - // holding an iterator to.
|
| - ResourceSet::iterator current = cur_res++;
|
| - data.ref_resources.erase(current);
|
| - }
|
| - DCHECK(data.ref_resources.empty());
|
| -
|
| // 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;
|
| @@ -225,36 +112,10 @@ void ResourceTracker::CleanupInstanceData(PP_Instance instance,
|
| }
|
| DCHECK(data.np_object_to_object_var.empty());
|
|
|
| - // Clear any resources that still reference this instance.
|
| - for (std::set<Resource*>::iterator res = data.assoc_resources.begin();
|
| - res != data.assoc_resources.end();
|
| - ++res)
|
| - (*res)->ClearInstance();
|
| - data.assoc_resources.clear();
|
| -
|
| if (delete_instance)
|
| instance_map_.erase(found);
|
| }
|
|
|
| -uint32 ResourceTracker::GetLiveObjectsForInstance(
|
| - PP_Instance instance) const {
|
| - InstanceMap::const_iterator found = instance_map_.find(instance);
|
| - if (found == instance_map_.end())
|
| - return 0;
|
| - return static_cast<uint32>(found->second->ref_resources.size() +
|
| - found->second->np_object_to_object_var.size());
|
| -}
|
| -
|
| -::ppapi::ResourceObjectBase* ResourceTracker::GetResourceAPI(
|
| - PP_Resource res) {
|
| - DLOG_IF(ERROR, !CheckIdType(res, ::ppapi::PP_ID_TYPE_RESOURCE))
|
| - << res << " is not a PP_Resource.";
|
| - ResourceMap::const_iterator result = live_resources_.find(res);
|
| - if (result == live_resources_.end())
|
| - return NULL;
|
| - return result->second.first.get();
|
| -}
|
| -
|
| ::ppapi::FunctionGroupBase* ResourceTracker::GetFunctionAPI(
|
| PP_Instance pp_instance,
|
| pp::proxy::InterfaceID id) {
|
| @@ -297,17 +158,14 @@ uint32 ResourceTracker::GetLiveObjectsForInstance(
|
| return proxy.get();
|
| }
|
|
|
| -PP_Instance ResourceTracker::GetInstanceForResource(PP_Resource pp_resource) {
|
| - scoped_refptr<Resource> resource(GetResource(pp_resource));
|
| - if (!resource.get())
|
| - return 0;
|
| - return resource->instance()->pp_instance();
|
| -}
|
| -
|
| ::ppapi::VarTracker* ResourceTracker::GetVarTracker() {
|
| return &var_tracker_;
|
| }
|
|
|
| +::ppapi::ResourceTracker* ResourceTracker::GetResourceTracker() {
|
| + return this;
|
| +}
|
| +
|
| void ResourceTracker::AddNPObjectVar(NPObjectVar* object_var) {
|
| DCHECK(instance_map_.find(object_var->pp_instance()) != instance_map_.end());
|
| InstanceData& data = *instance_map_[object_var->pp_instance()].get();
|
| @@ -346,6 +204,14 @@ NPObjectVar* ResourceTracker::NPObjectVarForNPObject(PP_Instance instance,
|
| return found->second;
|
| }
|
|
|
| +int ResourceTracker::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 ResourceTracker::AddInstance(PluginInstance* instance) {
|
| DCHECK(instance_map_.find(instance->pp_instance()) == instance_map_.end());
|
|
|
| @@ -363,14 +229,18 @@ PP_Instance ResourceTracker::AddInstance(PluginInstance* instance) {
|
|
|
| instance_map_[new_instance] = linked_ptr<InstanceData>(new InstanceData);
|
| instance_map_[new_instance]->instance = instance;
|
| +
|
| + DidCreateInstance(new_instance);
|
| return new_instance;
|
| }
|
|
|
| void ResourceTracker::InstanceDeleted(PP_Instance instance) {
|
| + DidDeleteInstance(instance);
|
| CleanupInstanceData(instance, true);
|
| }
|
|
|
| void ResourceTracker::InstanceCrashed(PP_Instance instance) {
|
| + DidDeleteInstance(instance);
|
| CleanupInstanceData(instance, false);
|
| }
|
|
|
|
|