Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(185)

Unified Diff: ppapi/proxy/plugin_resource_tracker.cc

Issue 6334016: Refactor PPAPI proxy resource handling to maintain which host they came from,... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ppapi/proxy/plugin_resource_tracker.h ('k') | ppapi/proxy/plugin_resource_tracker_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ppapi/proxy/plugin_resource_tracker.cc
===================================================================
--- ppapi/proxy/plugin_resource_tracker.cc (revision 72840)
+++ ppapi/proxy/plugin_resource_tracker.cc (working copy)
@@ -14,6 +14,13 @@
namespace pp {
namespace proxy {
+namespace {
+
+// When non-NULL, this object overrides the ResourceTrackerSingleton.
+PluginResourceTracker* g_resource_tracker_override = NULL;
+
+} // namespace
+
PluginResourceTracker::ResourceInfo::ResourceInfo() : ref_count(0) {
}
@@ -39,14 +46,24 @@
return *this;
}
-PluginResourceTracker::PluginResourceTracker() {
+// Start counting resources at a high number to avoid collisions with vars (to
+// help debugging).
+PluginResourceTracker::PluginResourceTracker()
+ : last_resource_id_(0x00100000) {
}
PluginResourceTracker::~PluginResourceTracker() {
}
// static
+void PluginResourceTracker::SetInstanceForTest(PluginResourceTracker* tracker) {
+ g_resource_tracker_override = tracker;
+}
+
+// static
PluginResourceTracker* PluginResourceTracker::GetInstance() {
+ if (g_resource_tracker_override)
+ return g_resource_tracker_override;
return Singleton<PluginResourceTracker>::get();
}
@@ -58,37 +75,41 @@
return found->second.resource.get();
}
-void PluginResourceTracker::AddResource(PP_Resource pp_resource,
- linked_ptr<PluginResource> object) {
- DCHECK(resource_map_.find(pp_resource) == resource_map_.end());
- resource_map_[pp_resource] = ResourceInfo(1, object);
+PP_Resource PluginResourceTracker::AddResource(
+ linked_ptr<PluginResource> object) {
+ if (object->host_resource().is_null()) {
+ // Prevent adding null resources or GetResourceObject(0) will return a
+ // valid pointer!
+ NOTREACHED();
+ return 0;
+ }
+
+ PP_Resource plugin_resource = ++last_resource_id_;
+ DCHECK(resource_map_.find(plugin_resource) == resource_map_.end());
+ resource_map_[plugin_resource] = ResourceInfo(1, object);
+ host_resource_map_[object->host_resource()] = plugin_resource;
+ return plugin_resource;
}
void PluginResourceTracker::AddRefResource(PP_Resource resource) {
- resource_map_[resource].ref_count++;
+ ResourceMap::iterator found = resource_map_.find(resource);
+ if (found == resource_map_.end()) {
+ NOTREACHED();
+ return;
+ }
+ found->second.ref_count++;
}
void PluginResourceTracker::ReleaseResource(PP_Resource resource) {
ReleasePluginResourceRef(resource, true);
}
-bool PluginResourceTracker::PreparePreviouslyTrackedResource(
- PP_Resource resource) {
- ResourceMap::iterator found = resource_map_.find(resource);
- if (found == resource_map_.end())
- return false; // We've not seen this resource before.
-
- // We have already seen this resource and the caller wants the plugin to
- // have one more ref to the object (this function is called when retuning
- // a resource).
- //
- // This is like the PluginVarTracker::ReceiveObjectPassRef. We do an AddRef
- // in the plugin for the additional ref, and then a Release in the renderer
- // because the code in the renderer addrefed on behalf of the caller.
- found->second.ref_count++;
-
- SendReleaseResourceToHost(resource, found->second.resource.get());
- return true;
+PP_Resource PluginResourceTracker::PluginResourceForHostResource(
+ const HostResource& resource) const {
+ HostResourceMap::const_iterator found = host_resource_map_.find(resource);
+ if (found == host_resource_map_.end())
+ return 0;
+ return found->second;
}
void PluginResourceTracker::ReleasePluginResourceRef(
@@ -99,8 +120,10 @@
return;
found->second.ref_count--;
if (found->second.ref_count == 0) {
+ PluginResource* plugin_resource = found->second.resource.get();
if (notify_browser_on_release)
- SendReleaseResourceToHost(resource, found->second.resource.get());
+ SendReleaseResourceToHost(resource, plugin_resource);
+ host_resource_map_.erase(plugin_resource->host_resource());
resource_map_.erase(found);
}
}
@@ -112,7 +135,7 @@
PluginDispatcher::GetForInstance(resource->instance());
if (dispatcher) {
dispatcher->Send(new PpapiHostMsg_PPBCore_ReleaseResource(
- INTERFACE_ID_PPB_CORE, resource_id));
+ INTERFACE_ID_PPB_CORE, resource->host_resource()));
} else {
NOTREACHED();
}
« no previous file with comments | « ppapi/proxy/plugin_resource_tracker.h ('k') | ppapi/proxy/plugin_resource_tracker_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698