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

Unified Diff: content/browser/renderer_host/pepper/pepper_udp_socket.cc

Issue 11274013: Added queued SendTo/RecvFrom calls. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/pepper/pepper_udp_socket.cc
diff --git a/content/browser/renderer_host/pepper/pepper_udp_socket.cc b/content/browser/renderer_host/pepper/pepper_udp_socket.cc
index fdb2c5e0e3d515dcca8c6bd91582391bc0ff42b0..21db212ce3b5d46331a7e90e56514b69c0dd1ebc 100644
--- a/content/browser/renderer_host/pepper/pepper_udp_socket.cc
+++ b/content/browser/renderer_host/pepper/pepper_udp_socket.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -10,7 +10,6 @@
#include "base/logging.h"
#include "content/browser/renderer_host/pepper/pepper_message_filter.h"
#include "content/public/browser/browser_thread.h"
-#include "net/base/io_buffer.h"
#include "net/base/net_errors.h"
#include "net/udp/udp_server_socket.h"
#include "ppapi/proxy/ppapi_messages.h"
@@ -29,7 +28,9 @@ PepperUDPSocket::PepperUDPSocket(
plugin_dispatcher_id_(plugin_dispatcher_id),
socket_id_(socket_id),
allow_address_reuse_(false),
- allow_broadcast_(false) {
+ allow_broadcast_(false),
+ recvfrom_state_(IO_STATE_IDLE),
+ sendto_state_(IO_STATE_IDLE) {
DCHECK(manager);
}
@@ -75,24 +76,15 @@ void PepperUDPSocket::Bind(const PP_NetAddress_Private& addr) {
}
void PepperUDPSocket::RecvFrom(int32_t num_bytes) {
- if (recvfrom_buffer_.get()) {
- SendRecvFromACKError();
- return;
- }
-
- recvfrom_buffer_ = new net::IOBuffer(num_bytes);
- int result = socket_->RecvFrom(
- recvfrom_buffer_, num_bytes, &recvfrom_address_,
- base::Bind(&PepperUDPSocket::OnRecvFromCompleted,
- base::Unretained(this)));
-
- if (result != net::ERR_IO_PENDING)
- OnRecvFromCompleted(result);
+ scoped_refptr<net::IOBuffer> recvfrom_buffer(new net::IOBuffer(num_bytes));
+ linked_ptr<net::IPEndPoint> end_point(new net::IPEndPoint());
+ recvfrom_requests_.push(IORequest(recvfrom_buffer, num_bytes, end_point));
+ RecvFromInternal();
}
void PepperUDPSocket::SendTo(const std::string& data,
const PP_NetAddress_Private& addr) {
- if (sendto_buffer_.get() || data.empty()) {
+ if (data.empty()) {
SendSendToACKError();
return;
}
@@ -105,15 +97,11 @@ void PepperUDPSocket::SendTo(const std::string& data,
}
int data_size = data.size();
-
- sendto_buffer_ = new net::IOBuffer(data_size);
- memcpy(sendto_buffer_->data(), data.data(), data_size);
- int result = socket_->SendTo(
- sendto_buffer_, data_size, net::IPEndPoint(address, port),
- base::Bind(&PepperUDPSocket::OnSendToCompleted, base::Unretained(this)));
-
- if (result != net::ERR_IO_PENDING)
- OnSendToCompleted(result);
+ scoped_refptr<net::IOBuffer> sendto_buffer(new net::IOBuffer(data_size));
+ memcpy(sendto_buffer->data(), data.data(), data_size);
+ linked_ptr<net::IPEndPoint> end_point(new net::IPEndPoint(address, port));
+ sendto_requests_.push(IORequest(sendto_buffer, data_size, end_point));
+ SendToInternal();
}
void PepperUDPSocket::SendRecvFromACKError() {
@@ -134,6 +122,36 @@ void PepperUDPSocket::SendBindACKError() {
routing_id_, plugin_dispatcher_id_, socket_id_, false, addr));
}
+void PepperUDPSocket::RecvFromInternal() {
+ if (recvfrom_requests_.empty() || recvfrom_state_ != IO_STATE_IDLE)
+ return;
+ recvfrom_state_ = IO_STATE_IN_PROCESS;
+ IORequest request = recvfrom_requests_.front();
+ int result = socket_->RecvFrom(
+ request.buffer.get(),
+ request.buffer_size,
+ request.end_point.get(),
+ base::Bind(&PepperUDPSocket::OnRecvFromCompleted,
+ base::Unretained(this)));
+ if (result != net::ERR_IO_PENDING)
+ OnRecvFromCompleted(result);
+}
+
+void PepperUDPSocket::SendToInternal() {
+ if (sendto_requests_.empty() || sendto_state_ != IO_STATE_IDLE)
+ return;
+ sendto_state_ = IO_STATE_IN_PROCESS;
+ IORequest request = sendto_requests_.front();
+ int result = socket_->SendTo(
+ request.buffer.get(),
+ request.buffer_size,
+ *request.end_point,
+ base::Bind(&PepperUDPSocket::OnSendToCompleted,
+ base::Unretained(this)));
+ if (result != net::ERR_IO_PENDING)
+ OnSendToCompleted(result);
+}
+
void PepperUDPSocket::OnBindCompleted(int result) {
PP_NetAddress_Private addr = NetAddressPrivateImpl::kInvalidNetAddress;
if (result < 0 ||
@@ -148,28 +166,36 @@ void PepperUDPSocket::OnBindCompleted(int result) {
}
void PepperUDPSocket::OnRecvFromCompleted(int result) {
- DCHECK(recvfrom_buffer_.get());
+ DCHECK(!recvfrom_requests_.empty());
+ DCHECK(recvfrom_state_ == IO_STATE_IN_PROCESS);
+
+ IORequest request = recvfrom_requests_.front();
// Convert IPEndPoint we get back from RecvFrom to a PP_NetAddress_Private,
// to send back.
PP_NetAddress_Private addr = NetAddressPrivateImpl::kInvalidNetAddress;
if (result < 0 ||
!NetAddressPrivateImpl::IPEndPointToNetAddress(
- recvfrom_address_.address(),
- recvfrom_address_.port(),
+ request.end_point->address(),
+ request.end_point->port(),
&addr)) {
SendRecvFromACKError();
} else {
manager_->Send(new PpapiMsg_PPBUDPSocket_RecvFromACK(
routing_id_, plugin_dispatcher_id_, socket_id_, true,
- std::string(recvfrom_buffer_->data(), result), addr));
+ std::string(request.buffer->data(), result), addr));
}
- recvfrom_buffer_ = NULL;
+ recvfrom_requests_.pop();
+ recvfrom_state_ = IO_STATE_IDLE;
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+ base::Bind(&PepperUDPSocket::RecvFromInternal,
+ base::Unretained(this)));
}
void PepperUDPSocket::OnSendToCompleted(int result) {
- DCHECK(sendto_buffer_.get());
+ DCHECK(!sendto_requests_.empty());
+ DCHECK(sendto_state_ == IO_STATE_IN_PROCESS);
if (result < 0) {
SendSendToACKError();
@@ -178,5 +204,9 @@ void PepperUDPSocket::OnSendToCompleted(int result) {
routing_id_, plugin_dispatcher_id_, socket_id_, true, result));
}
- sendto_buffer_ = NULL;
+ sendto_requests_.pop();
+ sendto_state_ = IO_STATE_IDLE;
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+ base::Bind(&PepperUDPSocket::SendToInternal,
+ base::Unretained(this)));
}
« no previous file with comments | « content/browser/renderer_host/pepper/pepper_udp_socket.h ('k') | ppapi/shared_impl/private/udp_socket_private_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698