OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/udp_socket_filter.h" | 5 #include "ppapi/proxy/udp_socket_filter.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cstring> | 8 #include <cstring> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "ppapi/c/pp_errors.h" | 12 #include "ppapi/c/pp_errors.h" |
13 #include "ppapi/proxy/error_conversion.h" | 13 #include "ppapi/proxy/error_conversion.h" |
14 #include "ppapi/proxy/plugin_globals.h" | 14 #include "ppapi/proxy/plugin_globals.h" |
15 #include "ppapi/proxy/ppapi_messages.h" | 15 #include "ppapi/proxy/ppapi_messages.h" |
16 #include "ppapi/thunk/enter.h" | 16 #include "ppapi/thunk/enter.h" |
17 #include "ppapi/thunk/resource_creation_api.h" | 17 #include "ppapi/thunk/resource_creation_api.h" |
18 | 18 |
19 namespace ppapi { | 19 namespace ppapi { |
20 namespace proxy { | 20 namespace proxy { |
21 | 21 |
22 const int32_t UDPSocketFilter::kMaxReadSize = 128 * 1024; | 22 const int32_t UDPSocketFilter::kMaxReadSize = 128 * 1024; |
23 const int32_t UDPSocketFilter::kMaxReceiveBufferSize = | 23 const int32_t UDPSocketFilter::kMaxReceiveBufferSize = |
24 1024 * UDPSocketFilter::kMaxReadSize; | 24 1024 * UDPSocketFilter::kMaxReadSize; |
25 const size_t UDPSocketFilter::kPluginReceiveBufferSlots = 32u; | 25 const size_t UDPSocketFilter::kPluginReceiveBufferSlots = 32u; |
26 | 26 |
27 namespace { | 27 namespace { |
28 | 28 |
29 int32_t SetRecvFromOutput(PP_Instance pp_instance, | 29 int32_t SetRecvFromOutput(PP_Instance pp_instance, |
30 const scoped_ptr<std::string>& data, | 30 const std::unique_ptr<std::string>& data, |
31 const PP_NetAddress_Private& addr, | 31 const PP_NetAddress_Private& addr, |
32 char* output_buffer, | 32 char* output_buffer, |
33 int32_t num_bytes, | 33 int32_t num_bytes, |
34 PP_Resource* output_addr, | 34 PP_Resource* output_addr, |
35 int32_t browser_result) { | 35 int32_t browser_result) { |
36 ProxyLock::AssertAcquired(); | 36 ProxyLock::AssertAcquired(); |
37 DCHECK_GE(num_bytes, static_cast<int32_t>(data->size())); | 37 DCHECK_GE(num_bytes, static_cast<int32_t>(data->size())); |
38 | 38 |
39 int32_t result = browser_result; | 39 int32_t result = browser_result; |
40 if (result == PP_OK && output_addr) { | 40 if (result == PP_OK && output_addr) { |
(...skipping 21 matching lines...) Expand all Loading... |
62 } | 62 } |
63 | 63 |
64 void UDPSocketFilter::AddUDPResource( | 64 void UDPSocketFilter::AddUDPResource( |
65 PP_Instance instance, | 65 PP_Instance instance, |
66 PP_Resource resource, | 66 PP_Resource resource, |
67 bool private_api, | 67 bool private_api, |
68 const base::Closure& slot_available_callback) { | 68 const base::Closure& slot_available_callback) { |
69 ProxyLock::AssertAcquired(); | 69 ProxyLock::AssertAcquired(); |
70 base::AutoLock acquire(lock_); | 70 base::AutoLock acquire(lock_); |
71 DCHECK(!queues_.contains(resource)); | 71 DCHECK(!queues_.contains(resource)); |
72 queues_.add(resource, scoped_ptr<RecvQueue>(new RecvQueue( | 72 queues_.add(resource, std::unique_ptr<RecvQueue>(new RecvQueue( |
73 instance, private_api, slot_available_callback))); | 73 instance, private_api, slot_available_callback))); |
74 } | 74 } |
75 | 75 |
76 void UDPSocketFilter::RemoveUDPResource(PP_Resource resource) { | 76 void UDPSocketFilter::RemoveUDPResource(PP_Resource resource) { |
77 ProxyLock::AssertAcquired(); | 77 ProxyLock::AssertAcquired(); |
78 base::AutoLock acquire(lock_); | 78 base::AutoLock acquire(lock_); |
79 DCHECK(queues_.contains(resource)); | 79 DCHECK(queues_.contains(resource)); |
80 queues_.erase(resource); | 80 queues_.erase(resource); |
81 } | 81 } |
82 | 82 |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 | 175 |
176 result = PP_ERROR_MESSAGE_TOO_BIG; | 176 result = PP_ERROR_MESSAGE_TOO_BIG; |
177 } else { | 177 } else { |
178 // Instead of calling SetRecvFromOutput directly, post it as a completion | 178 // Instead of calling SetRecvFromOutput directly, post it as a completion |
179 // task, so that: | 179 // task, so that: |
180 // 1) It can run with the ProxyLock (we can't lock it on the IO thread.) | 180 // 1) It can run with the ProxyLock (we can't lock it on the IO thread.) |
181 // 2) So that we only write to the output params in the case of success. | 181 // 2) So that we only write to the output params in the case of success. |
182 // (Since the callback will complete on another thread, it's possible | 182 // (Since the callback will complete on another thread, it's possible |
183 // that the resource will be deleted and abort the callback before it | 183 // that the resource will be deleted and abort the callback before it |
184 // is actually run.) | 184 // is actually run.) |
185 scoped_ptr<std::string> data_to_pass(new std::string(data)); | 185 std::unique_ptr<std::string> data_to_pass(new std::string(data)); |
186 recvfrom_callback_->set_completion_task(base::Bind( | 186 recvfrom_callback_->set_completion_task(base::Bind( |
187 &SetRecvFromOutput, pp_instance_, base::Passed(std::move(data_to_pass)), | 187 &SetRecvFromOutput, pp_instance_, base::Passed(std::move(data_to_pass)), |
188 addr, base::Unretained(read_buffer_), bytes_to_read_, | 188 addr, base::Unretained(read_buffer_), bytes_to_read_, |
189 base::Unretained(recvfrom_addr_resource_))); | 189 base::Unretained(recvfrom_addr_resource_))); |
190 last_recvfrom_addr_ = addr; | 190 last_recvfrom_addr_ = addr; |
191 PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask( | 191 PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask( |
192 FROM_HERE, | 192 FROM_HERE, |
193 RunWhileLocked(slot_available_callback_)); | 193 RunWhileLocked(slot_available_callback_)); |
194 } | 194 } |
195 | 195 |
(...skipping 22 matching lines...) Expand all Loading... |
218 recvfrom_addr_resource_ = addr_out; | 218 recvfrom_addr_resource_ = addr_out; |
219 recvfrom_callback_ = callback; | 219 recvfrom_callback_ = callback; |
220 return PP_OK_COMPLETIONPENDING; | 220 return PP_OK_COMPLETIONPENDING; |
221 } else { | 221 } else { |
222 RecvBuffer& front = recv_buffers_.front(); | 222 RecvBuffer& front = recv_buffers_.front(); |
223 | 223 |
224 if (static_cast<size_t>(num_bytes) < front.data.size()) | 224 if (static_cast<size_t>(num_bytes) < front.data.size()) |
225 return PP_ERROR_MESSAGE_TOO_BIG; | 225 return PP_ERROR_MESSAGE_TOO_BIG; |
226 | 226 |
227 int32_t result = static_cast<int32_t>(front.data.size()); | 227 int32_t result = static_cast<int32_t>(front.data.size()); |
228 scoped_ptr<std::string> data_to_pass(new std::string); | 228 std::unique_ptr<std::string> data_to_pass(new std::string); |
229 data_to_pass->swap(front.data); | 229 data_to_pass->swap(front.data); |
230 SetRecvFromOutput(pp_instance_, std::move(data_to_pass), front.addr, | 230 SetRecvFromOutput(pp_instance_, std::move(data_to_pass), front.addr, |
231 buffer_out, num_bytes, addr_out, PP_OK); | 231 buffer_out, num_bytes, addr_out, PP_OK); |
232 last_recvfrom_addr_ = front.addr; | 232 last_recvfrom_addr_ = front.addr; |
233 recv_buffers_.pop(); | 233 recv_buffers_.pop(); |
234 slot_available_callback_.Run(); | 234 slot_available_callback_.Run(); |
235 | 235 |
236 return result; | 236 return result; |
237 } | 237 } |
238 } | 238 } |
239 | 239 |
240 PP_NetAddress_Private UDPSocketFilter::RecvQueue::GetLastAddrPrivate() const { | 240 PP_NetAddress_Private UDPSocketFilter::RecvQueue::GetLastAddrPrivate() const { |
241 CHECK(private_api_); | 241 CHECK(private_api_); |
242 return last_recvfrom_addr_; | 242 return last_recvfrom_addr_; |
243 } | 243 } |
244 | 244 |
245 } // namespace proxy | 245 } // namespace proxy |
246 } // namespace ppapi | 246 } // namespace ppapi |
OLD | NEW |