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

Unified Diff: ppapi/proxy/plugin_resource_tracker.cc

Issue 7629017: Add a unified resource tracker shared between the proxy and the impl. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address review comments Created 9 years, 4 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
Index: ppapi/proxy/plugin_resource_tracker.cc
diff --git a/ppapi/proxy/plugin_resource_tracker.cc b/ppapi/proxy/plugin_resource_tracker.cc
index a511fd94c6d1b85d85e16d92b7fea6dbc6a00220..ac4621eb7cea9ff699a773aba40d8b651835eadd 100644
--- a/ppapi/proxy/plugin_resource_tracker.cc
+++ b/ppapi/proxy/plugin_resource_tracker.cc
@@ -8,12 +8,13 @@
#include "base/memory/singleton.h"
#include "ppapi/proxy/plugin_dispatcher.h"
#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/proxy/plugin_resource.h"
#include "ppapi/proxy/serialized_var.h"
+#include "ppapi/shared_impl/resource.h"
#include "ppapi/shared_impl/tracker_base.h"
#include "ppapi/shared_impl/var.h"
using ppapi::HostResource;
+using ppapi::Resource;
namespace pp {
namespace proxy {
@@ -29,37 +30,8 @@ PluginResourceTracker* g_resource_tracker_override = NULL;
} // namespace
-PluginResourceTracker::ResourceInfo::ResourceInfo() : ref_count(0) {
-}
-
-PluginResourceTracker::ResourceInfo::ResourceInfo(int rc, PluginResource* r)
- : ref_count(rc),
- resource(r) {
-}
-
-PluginResourceTracker::ResourceInfo::ResourceInfo(const ResourceInfo& other)
- : ref_count(other.ref_count),
- resource(other.resource) {
- // Wire up the new shared resource tracker base to use our implementation.
- ::ppapi::TrackerBase::Init(&GetTrackerBase);
-}
-
-PluginResourceTracker::ResourceInfo::~ResourceInfo() {
-}
-
-PluginResourceTracker::ResourceInfo&
-PluginResourceTracker::ResourceInfo::operator=(
- const ResourceInfo& other) {
- ref_count = other.ref_count;
- resource = other.resource;
- return *this;
-}
-
-// Start counting resources at a high number to avoid collisions with vars (to
-// help debugging).
PluginResourceTracker::PluginResourceTracker()
- : var_tracker_test_override_(NULL),
- last_resource_id_(0x00100000) {
+ : var_tracker_test_override_(NULL) {
}
PluginResourceTracker::~PluginResourceTracker() {
@@ -83,39 +55,6 @@ PluginResourceTracker::GetTrackerBaseInstance() {
return GetInstance();
}
-PluginResource* PluginResourceTracker::GetResourceObject(
- PP_Resource pp_resource) {
- ResourceMap::iterator found = resource_map_.find(pp_resource);
- if (found == resource_map_.end())
- return NULL;
- return found->second.resource.get();
-}
-
-PP_Resource PluginResourceTracker::AddResource(PluginResource* object) {
- PP_Resource plugin_resource = ++last_resource_id_;
- DCHECK(resource_map_.find(plugin_resource) == resource_map_.end());
- resource_map_[plugin_resource] = ResourceInfo(1, object);
- if (!object->host_resource().is_null()) {
- // The host resource ID will be 0 for resources that only exist in the
- // plugin process. Don't add those to the list.
- host_resource_map_[object->host_resource()] = plugin_resource;
- }
- return plugin_resource;
-}
-
-void PluginResourceTracker::AddRefResource(PP_Resource resource) {
- 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);
-}
-
PP_Resource PluginResourceTracker::PluginResourceForHostResource(
const HostResource& resource) const {
HostResourceMap::const_iterator found = host_resource_map_.find(resource);
@@ -124,14 +63,6 @@ PP_Resource PluginResourceTracker::PluginResourceForHostResource(
return found->second;
}
-::ppapi::ResourceObjectBase* PluginResourceTracker::GetResourceAPI(
- PP_Resource res) {
- ResourceMap::iterator found = resource_map_.find(res);
- if (found == resource_map_.end())
- return NULL;
- return found->second.resource.get();
-}
-
::ppapi::FunctionGroupBase* PluginResourceTracker::GetFunctionAPI(
PP_Instance inst,
pp::proxy::InterfaceID id) {
@@ -141,46 +72,41 @@ PP_Resource PluginResourceTracker::PluginResourceForHostResource(
return NULL;
}
-PP_Instance PluginResourceTracker::GetInstanceForResource(
- PP_Resource resource) {
- ResourceMap::iterator found = resource_map_.find(resource);
- if (found == resource_map_.end())
- return 0;
- return found->second.resource->instance();
-}
-
ppapi::VarTracker* PluginResourceTracker::GetVarTracker() {
return &var_tracker();
}
-void PluginResourceTracker::ReleasePluginResourceRef(
- const PP_Resource& resource,
- bool notify_browser_on_release) {
- ResourceMap::iterator found = resource_map_.find(resource);
- if (found == resource_map_.end())
- return;
- found->second.ref_count--;
- if (found->second.ref_count == 0) {
- // Keep a reference while removing in case the destructor ends up
- // re-entering. That way, when the destructor is called, it's out of the
- // maps.
- scoped_refptr<PluginResource> plugin_resource = found->second.resource;
+ppapi::ResourceTracker* PluginResourceTracker::GetResourceTracker() {
+ return this;
+}
+
+PP_Resource PluginResourceTracker::AddResource(Resource* object) {
+ PP_Resource ret = ResourceTracker::AddResource(object);
+
+ // Some resources are plugin-only, so they don't have a host resource.
+ if (object->host_resource().host_resource())
+ host_resource_map_.insert(std::make_pair(object->host_resource(), ret));
+ return ret;
+}
+
+void PluginResourceTracker::RemoveResource(Resource* object) {
+ ResourceTracker::RemoveResource(object);
+
+ if (!object->host_resource().is_null()) {
+ // The host_resource will be NULL for proxy-only resources, which we
+ // obviously don't need to tell the host about.
+ DCHECK(host_resource_map_.find(object->host_resource()) !=
+ host_resource_map_.end());
+ host_resource_map_.erase(object->host_resource());
+
PluginDispatcher* dispatcher =
- PluginDispatcher::GetForInstance(plugin_resource->instance());
- HostResource host_resource = plugin_resource->host_resource();
- if (!host_resource.is_null())
- host_resource_map_.erase(host_resource);
- resource_map_.erase(found);
- plugin_resource = NULL;
-
- // dispatcher can be NULL if the plugin held on to a resource after the
- // instance was destroyed. In that case the browser-side resource has
- // already been freed correctly on the browser side. The host_resource
- // will be NULL for proxy-only resources, which we obviously don't need to
- // tell the host about.
- if (notify_browser_on_release && dispatcher && !host_resource.is_null()) {
+ PluginDispatcher::GetForInstance(object->pp_instance());
+ if (dispatcher) {
+ // The dispatcher can be NULL if the plugin held on to a resource after
+ // the instance was destroyed. In that case the browser-side resource has
+ // already been freed correctly on the browser side.
dispatcher->Send(new PpapiHostMsg_PPBCore_ReleaseResource(
- INTERFACE_ID_PPB_CORE, host_resource));
+ INTERFACE_ID_PPB_CORE, object->host_resource()));
}
}
}

Powered by Google App Engine
This is Rietveld 408576698