Chromium Code Reviews| Index: mojo/services/network/udp_socket_impl.cc |
| diff --git a/mojo/services/network/udp_socket_impl.cc b/mojo/services/network/udp_socket_impl.cc |
| index 524136a32744b49fd542a1c1a468485cc605f2bf..d46d3da533e9bd8671f6c9979b47970a5d5b752d 100644 |
| --- a/mojo/services/network/udp_socket_impl.cc |
| +++ b/mojo/services/network/udp_socket_impl.cc |
| @@ -34,8 +34,9 @@ UDPSocketImpl::PendingSendRequest::PendingSendRequest() {} |
| UDPSocketImpl::PendingSendRequest::~PendingSendRequest() {} |
| -UDPSocketImpl::UDPSocketImpl() |
| - : socket_(net::DatagramSocket::DEFAULT_BIND, net::RandIntCallback(), |
| +UDPSocketImpl::UDPSocketImpl(InterfaceRequest<UDPSocket> request) |
| + : binding_(this, request.Pass()), |
| + socket_(net::DatagramSocket::DEFAULT_BIND, net::RandIntCallback(), |
| nullptr, net::NetLog::Source()), |
| state_(NOT_BOUND_OR_CONNECTED), |
| allow_address_reuse_(false), |
| @@ -215,6 +216,15 @@ void UDPSocketImpl::NegotiateMaxPendingSendRequests( |
| } |
| } |
| +void UDPSocketImpl::SetReceiver(UDPSocketReceiverPtr receiver) { |
| + receiver_ = receiver.Pass(); |
| + |
| + // If there is a pending RecvFrom completion, we can continue it now. |
| + if (recvfrom_buffer_.get()) { |
| + OnRecvFromCompleted(recvfrom_result_); |
| + } |
| +} |
| + |
| void UDPSocketImpl::ReceiveMore(uint32_t datagram_number) { |
| if (datagram_number == 0) |
| return; |
| @@ -323,6 +333,13 @@ void UDPSocketImpl::DoSendTo(NetAddressPtr addr, |
| void UDPSocketImpl::OnRecvFromCompleted(int net_result) { |
| DCHECK(recvfrom_buffer_.get()); |
| + // If no receiver is set yet, leave this RecvFrom operation in a pending |
| + // state, preventing additional RecvFroms as well. |
|
yzshen1
2015/01/28 19:31:06
This is a pretty clever way. :)
|
| + if (!receiver_) { |
| + recvfrom_result_ = net_result; |
| + return; |
| + } |
| + |
| NetAddressPtr net_address; |
| Array<uint8_t> array; |
| if (net_result >= 0) { |
| @@ -337,9 +354,8 @@ void UDPSocketImpl::OnRecvFromCompleted(int net_result) { |
| } |
| recvfrom_buffer_ = nullptr; |
| - client()->OnReceived(MakeNetworkError(net_result), net_address.Pass(), |
| - array.Pass()); |
| - |
| + receiver_->OnReceived(MakeNetworkError(net_result), net_address.Pass(), |
| + array.Pass()); |
| DCHECK_GT(remaining_recv_slots_, 0u); |
| remaining_recv_slots_--; |
| if (remaining_recv_slots_ > 0) |