| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 #include "ppapi/proxy/plugin_resource_tracker.h" | 5 #include "ppapi/proxy/plugin_resource_tracker.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/singleton.h" |
| 8 #include "ppapi/proxy/plugin_dispatcher.h" | 9 #include "ppapi/proxy/plugin_dispatcher.h" |
| 9 #include "ppapi/proxy/ppapi_messages.h" | 10 #include "ppapi/proxy/ppapi_messages.h" |
| 10 #include "ppapi/proxy/plugin_resource.h" | 11 #include "ppapi/proxy/plugin_resource.h" |
| 11 #include "ppapi/proxy/serialized_var.h" | 12 #include "ppapi/proxy/serialized_var.h" |
| 12 | 13 |
| 13 namespace pp { | 14 namespace pp { |
| 14 namespace proxy { | 15 namespace proxy { |
| 15 | 16 |
| 16 PluginResourceTracker::ResourceInfo::ResourceInfo() : ref_count(0) { | 17 PluginResourceTracker::ResourceInfo::ResourceInfo() : ref_count(0) { |
| 17 } | 18 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 31 } | 32 } |
| 32 | 33 |
| 33 PluginResourceTracker::ResourceInfo& | 34 PluginResourceTracker::ResourceInfo& |
| 34 PluginResourceTracker::ResourceInfo::operator=( | 35 PluginResourceTracker::ResourceInfo::operator=( |
| 35 const ResourceInfo& other) { | 36 const ResourceInfo& other) { |
| 36 ref_count = other.ref_count; | 37 ref_count = other.ref_count; |
| 37 resource = other.resource; | 38 resource = other.resource; |
| 38 return *this; | 39 return *this; |
| 39 } | 40 } |
| 40 | 41 |
| 41 PluginResourceTracker::PluginResourceTracker(PluginDispatcher* dispatcher) | 42 PluginResourceTracker::PluginResourceTracker() { |
| 42 : dispatcher_(dispatcher) { | |
| 43 } | 43 } |
| 44 | 44 |
| 45 PluginResourceTracker::~PluginResourceTracker() { | 45 PluginResourceTracker::~PluginResourceTracker() { |
| 46 } | 46 } |
| 47 | 47 |
| 48 // static |
| 49 PluginResourceTracker* PluginResourceTracker::GetInstance() { |
| 50 return Singleton<PluginResourceTracker>::get(); |
| 51 } |
| 52 |
| 48 PluginResource* PluginResourceTracker::GetResourceObject( | 53 PluginResource* PluginResourceTracker::GetResourceObject( |
| 49 PP_Resource pp_resource) { | 54 PP_Resource pp_resource) { |
| 50 ResourceMap::iterator found = resource_map_.find(pp_resource); | 55 ResourceMap::iterator found = resource_map_.find(pp_resource); |
| 51 if (found == resource_map_.end()) | 56 if (found == resource_map_.end()) |
| 52 return NULL; | 57 return NULL; |
| 53 return found->second.resource.get(); | 58 return found->second.resource.get(); |
| 54 } | 59 } |
| 55 | 60 |
| 56 void PluginResourceTracker::AddResource(PP_Resource pp_resource, | 61 void PluginResourceTracker::AddResource(PP_Resource pp_resource, |
| 57 linked_ptr<PluginResource> object) { | 62 linked_ptr<PluginResource> object) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 74 return false; // We've not seen this resource before. | 79 return false; // We've not seen this resource before. |
| 75 | 80 |
| 76 // We have already seen this resource and the caller wants the plugin to | 81 // We have already seen this resource and the caller wants the plugin to |
| 77 // have one more ref to the object (this function is called when retuning | 82 // have one more ref to the object (this function is called when retuning |
| 78 // a resource). | 83 // a resource). |
| 79 // | 84 // |
| 80 // This is like the PluginVarTracker::ReceiveObjectPassRef. We do an AddRef | 85 // This is like the PluginVarTracker::ReceiveObjectPassRef. We do an AddRef |
| 81 // in the plugin for the additional ref, and then a Release in the renderer | 86 // in the plugin for the additional ref, and then a Release in the renderer |
| 82 // because the code in the renderer addrefed on behalf of the caller. | 87 // because the code in the renderer addrefed on behalf of the caller. |
| 83 found->second.ref_count++; | 88 found->second.ref_count++; |
| 84 dispatcher_->Send(new PpapiHostMsg_PPBCore_ReleaseResource( | 89 |
| 85 INTERFACE_ID_PPB_CORE, resource)); | 90 SendReleaseResourceToHost(resource, found->second.resource.get()); |
| 86 return true; | 91 return true; |
| 87 } | 92 } |
| 88 | 93 |
| 89 void PluginResourceTracker::ReleasePluginResourceRef( | 94 void PluginResourceTracker::ReleasePluginResourceRef( |
| 90 const PP_Resource& resource, | 95 const PP_Resource& resource, |
| 91 bool notify_browser_on_release) { | 96 bool notify_browser_on_release) { |
| 92 ResourceMap::iterator found = resource_map_.find(resource); | 97 ResourceMap::iterator found = resource_map_.find(resource); |
| 93 if (found == resource_map_.end()) | 98 if (found == resource_map_.end()) |
| 94 return; | 99 return; |
| 95 found->second.ref_count--; | 100 found->second.ref_count--; |
| 96 if (found->second.ref_count == 0) { | 101 if (found->second.ref_count == 0) { |
| 97 if (notify_browser_on_release) { | 102 if (notify_browser_on_release) |
| 98 dispatcher_->Send(new PpapiHostMsg_PPBCore_ReleaseResource( | 103 SendReleaseResourceToHost(resource, found->second.resource.get()); |
| 99 INTERFACE_ID_PPB_CORE, resource)); | |
| 100 } | |
| 101 resource_map_.erase(found); | 104 resource_map_.erase(found); |
| 102 } | 105 } |
| 103 } | 106 } |
| 104 | 107 |
| 108 void PluginResourceTracker::SendReleaseResourceToHost( |
| 109 PP_Resource resource_id, |
| 110 PluginResource* resource) { |
| 111 PluginDispatcher* dispatcher = |
| 112 PluginDispatcher::GetForInstance(resource->instance()); |
| 113 if (dispatcher) { |
| 114 dispatcher->Send(new PpapiHostMsg_PPBCore_ReleaseResource( |
| 115 INTERFACE_ID_PPB_CORE, resource_id)); |
| 116 } else { |
| 117 NOTREACHED(); |
| 118 } |
| 119 } |
| 120 |
| 105 } // namespace proxy | 121 } // namespace proxy |
| 106 } // namespace pp | 122 } // namespace pp |
| OLD | NEW |