| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef PPAPI_HOST_PPAPI_HOST_H_ | 5 #ifndef PPAPI_HOST_PPAPI_HOST_H_ |
| 6 #define PPAPI_HOST_PPAPI_HOST_H_ | 6 #define PPAPI_HOST_PPAPI_HOST_H_ |
| 7 | 7 |
| 8 #include <map> | 8 #include <map> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 // ownership of the pointer. | 84 // ownership of the pointer. |
| 85 void AddHostFactoryFilter(scoped_ptr<HostFactory> filter); | 85 void AddHostFactoryFilter(scoped_ptr<HostFactory> filter); |
| 86 | 86 |
| 87 // Adds the given message filter to the host. The PpapiHost will take | 87 // Adds the given message filter to the host. The PpapiHost will take |
| 88 // ownership of the pointer. | 88 // ownership of the pointer. |
| 89 void AddInstanceMessageFilter(scoped_ptr<InstanceMessageFilter> filter); | 89 void AddInstanceMessageFilter(scoped_ptr<InstanceMessageFilter> filter); |
| 90 | 90 |
| 91 // Returns null if the resource doesn't exist. | 91 // Returns null if the resource doesn't exist. |
| 92 host::ResourceHost* GetResourceHost(PP_Resource resource) const; | 92 host::ResourceHost* GetResourceHost(PP_Resource resource) const; |
| 93 | 93 |
| 94 // Pin |owned_host| in memory so long as |owner_host| still needs it. Even |
| 95 // if the plugin is done using |owned_host|, it will be kept alive until |
| 96 // |owner_host| calls UnpinHost. |
| 97 void PinHost(ResourceHost* owner_host, ResourceHost* owned_host); |
| 98 // Called to indicate that the |owner_host| no longer requires |owned_host|. |
| 99 // This may result in |owned_host| being deleted, if: |
| 100 // (a) The plugin has finished with it, and |
| 101 // (b) No other ResourceHosts have it pinned. |
| 102 void UnpinHost(ResourceHost* owner_host, ResourceHost* owned_host); |
| 103 |
| 94 private: | 104 private: |
| 95 friend class InstanceMessageFilter; | 105 friend class InstanceMessageFilter; |
| 96 | 106 |
| 97 void HandleResourceCall( | 107 void HandleResourceCall( |
| 98 const proxy::ResourceMessageCallParams& params, | 108 const proxy::ResourceMessageCallParams& params, |
| 99 const IPC::Message& nested_msg, | 109 const IPC::Message& nested_msg, |
| 100 HostMessageContext* context); | 110 HostMessageContext* context); |
| 101 | 111 |
| 102 // Message handlers. | 112 // Message handlers. |
| 103 void OnHostMsgResourceCall(const proxy::ResourceMessageCallParams& params, | 113 void OnHostMsgResourceCall(const proxy::ResourceMessageCallParams& params, |
| 104 const IPC::Message& nested_msg); | 114 const IPC::Message& nested_msg); |
| 105 void OnHostMsgInProcessResourceCall( | 115 void OnHostMsgInProcessResourceCall( |
| 106 int routing_id, | 116 int routing_id, |
| 107 const proxy::ResourceMessageCallParams& params, | 117 const proxy::ResourceMessageCallParams& params, |
| 108 const IPC::Message& nested_msg); | 118 const IPC::Message& nested_msg); |
| 109 void OnHostMsgResourceSyncCall( | 119 void OnHostMsgResourceSyncCall( |
| 110 const proxy::ResourceMessageCallParams& params, | 120 const proxy::ResourceMessageCallParams& params, |
| 111 const IPC::Message& nested_msg, | 121 const IPC::Message& nested_msg, |
| 112 IPC::Message* reply_msg); | 122 IPC::Message* reply_msg); |
| 113 void OnHostMsgResourceCreated(const proxy::ResourceMessageCallParams& param, | 123 void OnHostMsgResourceCreated(const proxy::ResourceMessageCallParams& param, |
| 114 PP_Instance instance, | 124 PP_Instance instance, |
| 115 const IPC::Message& nested_msg); | 125 const IPC::Message& nested_msg); |
| 116 void OnHostMsgAttachToPendingHost(PP_Resource resource, int pending_host_id); | 126 void OnHostMsgAttachToPendingHost(PP_Resource resource, int pending_host_id); |
| 117 void OnHostMsgResourceDestroyed(PP_Resource resource); | 127 void OnHostMsgResourceDestroyed(PP_Resource resource); |
| 118 | 128 |
| 129 // Get a linked_ptr to the given ResourceHost. It's important to get at the |
| 130 // right one; if we just do: |
| 131 // linked_ptr<ResourceHost> ptr(raw_host_ptr); |
| 132 // ...we get a linked_ptr with its own separate reference tracking, and we'll |
| 133 // eventually double-delete |*raw_host_ptr|. |
| 134 linked_ptr<ResourceHost> RawToLinkedPtr(ResourceHost* host); |
| 135 |
| 119 // Non-owning pointer. | 136 // Non-owning pointer. |
| 120 IPC::Sender* sender_; | 137 IPC::Sender* sender_; |
| 121 | 138 |
| 122 PpapiPermissions permissions_; | 139 PpapiPermissions permissions_; |
| 123 | 140 |
| 124 // Filters for resource creation messages. Note that since we don't support | 141 // Filters for resource creation messages. Note that since we don't support |
| 125 // deleting these dynamically we don't need to worry about modifications | 142 // deleting these dynamically we don't need to worry about modifications |
| 126 // during iteration. If we add that capability, this should be replaced with | 143 // during iteration. If we add that capability, this should be replaced with |
| 127 // an ObserverList. | 144 // an ObserverList. |
| 128 ScopedVector<HostFactory> host_factory_filters_; | 145 ScopedVector<HostFactory> host_factory_filters_; |
| 129 | 146 |
| 130 // Filters for instance messages. Note that since we don't support deleting | 147 // Filters for instance messages. Note that since we don't support deleting |
| 131 // these dynamically we don't need to worry about modifications during | 148 // these dynamically we don't need to worry about modifications during |
| 132 // iteration. If we add that capability, this should be replaced with an | 149 // iteration. If we add that capability, this should be replaced with an |
| 133 // ObserverList. | 150 // ObserverList. |
| 134 ScopedVector<InstanceMessageFilter> instance_message_filters_; | 151 ScopedVector<InstanceMessageFilter> instance_message_filters_; |
| 135 | 152 |
| 136 typedef std::map<PP_Resource, linked_ptr<ResourceHost> > ResourceMap; | 153 typedef std::map<PP_Resource, linked_ptr<ResourceHost> > ResourceMap; |
| 137 ResourceMap resources_; | 154 ResourceMap resources_; |
| 138 | 155 |
| 139 // Resources that have been created in the host and have not yet had the | 156 // Resources that have been created in the host and have not yet had the |
| 140 // corresponding PluginResource associated with them. | 157 // corresponding PluginResource associated with them. |
| 141 // See PpapiHostMsg_AttachToPendingHost. | 158 // See PpapiHostMsg_AttachToPendingHost. |
| 142 typedef std::map<int, linked_ptr<ResourceHost> > PendingHostResourceMap; | 159 typedef std::map<int, linked_ptr<ResourceHost> > PendingHostResourceMap; |
| 143 PendingHostResourceMap pending_resource_hosts_; | 160 PendingHostResourceMap pending_resource_hosts_; |
| 144 int next_pending_resource_host_id_; | 161 int next_pending_resource_host_id_; |
| 145 | 162 |
| 163 // Some hosts may need to Pin another host in memory for some amount of time. |
| 164 // The main example at the time of writing is PepperGraphics2DHost, which may |
| 165 // have a queue of ImageDataHosts that it requires for doing paints. This |
| 166 // needs to work even if the plugin deletes the ImageDataResource. So |
| 167 // owner_to_owned_map_ keeps a linked_ptr to any "pinned" hosts to make sure |
| 168 // that they live long enough, even when the plugin is done with the resource |
| 169 // and the host gets removed from resource_hosts_ or pending_resource_hosts_. |
| 170 typedef std::map<linked_ptr<ResourceHost>, int > PinCountMap; |
| 171 typedef std::map<ResourceHost*, PinCountMap> OwnerToOwnedHostMap; |
| 172 OwnerToOwnedHostMap owner_to_owned_map_; |
| 173 |
| 146 DISALLOW_COPY_AND_ASSIGN(PpapiHost); | 174 DISALLOW_COPY_AND_ASSIGN(PpapiHost); |
| 147 }; | 175 }; |
| 148 | 176 |
| 149 } // namespace host | 177 } // namespace host |
| 150 } // namespace ppapi | 178 } // namespace ppapi |
| 151 | 179 |
| 152 #endif // PPAPI_HOST_PPAPIE_HOST_H_ | 180 #endif // PPAPI_HOST_PPAPIE_HOST_H_ |
| OLD | NEW |