Chromium Code Reviews| 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 #include "ppapi/proxy/plugin_var_tracker.h" | 5 #include "ppapi/proxy/plugin_var_tracker.h" |
| 6 | 6 |
| 7 #include "base/memory/ref_counted.h" | 7 #include "base/memory/ref_counted.h" |
| 8 #include "base/memory/singleton.h" | 8 #include "base/memory/singleton.h" |
| 9 #include "ppapi/c/ppb_var.h" | 9 #include "ppapi/c/ppb_var.h" |
| 10 #include "ppapi/proxy/plugin_array_buffer_var.h" | 10 #include "ppapi/proxy/plugin_array_buffer_var.h" |
| 11 #include "ppapi/proxy/plugin_dispatcher.h" | 11 #include "ppapi/proxy/plugin_dispatcher.h" |
| 12 #include "ppapi/proxy/ppapi_messages.h" | 12 #include "ppapi/proxy/ppapi_messages.h" |
| 13 #include "ppapi/proxy/proxy_object_var.h" | 13 #include "ppapi/proxy/proxy_object_var.h" |
| 14 #include "ppapi/shared_impl/api_id.h" | 14 #include "ppapi/shared_impl/api_id.h" |
| 15 #include "ppapi/shared_impl/var.h" | 15 #include "ppapi/shared_impl/var.h" |
| 16 | 16 |
| 17 #ifdef ENABLE_PEPPER_THREADING | |
| 18 #define CHECK_VALID_THREAD() do {} while(false) | |
| 19 #else | |
| 20 #define CHECK_VALID_THREAD() do { CalledOnValidThread(); } while(false) | |
|
yzshen1
2012/04/12 22:21:23
- We need to DCHECK the result of CalledOnValidThr
| |
| 21 #endif | |
| 22 | |
| 17 namespace ppapi { | 23 namespace ppapi { |
| 18 namespace proxy { | 24 namespace proxy { |
| 19 | 25 |
| 20 PluginVarTracker::HostVar::HostVar(PluginDispatcher* d, int32 i) | 26 PluginVarTracker::HostVar::HostVar(PluginDispatcher* d, int32 i) |
| 21 : dispatcher(d), | 27 : dispatcher(d), |
| 22 host_object_id(i) { | 28 host_object_id(i) { |
| 23 } | 29 } |
| 24 | 30 |
| 25 bool PluginVarTracker::HostVar::operator<(const HostVar& other) const { | 31 bool PluginVarTracker::HostVar::operator<(const HostVar& other) const { |
| 26 if (dispatcher < other.dispatcher) | 32 if (dispatcher < other.dispatcher) |
| 27 return true; | 33 return true; |
| 28 if (other.dispatcher < dispatcher) | 34 if (other.dispatcher < dispatcher) |
| 29 return false; | 35 return false; |
| 30 return host_object_id < other.host_object_id; | 36 return host_object_id < other.host_object_id; |
| 31 } | 37 } |
| 32 | 38 |
| 33 PluginVarTracker::PluginVarTracker() { | 39 PluginVarTracker::PluginVarTracker() { |
| 34 } | 40 } |
| 35 | 41 |
| 36 PluginVarTracker::~PluginVarTracker() { | 42 PluginVarTracker::~PluginVarTracker() { |
| 37 } | 43 } |
| 38 | 44 |
| 39 PP_Var PluginVarTracker::ReceiveObjectPassRef(const PP_Var& host_var, | 45 PP_Var PluginVarTracker::ReceiveObjectPassRef(const PP_Var& host_var, |
| 40 PluginDispatcher* dispatcher) { | 46 PluginDispatcher* dispatcher) { |
| 41 DCHECK(CalledOnValidThread()); | 47 CHECK_VALID_THREAD(); |
| 42 DCHECK(host_var.type == PP_VARTYPE_OBJECT); | 48 DCHECK(host_var.type == PP_VARTYPE_OBJECT); |
| 43 | 49 |
| 44 // Get the object. | 50 // Get the object. |
| 45 scoped_refptr<ProxyObjectVar> object( | 51 scoped_refptr<ProxyObjectVar> object( |
| 46 FindOrMakePluginVarFromHostVar(host_var, dispatcher)); | 52 FindOrMakePluginVarFromHostVar(host_var, dispatcher)); |
| 47 | 53 |
| 48 // Actually create the PP_Var, this will add all the tracking info but not | 54 // Actually create the PP_Var, this will add all the tracking info but not |
| 49 // adjust any refcounts. | 55 // adjust any refcounts. |
| 50 PP_Var ret = GetOrCreateObjectVarID(object.get()); | 56 PP_Var ret = GetOrCreateObjectVarID(object.get()); |
| 51 | 57 |
| 52 VarInfo& info = GetLiveVar(ret)->second; | 58 VarInfo& info = GetLiveVar(ret)->second; |
| 53 if (info.ref_count > 0) { | 59 if (info.ref_count > 0) { |
| 54 // We already had a reference to it before. That means the renderer now has | 60 // We already had a reference to it before. That means the renderer now has |
| 55 // two references on our behalf. We want to transfer that extra reference | 61 // two references on our behalf. We want to transfer that extra reference |
| 56 // to our list. This means we addref in the plugin, and release the extra | 62 // to our list. This means we addref in the plugin, and release the extra |
| 57 // one in the renderer. | 63 // one in the renderer. |
| 58 SendReleaseObjectMsg(*object); | 64 SendReleaseObjectMsg(*object); |
| 59 } | 65 } |
| 60 info.ref_count++; | 66 info.ref_count++; |
| 61 return ret; | 67 return ret; |
| 62 } | 68 } |
| 63 | 69 |
| 64 PP_Var PluginVarTracker::TrackObjectWithNoReference( | 70 PP_Var PluginVarTracker::TrackObjectWithNoReference( |
| 65 const PP_Var& host_var, | 71 const PP_Var& host_var, |
| 66 PluginDispatcher* dispatcher) { | 72 PluginDispatcher* dispatcher) { |
| 67 DCHECK(CalledOnValidThread()); | 73 CHECK_VALID_THREAD(); |
| 68 DCHECK(host_var.type == PP_VARTYPE_OBJECT); | 74 DCHECK(host_var.type == PP_VARTYPE_OBJECT); |
| 69 | 75 |
| 70 // Get the object. | 76 // Get the object. |
| 71 scoped_refptr<ProxyObjectVar> object( | 77 scoped_refptr<ProxyObjectVar> object( |
| 72 FindOrMakePluginVarFromHostVar(host_var, dispatcher)); | 78 FindOrMakePluginVarFromHostVar(host_var, dispatcher)); |
| 73 | 79 |
| 74 // Actually create the PP_Var, this will add all the tracking info but not | 80 // Actually create the PP_Var, this will add all the tracking info but not |
| 75 // adjust any refcounts. | 81 // adjust any refcounts. |
| 76 PP_Var ret = GetOrCreateObjectVarID(object.get()); | 82 PP_Var ret = GetOrCreateObjectVarID(object.get()); |
| 77 | 83 |
| 78 VarInfo& info = GetLiveVar(ret)->second; | 84 VarInfo& info = GetLiveVar(ret)->second; |
| 79 info.track_with_no_reference_count++; | 85 info.track_with_no_reference_count++; |
| 80 return ret; | 86 return ret; |
| 81 } | 87 } |
| 82 | 88 |
| 83 void PluginVarTracker::StopTrackingObjectWithNoReference( | 89 void PluginVarTracker::StopTrackingObjectWithNoReference( |
| 84 const PP_Var& plugin_var) { | 90 const PP_Var& plugin_var) { |
| 85 DCHECK(CalledOnValidThread()); | 91 CHECK_VALID_THREAD(); |
| 86 DCHECK(plugin_var.type == PP_VARTYPE_OBJECT); | 92 DCHECK(plugin_var.type == PP_VARTYPE_OBJECT); |
| 87 | 93 |
| 88 VarMap::iterator found = GetLiveVar(plugin_var); | 94 VarMap::iterator found = GetLiveVar(plugin_var); |
| 89 if (found == live_vars_.end()) { | 95 if (found == live_vars_.end()) { |
| 90 NOTREACHED(); | 96 NOTREACHED(); |
| 91 return; | 97 return; |
| 92 } | 98 } |
| 93 | 99 |
| 94 DCHECK(found->second.track_with_no_reference_count > 0); | 100 DCHECK(found->second.track_with_no_reference_count > 0); |
| 95 found->second.track_with_no_reference_count--; | 101 found->second.track_with_no_reference_count--; |
| 96 DeleteObjectInfoIfNecessary(found); | 102 DeleteObjectInfoIfNecessary(found); |
| 97 } | 103 } |
| 98 | 104 |
| 99 PP_Var PluginVarTracker::GetHostObject(const PP_Var& plugin_object) const { | 105 PP_Var PluginVarTracker::GetHostObject(const PP_Var& plugin_object) const { |
| 100 DCHECK(CalledOnValidThread()); | 106 CHECK_VALID_THREAD(); |
| 101 | 107 |
| 102 if (plugin_object.type != PP_VARTYPE_OBJECT) { | 108 if (plugin_object.type != PP_VARTYPE_OBJECT) { |
| 103 NOTREACHED(); | 109 NOTREACHED(); |
| 104 return PP_MakeUndefined(); | 110 return PP_MakeUndefined(); |
| 105 } | 111 } |
| 106 | 112 |
| 107 Var* var = GetVar(plugin_object); | 113 Var* var = GetVar(plugin_object); |
| 108 ProxyObjectVar* object = var->AsProxyObjectVar(); | 114 ProxyObjectVar* object = var->AsProxyObjectVar(); |
| 109 if (!object) { | 115 if (!object) { |
| 110 NOTREACHED(); | 116 NOTREACHED(); |
| 111 return PP_MakeUndefined(); | 117 return PP_MakeUndefined(); |
| 112 } | 118 } |
| 113 | 119 |
| 114 // Make a var with the host ID. | 120 // Make a var with the host ID. |
| 115 PP_Var ret = { PP_VARTYPE_OBJECT }; | 121 PP_Var ret = { PP_VARTYPE_OBJECT }; |
| 116 ret.value.as_id = object->host_var_id(); | 122 ret.value.as_id = object->host_var_id(); |
| 117 return ret; | 123 return ret; |
| 118 } | 124 } |
| 119 | 125 |
| 120 PluginDispatcher* PluginVarTracker::DispatcherForPluginObject( | 126 PluginDispatcher* PluginVarTracker::DispatcherForPluginObject( |
| 121 const PP_Var& plugin_object) const { | 127 const PP_Var& plugin_object) const { |
| 122 DCHECK(CalledOnValidThread()); | 128 CHECK_VALID_THREAD(); |
| 123 | 129 |
| 124 if (plugin_object.type != PP_VARTYPE_OBJECT) | 130 if (plugin_object.type != PP_VARTYPE_OBJECT) |
| 125 return NULL; | 131 return NULL; |
| 126 | 132 |
| 127 VarMap::const_iterator found = GetLiveVar(plugin_object); | 133 VarMap::const_iterator found = GetLiveVar(plugin_object); |
| 128 if (found == live_vars_.end()) | 134 if (found == live_vars_.end()) |
| 129 return NULL; | 135 return NULL; |
| 130 | 136 |
| 131 ProxyObjectVar* object = found->second.var->AsProxyObjectVar(); | 137 ProxyObjectVar* object = found->second.var->AsProxyObjectVar(); |
| 132 if (!object) | 138 if (!object) |
| 133 return NULL; | 139 return NULL; |
| 134 return object->dispatcher(); | 140 return object->dispatcher(); |
| 135 } | 141 } |
| 136 | 142 |
| 137 void PluginVarTracker::ReleaseHostObject(PluginDispatcher* dispatcher, | 143 void PluginVarTracker::ReleaseHostObject(PluginDispatcher* dispatcher, |
| 138 const PP_Var& host_object) { | 144 const PP_Var& host_object) { |
| 139 DCHECK(CalledOnValidThread()); | 145 CHECK_VALID_THREAD(); |
| 140 DCHECK(host_object.type == PP_VARTYPE_OBJECT); | 146 DCHECK(host_object.type == PP_VARTYPE_OBJECT); |
| 141 | 147 |
| 142 // Convert the host object to a normal var valid in the plugin. | 148 // Convert the host object to a normal var valid in the plugin. |
| 143 HostVarToPluginVarMap::iterator found = host_var_to_plugin_var_.find( | 149 HostVarToPluginVarMap::iterator found = host_var_to_plugin_var_.find( |
| 144 HostVar(dispatcher, static_cast<int32>(host_object.value.as_id))); | 150 HostVar(dispatcher, static_cast<int32>(host_object.value.as_id))); |
| 145 if (found == host_var_to_plugin_var_.end()) { | 151 if (found == host_var_to_plugin_var_.end()) { |
| 146 NOTREACHED(); | 152 NOTREACHED(); |
| 147 return; | 153 return; |
| 148 } | 154 } |
| 149 | 155 |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 265 VarMap::iterator ret = live_vars_.find(found->second); | 271 VarMap::iterator ret = live_vars_.find(found->second); |
| 266 DCHECK(ret != live_vars_.end()); | 272 DCHECK(ret != live_vars_.end()); |
| 267 | 273 |
| 268 // All objects should be proxy objects. | 274 // All objects should be proxy objects. |
| 269 DCHECK(ret->second.var->AsProxyObjectVar()); | 275 DCHECK(ret->second.var->AsProxyObjectVar()); |
| 270 return scoped_refptr<ProxyObjectVar>(ret->second.var->AsProxyObjectVar()); | 276 return scoped_refptr<ProxyObjectVar>(ret->second.var->AsProxyObjectVar()); |
| 271 } | 277 } |
| 272 | 278 |
| 273 } // namesace proxy | 279 } // namesace proxy |
| 274 } // namespace ppapi | 280 } // namespace ppapi |
| OLD | NEW |