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

Unified Diff: ppapi/host/ppapi_host.h

Issue 454433002: PPAPI: Introduce concept of ResourceHosts "pinning" each other (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 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
« no previous file with comments | « base/memory/linked_ptr.h ('k') | ppapi/host/ppapi_host.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ppapi/host/ppapi_host.h
diff --git a/ppapi/host/ppapi_host.h b/ppapi/host/ppapi_host.h
index 4280c3cb74553efe05481c54833d7d6ff6351af1..10040fcc5da437659eb594560ebaa9713a5e5bbc 100644
--- a/ppapi/host/ppapi_host.h
+++ b/ppapi/host/ppapi_host.h
@@ -91,6 +91,16 @@ class PPAPI_HOST_EXPORT PpapiHost : public IPC::Sender, public IPC::Listener {
// Returns null if the resource doesn't exist.
host::ResourceHost* GetResourceHost(PP_Resource resource) const;
+ // Pin |owned_host| in memory so long as |owner_host| still needs it. Even
+ // if the plugin is done using |owned_host|, it will be kept alive until
+ // |owner_host| calls UnpinHost.
+ void PinHost(ResourceHost* owner_host, ResourceHost* owned_host);
+ // Called to indicate that the |owner_host| no longer requires |owned_host|.
+ // This may result in |owned_host| being deleted, if:
+ // (a) The plugin has finished with it, and
+ // (b) No other ResourceHosts have it pinned.
+ void UnpinHost(ResourceHost* owner_host, ResourceHost* owned_host);
+
private:
friend class InstanceMessageFilter;
@@ -116,6 +126,13 @@ class PPAPI_HOST_EXPORT PpapiHost : public IPC::Sender, public IPC::Listener {
void OnHostMsgAttachToPendingHost(PP_Resource resource, int pending_host_id);
void OnHostMsgResourceDestroyed(PP_Resource resource);
+ // Get a linked_ptr to the given ResourceHost. It's important to get at the
+ // right one; if we just do:
+ // linked_ptr<ResourceHost> ptr(raw_host_ptr);
+ // ...we get a linked_ptr with its own separate reference tracking, and we'll
+ // eventually double-delete |*raw_host_ptr|.
+ linked_ptr<ResourceHost> RawToLinkedPtr(ResourceHost* host);
+
// Non-owning pointer.
IPC::Sender* sender_;
@@ -143,6 +160,17 @@ class PPAPI_HOST_EXPORT PpapiHost : public IPC::Sender, public IPC::Listener {
PendingHostResourceMap pending_resource_hosts_;
int next_pending_resource_host_id_;
+ // Some hosts may need to Pin another host in memory for some amount of time.
+ // The main example at the time of writing is PepperGraphics2DHost, which may
+ // have a queue of ImageDataHosts that it requires for doing paints. This
+ // needs to work even if the plugin deletes the ImageDataResource. So
+ // owner_to_owned_map_ keeps a linked_ptr to any "pinned" hosts to make sure
+ // that they live long enough, even when the plugin is done with the resource
+ // and the host gets removed from resource_hosts_ or pending_resource_hosts_.
+ typedef std::map<linked_ptr<ResourceHost>, int > PinCountMap;
+ typedef std::map<ResourceHost*, PinCountMap> OwnerToOwnedHostMap;
+ OwnerToOwnedHostMap owner_to_owned_map_;
+
DISALLOW_COPY_AND_ASSIGN(PpapiHost);
};
« no previous file with comments | « base/memory/linked_ptr.h ('k') | ppapi/host/ppapi_host.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698