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

Side by Side Diff: ppapi/proxy/device_enumeration_resource_helper.cc

Issue 11859015: Pepper: Introduce ThreadAwareCallback. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 7 years, 11 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ppapi/proxy/device_enumeration_resource_helper.h ('k') | ppapi/proxy/plugin_globals.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/device_enumeration_resource_helper.h" 5 #include "ppapi/proxy/device_enumeration_resource_helper.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "ipc/ipc_message.h" 10 #include "ipc/ipc_message.h"
(...skipping 12 matching lines...) Expand all
23 #include "ppapi/shared_impl/tracked_callback.h" 23 #include "ppapi/shared_impl/tracked_callback.h"
24 24
25 namespace ppapi { 25 namespace ppapi {
26 namespace proxy { 26 namespace proxy {
27 27
28 DeviceEnumerationResourceHelper::DeviceEnumerationResourceHelper( 28 DeviceEnumerationResourceHelper::DeviceEnumerationResourceHelper(
29 PluginResource* owner) 29 PluginResource* owner)
30 : owner_(owner), 30 : owner_(owner),
31 pending_enumerate_devices_(false), 31 pending_enumerate_devices_(false),
32 monitor_callback_id_(0), 32 monitor_callback_id_(0),
33 monitor_callback_(NULL),
34 monitor_user_data_(NULL) { 33 monitor_user_data_(NULL) {
35 } 34 }
36 35
37 DeviceEnumerationResourceHelper::~DeviceEnumerationResourceHelper() { 36 DeviceEnumerationResourceHelper::~DeviceEnumerationResourceHelper() {
38 } 37 }
39 38
40 int32_t DeviceEnumerationResourceHelper::EnumerateDevices0_2( 39 int32_t DeviceEnumerationResourceHelper::EnumerateDevices0_2(
41 PP_Resource* devices, 40 PP_Resource* devices,
42 scoped_refptr<TrackedCallback> callback) { 41 scoped_refptr<TrackedCallback> callback) {
43 if (pending_enumerate_devices_) 42 if (pending_enumerate_devices_)
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 if (result == PP_OK) 82 if (result == PP_OK)
84 result = WriteToArrayOutput(devices, output); 83 result = WriteToArrayOutput(devices, output);
85 84
86 return result; 85 return result;
87 } 86 }
88 87
89 int32_t DeviceEnumerationResourceHelper::MonitorDeviceChange( 88 int32_t DeviceEnumerationResourceHelper::MonitorDeviceChange(
90 PP_MonitorDeviceChangeCallback callback, 89 PP_MonitorDeviceChangeCallback callback,
91 void* user_data) { 90 void* user_data) {
92 monitor_callback_id_++; 91 monitor_callback_id_++;
93 monitor_callback_ = callback;
94 monitor_user_data_ = user_data; 92 monitor_user_data_ = user_data;
93 if (callback) {
94 monitor_callback_.reset(
95 ThreadAwareCallback<PP_MonitorDeviceChangeCallback>::Create(callback));
96 if (!monitor_callback_.get())
97 return PP_ERROR_NO_MESSAGE_LOOP;
95 98
96 if (callback) {
97 owner_->Post(PluginResource::RENDERER, 99 owner_->Post(PluginResource::RENDERER,
98 PpapiHostMsg_DeviceEnumeration_MonitorDeviceChange( 100 PpapiHostMsg_DeviceEnumeration_MonitorDeviceChange(
99 monitor_callback_id_)); 101 monitor_callback_id_));
100 } else { 102 } else {
103 monitor_callback_.reset(NULL);
104
101 owner_->Post(PluginResource::RENDERER, 105 owner_->Post(PluginResource::RENDERER,
102 PpapiHostMsg_DeviceEnumeration_StopMonitoringDeviceChange()); 106 PpapiHostMsg_DeviceEnumeration_StopMonitoringDeviceChange());
103 } 107 }
104 return PP_OK; 108 return PP_OK;
105 } 109 }
106 110
107 bool DeviceEnumerationResourceHelper::HandleReply( 111 bool DeviceEnumerationResourceHelper::HandleReply(
108 const ResourceMessageReplyParams& params, 112 const ResourceMessageReplyParams& params,
109 const IPC::Message& msg) { 113 const IPC::Message& msg) {
110 IPC_BEGIN_MESSAGE_MAP(DeviceEnumerationResourceHelper, msg) 114 IPC_BEGIN_MESSAGE_MAP(DeviceEnumerationResourceHelper, msg)
111 PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL( 115 PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL(
112 PpapiPluginMsg_DeviceEnumeration_NotifyDeviceChange, 116 PpapiPluginMsg_DeviceEnumeration_NotifyDeviceChange,
113 OnPluginMsgNotifyDeviceChange) 117 OnPluginMsgNotifyDeviceChange)
114 PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL_UNHANDLED(return false) 118 PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL_UNHANDLED(return false)
115 IPC_END_MESSAGE_MAP() 119 IPC_END_MESSAGE_MAP()
116 120
117 return true; 121 return true;
118 } 122 }
119 123
120 void DeviceEnumerationResourceHelper::LastPluginRefWasDeleted() { 124 void DeviceEnumerationResourceHelper::LastPluginRefWasDeleted() {
121 // Make sure that no further notifications are sent to the plugin. 125 // Make sure that no further notifications are sent to the plugin.
122 monitor_callback_id_++; 126 monitor_callback_id_++;
123 monitor_callback_ = NULL; 127 monitor_callback_.reset(NULL);
124 monitor_user_data_ = NULL; 128 monitor_user_data_ = NULL;
125 129
126 // There is no need to do anything with pending callback of 130 // There is no need to do anything with pending callback of
127 // EnumerateDevices(), because OnPluginMsgEnumerateDevicesReply*() will handle 131 // EnumerateDevices(), because OnPluginMsgEnumerateDevicesReply*() will handle
128 // that properly. 132 // that properly.
129 } 133 }
130 134
131 void DeviceEnumerationResourceHelper::OnPluginMsgEnumerateDevicesReply0_2( 135 void DeviceEnumerationResourceHelper::OnPluginMsgEnumerateDevicesReply0_2(
132 PP_Resource* devices_resource, 136 PP_Resource* devices_resource,
133 scoped_refptr<TrackedCallback> callback, 137 scoped_refptr<TrackedCallback> callback,
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
171 175
172 void DeviceEnumerationResourceHelper::OnPluginMsgNotifyDeviceChange( 176 void DeviceEnumerationResourceHelper::OnPluginMsgNotifyDeviceChange(
173 const ResourceMessageReplyParams& /* params */, 177 const ResourceMessageReplyParams& /* params */,
174 uint32_t callback_id, 178 uint32_t callback_id,
175 const std::vector<DeviceRefData>& devices) { 179 const std::vector<DeviceRefData>& devices) {
176 if (monitor_callback_id_ != callback_id) { 180 if (monitor_callback_id_ != callback_id) {
177 // A new callback or NULL has been set. 181 // A new callback or NULL has been set.
178 return; 182 return;
179 } 183 }
180 184
181 CHECK(monitor_callback_); 185 CHECK(monitor_callback_.get());
182 186
183 scoped_array<PP_Resource> elements; 187 scoped_array<PP_Resource> elements;
184 uint32_t size = devices.size(); 188 uint32_t size = devices.size();
185 if (size > 0) { 189 if (size > 0) {
186 elements.reset(new PP_Resource[size]); 190 elements.reset(new PP_Resource[size]);
187 for (size_t index = 0; index < size; ++index) { 191 for (size_t index = 0; index < size; ++index) {
188 PPB_DeviceRef_Shared* device_object = new PPB_DeviceRef_Shared( 192 PPB_DeviceRef_Shared* device_object = new PPB_DeviceRef_Shared(
189 OBJECT_IS_PROXY, owner_->pp_instance(), devices[index]); 193 OBJECT_IS_PROXY, owner_->pp_instance(), devices[index]);
190 elements[index] = device_object->GetReference(); 194 elements[index] = device_object->GetReference();
191 } 195 }
192 } 196 }
193 197
194 // TODO(yzshen): make sure |monitor_callback_| is called on the same thread as 198 monitor_callback_->RunOnTargetThread(monitor_user_data_, size,
195 // the one on which MonitorDeviceChange() is called. 199 elements.get());
196 CallWhileUnlocked(base::Bind(monitor_callback_, monitor_user_data_, size,
197 elements.get()));
198 for (size_t index = 0; index < size; ++index) 200 for (size_t index = 0; index < size; ++index)
199 PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource(elements[index]); 201 PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource(elements[index]);
200 } 202 }
201 203
202 int32_t DeviceEnumerationResourceHelper::WriteToArrayOutput( 204 int32_t DeviceEnumerationResourceHelper::WriteToArrayOutput(
203 const std::vector<DeviceRefData>& devices, 205 const std::vector<DeviceRefData>& devices,
204 const PP_ArrayOutput& output) { 206 const PP_ArrayOutput& output) {
205 ArrayWriter writer(output); 207 ArrayWriter writer(output);
206 if (!writer.is_valid()) 208 if (!writer.is_valid())
207 return PP_ERROR_BADARGUMENT; 209 return PP_ERROR_BADARGUMENT;
208 210
209 std::vector<scoped_refptr<Resource> > device_resources; 211 std::vector<scoped_refptr<Resource> > device_resources;
210 for (size_t i = 0; i < devices.size(); ++i) { 212 for (size_t i = 0; i < devices.size(); ++i) {
211 device_resources.push_back(new PPB_DeviceRef_Shared( 213 device_resources.push_back(new PPB_DeviceRef_Shared(
212 OBJECT_IS_PROXY, owner_->pp_instance(), devices[i])); 214 OBJECT_IS_PROXY, owner_->pp_instance(), devices[i]));
213 } 215 }
214 if (!writer.StoreResourceVector(device_resources)) 216 if (!writer.StoreResourceVector(device_resources))
215 return PP_ERROR_FAILED; 217 return PP_ERROR_FAILED;
216 218
217 return PP_OK; 219 return PP_OK;
218 } 220 }
219 221
220 } // namespace proxy 222 } // namespace proxy
221 } // namespace ppapi 223 } // namespace ppapi
OLDNEW
« no previous file with comments | « ppapi/proxy/device_enumeration_resource_helper.h ('k') | ppapi/proxy/plugin_globals.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698