Chromium Code Reviews| Index: webkit/plugins/ppapi/resource_tracker.cc |
| =================================================================== |
| --- webkit/plugins/ppapi/resource_tracker.cc (revision 74733) |
| +++ webkit/plugins/ppapi/resource_tracker.cc (working copy) |
| @@ -159,6 +159,64 @@ |
| } |
| } |
| +void ResourceTracker::CleanupInstanceData(PP_Instance instance, |
| + bool delete_instance) { |
| + DLOG_IF(ERROR, !CheckIdType(instance, PP_ID_TYPE_INSTANCE)) |
|
brettw
2011/02/14 23:00:10
This code just moved from above with no changes ex
|
| + << 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 release all plugin references to resources associated with the |
| + // deleted instance. |
| + ResourceSet::iterator cur_res = data.resources.begin(); |
| + while (cur_res != data.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(true); |
| + 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.resources.erase(current); |
| + } |
| + DCHECK(data.resources.empty()); |
| + |
| + // Force delete all var references. |
| + VarSet::iterator cur_var = data.object_vars.begin(); |
| + while (cur_var != data.object_vars.end()) { |
| + VarSet::iterator current = cur_var++; |
| + |
| + // Tell the corresponding ObjectVar that the instance is gone. |
| + PP_Var object_pp_var; |
| + object_pp_var.type = PP_VARTYPE_OBJECT; |
| + object_pp_var.value.as_id = *current; |
| + scoped_refptr<ObjectVar> object_var(ObjectVar::FromPPVar(object_pp_var)); |
| + if (object_var.get()) |
| + object_var->InstanceDeleted(); |
| + |
| + // Clear the object from the var mapping and the live instance object list. |
| + live_vars_.erase(*current); |
| + data.object_vars.erase(*current); |
| + } |
| + DCHECK(data.object_vars.empty()); |
| + |
| + if (delete_instance) |
|
brettw
2011/02/14 23:00:10
This if statement was added.
|
| + instance_map_.erase(found); |
| +} |
| + |
| uint32 ResourceTracker::GetLiveObjectsForInstance( |
| PP_Instance instance) const { |
| InstanceMap::const_iterator found = instance_map_.find(instance); |
| @@ -228,59 +286,11 @@ |
| } |
| void ResourceTracker::InstanceDeleted(PP_Instance instance) { |
| - DLOG_IF(ERROR, !CheckIdType(instance, 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; |
| + CleanupInstanceData(instance, true); |
| +} |
| - // Force release all plugin references to resources associated with the |
| - // deleted instance. |
| - ResourceSet::iterator cur_res = data.resources.begin(); |
| - while (cur_res != data.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(true); |
| - 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.resources.erase(current); |
| - } |
| - DCHECK(data.resources.empty()); |
| - |
| - // Force delete all var references. |
| - VarSet::iterator cur_var = data.object_vars.begin(); |
| - while (cur_var != data.object_vars.end()) { |
| - VarSet::iterator current = cur_var++; |
| - |
| - // Tell the corresponding ObjectVar that the instance is gone. |
| - PP_Var object_pp_var; |
| - object_pp_var.type = PP_VARTYPE_OBJECT; |
| - object_pp_var.value.as_id = *current; |
| - scoped_refptr<ObjectVar> object_var(ObjectVar::FromPPVar(object_pp_var)); |
| - if (object_var.get()) |
| - object_var->InstanceDeleted(); |
| - |
| - // Clear the object from the var mapping and the live instance object list. |
| - live_vars_.erase(*current); |
| - data.object_vars.erase(*current); |
| - } |
| - DCHECK(data.object_vars.empty()); |
| - |
| - instance_map_.erase(found); |
| +void ResourceTracker::InstanceCrashed(PP_Instance instance) { |
| + CleanupInstanceData(instance, false); |
| } |
| PluginInstance* ResourceTracker::GetInstance(PP_Instance instance) { |