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/dev/ppp_class_deprecated.h" | 9 #include "ppapi/c/dev/ppp_class_deprecated.h" |
10 #include "ppapi/c/ppb_var.h" | 10 #include "ppapi/c/ppb_var.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 } | 24 } |
25 | 25 |
26 bool PluginVarTracker::HostVar::operator<(const HostVar& other) const { | 26 bool PluginVarTracker::HostVar::operator<(const HostVar& other) const { |
27 if (dispatcher < other.dispatcher) | 27 if (dispatcher < other.dispatcher) |
28 return true; | 28 return true; |
29 if (other.dispatcher < dispatcher) | 29 if (other.dispatcher < dispatcher) |
30 return false; | 30 return false; |
31 return host_object_id < other.host_object_id; | 31 return host_object_id < other.host_object_id; |
32 } | 32 } |
33 | 33 |
34 PluginVarTracker::PluginVarTracker() : VarTracker(THREAD_SAFE) { | 34 PluginVarTracker::PluginVarTracker() { |
35 } | 35 } |
36 | 36 |
37 PluginVarTracker::~PluginVarTracker() { | 37 PluginVarTracker::~PluginVarTracker() { |
38 } | 38 } |
39 | 39 |
40 PP_Var PluginVarTracker::ReceiveObjectPassRef(const PP_Var& host_var, | 40 PP_Var PluginVarTracker::ReceiveObjectPassRef(const PP_Var& host_var, |
41 PluginDispatcher* dispatcher) { | 41 PluginDispatcher* dispatcher) { |
42 CheckThreadingPreconditions(); | 42 DCHECK(CalledOnValidThread()); |
43 DCHECK(host_var.type == PP_VARTYPE_OBJECT); | 43 DCHECK(host_var.type == PP_VARTYPE_OBJECT); |
44 | 44 |
45 // Get the object. | 45 // Get the object. |
46 scoped_refptr<ProxyObjectVar> object( | 46 scoped_refptr<ProxyObjectVar> object( |
47 FindOrMakePluginVarFromHostVar(host_var, dispatcher)); | 47 FindOrMakePluginVarFromHostVar(host_var, dispatcher)); |
48 | 48 |
49 // Actually create the PP_Var, this will add all the tracking info but not | 49 // Actually create the PP_Var, this will add all the tracking info but not |
50 // adjust any refcounts. | 50 // adjust any refcounts. |
51 PP_Var ret = GetOrCreateObjectVarID(object.get()); | 51 PP_Var ret = GetOrCreateObjectVarID(object.get()); |
52 | 52 |
53 VarInfo& info = GetLiveVar(ret)->second; | 53 VarInfo& info = GetLiveVar(ret)->second; |
54 if (info.ref_count > 0) { | 54 if (info.ref_count > 0) { |
55 // We already had a reference to it before. That means the renderer now has | 55 // We already had a reference to it before. That means the renderer now has |
56 // two references on our behalf. We want to transfer that extra reference | 56 // two references on our behalf. We want to transfer that extra reference |
57 // to our list. This means we addref in the plugin, and release the extra | 57 // to our list. This means we addref in the plugin, and release the extra |
58 // one in the renderer. | 58 // one in the renderer. |
59 SendReleaseObjectMsg(*object); | 59 SendReleaseObjectMsg(*object); |
60 } | 60 } |
61 info.ref_count++; | 61 info.ref_count++; |
62 return ret; | 62 return ret; |
63 } | 63 } |
64 | 64 |
65 PP_Var PluginVarTracker::TrackObjectWithNoReference( | 65 PP_Var PluginVarTracker::TrackObjectWithNoReference( |
66 const PP_Var& host_var, | 66 const PP_Var& host_var, |
67 PluginDispatcher* dispatcher) { | 67 PluginDispatcher* dispatcher) { |
68 CheckThreadingPreconditions(); | 68 DCHECK(CalledOnValidThread()); |
69 DCHECK(host_var.type == PP_VARTYPE_OBJECT); | 69 DCHECK(host_var.type == PP_VARTYPE_OBJECT); |
70 | 70 |
71 // Get the object. | 71 // Get the object. |
72 scoped_refptr<ProxyObjectVar> object( | 72 scoped_refptr<ProxyObjectVar> object( |
73 FindOrMakePluginVarFromHostVar(host_var, dispatcher)); | 73 FindOrMakePluginVarFromHostVar(host_var, dispatcher)); |
74 | 74 |
75 // Actually create the PP_Var, this will add all the tracking info but not | 75 // Actually create the PP_Var, this will add all the tracking info but not |
76 // adjust any refcounts. | 76 // adjust any refcounts. |
77 PP_Var ret = GetOrCreateObjectVarID(object.get()); | 77 PP_Var ret = GetOrCreateObjectVarID(object.get()); |
78 | 78 |
79 VarInfo& info = GetLiveVar(ret)->second; | 79 VarInfo& info = GetLiveVar(ret)->second; |
80 info.track_with_no_reference_count++; | 80 info.track_with_no_reference_count++; |
81 return ret; | 81 return ret; |
82 } | 82 } |
83 | 83 |
84 void PluginVarTracker::StopTrackingObjectWithNoReference( | 84 void PluginVarTracker::StopTrackingObjectWithNoReference( |
85 const PP_Var& plugin_var) { | 85 const PP_Var& plugin_var) { |
86 CheckThreadingPreconditions(); | 86 DCHECK(CalledOnValidThread()); |
87 DCHECK(plugin_var.type == PP_VARTYPE_OBJECT); | 87 DCHECK(plugin_var.type == PP_VARTYPE_OBJECT); |
88 | 88 |
89 VarMap::iterator found = GetLiveVar(plugin_var); | 89 VarMap::iterator found = GetLiveVar(plugin_var); |
90 if (found == live_vars_.end()) { | 90 if (found == live_vars_.end()) { |
91 NOTREACHED(); | 91 NOTREACHED(); |
92 return; | 92 return; |
93 } | 93 } |
94 | 94 |
95 DCHECK(found->second.track_with_no_reference_count > 0); | 95 DCHECK(found->second.track_with_no_reference_count > 0); |
96 found->second.track_with_no_reference_count--; | 96 found->second.track_with_no_reference_count--; |
97 DeleteObjectInfoIfNecessary(found); | 97 DeleteObjectInfoIfNecessary(found); |
98 } | 98 } |
99 | 99 |
100 PP_Var PluginVarTracker::GetHostObject(const PP_Var& plugin_object) const { | 100 PP_Var PluginVarTracker::GetHostObject(const PP_Var& plugin_object) const { |
101 CheckThreadingPreconditions(); | 101 DCHECK(CalledOnValidThread()); |
| 102 |
102 if (plugin_object.type != PP_VARTYPE_OBJECT) { | 103 if (plugin_object.type != PP_VARTYPE_OBJECT) { |
103 NOTREACHED(); | 104 NOTREACHED(); |
104 return PP_MakeUndefined(); | 105 return PP_MakeUndefined(); |
105 } | 106 } |
106 | 107 |
107 Var* var = GetVar(plugin_object); | 108 Var* var = GetVar(plugin_object); |
108 ProxyObjectVar* object = var->AsProxyObjectVar(); | 109 ProxyObjectVar* object = var->AsProxyObjectVar(); |
109 if (!object) { | 110 if (!object) { |
110 NOTREACHED(); | 111 NOTREACHED(); |
111 return PP_MakeUndefined(); | 112 return PP_MakeUndefined(); |
112 } | 113 } |
113 | 114 |
114 // Make a var with the host ID. | 115 // Make a var with the host ID. |
115 PP_Var ret = { PP_VARTYPE_OBJECT }; | 116 PP_Var ret = { PP_VARTYPE_OBJECT }; |
116 ret.value.as_id = object->host_var_id(); | 117 ret.value.as_id = object->host_var_id(); |
117 return ret; | 118 return ret; |
118 } | 119 } |
119 | 120 |
120 PluginDispatcher* PluginVarTracker::DispatcherForPluginObject( | 121 PluginDispatcher* PluginVarTracker::DispatcherForPluginObject( |
121 const PP_Var& plugin_object) const { | 122 const PP_Var& plugin_object) const { |
122 CheckThreadingPreconditions(); | 123 DCHECK(CalledOnValidThread()); |
| 124 |
123 if (plugin_object.type != PP_VARTYPE_OBJECT) | 125 if (plugin_object.type != PP_VARTYPE_OBJECT) |
124 return NULL; | 126 return NULL; |
125 | 127 |
126 VarMap::const_iterator found = GetLiveVar(plugin_object); | 128 VarMap::const_iterator found = GetLiveVar(plugin_object); |
127 if (found == live_vars_.end()) | 129 if (found == live_vars_.end()) |
128 return NULL; | 130 return NULL; |
129 | 131 |
130 ProxyObjectVar* object = found->second.var->AsProxyObjectVar(); | 132 ProxyObjectVar* object = found->second.var->AsProxyObjectVar(); |
131 if (!object) | 133 if (!object) |
132 return NULL; | 134 return NULL; |
133 return object->dispatcher(); | 135 return object->dispatcher(); |
134 } | 136 } |
135 | 137 |
136 void PluginVarTracker::ReleaseHostObject(PluginDispatcher* dispatcher, | 138 void PluginVarTracker::ReleaseHostObject(PluginDispatcher* dispatcher, |
137 const PP_Var& host_object) { | 139 const PP_Var& host_object) { |
138 CheckThreadingPreconditions(); | 140 DCHECK(CalledOnValidThread()); |
139 DCHECK(host_object.type == PP_VARTYPE_OBJECT); | 141 DCHECK(host_object.type == PP_VARTYPE_OBJECT); |
140 | 142 |
141 // Convert the host object to a normal var valid in the plugin. | 143 // Convert the host object to a normal var valid in the plugin. |
142 HostVarToPluginVarMap::iterator found = host_var_to_plugin_var_.find( | 144 HostVarToPluginVarMap::iterator found = host_var_to_plugin_var_.find( |
143 HostVar(dispatcher, static_cast<int32>(host_object.value.as_id))); | 145 HostVar(dispatcher, static_cast<int32>(host_object.value.as_id))); |
144 if (found == host_var_to_plugin_var_.end()) { | 146 if (found == host_var_to_plugin_var_.end()) { |
145 NOTREACHED(); | 147 NOTREACHED(); |
146 return; | 148 return; |
147 } | 149 } |
148 | 150 |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 int id, | 386 int id, |
385 PP_Instance instance, | 387 PP_Instance instance, |
386 base::SharedMemoryHandle* handle, | 388 base::SharedMemoryHandle* handle, |
387 uint32* size_in_bytes) { | 389 uint32* size_in_bytes) { |
388 NOTREACHED(); | 390 NOTREACHED(); |
389 return false; | 391 return false; |
390 } | 392 } |
391 | 393 |
392 } // namesace proxy | 394 } // namesace proxy |
393 } // namespace ppapi | 395 } // namespace ppapi |
OLD | NEW |