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)) |
+ << 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) |
+ 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) { |