Index: net/socket/udp_socket_win.cc |
diff --git a/net/socket/udp_socket_win.cc b/net/socket/udp_socket_win.cc |
index 83538c91c16e60a50924d5c98578fd408c3fda97..4a7c580edcc4623575ed45aa8b9e148efe5f1da0 100644 |
--- a/net/socket/udp_socket_win.cc |
+++ b/net/socket/udp_socket_win.cc |
@@ -41,131 +41,6 @@ const int kPortEnd = 65535; |
namespace net { |
-// This class encapsulates all the state that has to be preserved as long as |
-// there is a network IO operation in progress. If the owner UDPSocketWin |
-// is destroyed while an operation is in progress, the Core is detached and it |
-// lives until the operation completes and the OS doesn't reference any resource |
-// declared on this class anymore. |
-class UDPSocketWin::Core : public base::RefCounted<Core> { |
- public: |
- explicit Core(UDPSocketWin* socket); |
- |
- // Start watching for the end of a read or write operation. |
- void WatchForRead(); |
- void WatchForWrite(); |
- |
- // The UDPSocketWin is going away. |
- void Detach() { socket_ = NULL; } |
- |
- // The separate OVERLAPPED variables for asynchronous operation. |
- OVERLAPPED read_overlapped_; |
- OVERLAPPED write_overlapped_; |
- |
- // The buffers used in Read() and Write(). |
- scoped_refptr<IOBuffer> read_iobuffer_; |
- scoped_refptr<IOBuffer> write_iobuffer_; |
- |
- // The address storage passed to WSARecvFrom(). |
- SockaddrStorage recv_addr_storage_; |
- |
- private: |
- friend class base::RefCounted<Core>; |
- |
- class ReadDelegate : public base::win::ObjectWatcher::Delegate { |
- public: |
- explicit ReadDelegate(Core* core) : core_(core) {} |
- ~ReadDelegate() override {} |
- |
- // base::ObjectWatcher::Delegate methods: |
- void OnObjectSignaled(HANDLE object) override; |
- |
- private: |
- Core* const core_; |
- }; |
- |
- class WriteDelegate : public base::win::ObjectWatcher::Delegate { |
- public: |
- explicit WriteDelegate(Core* core) : core_(core) {} |
- ~WriteDelegate() override {} |
- |
- // base::ObjectWatcher::Delegate methods: |
- void OnObjectSignaled(HANDLE object) override; |
- |
- private: |
- Core* const core_; |
- }; |
- |
- ~Core(); |
- |
- // The socket that created this object. |
- UDPSocketWin* socket_; |
- |
- // |reader_| handles the signals from |read_watcher_|. |
- ReadDelegate reader_; |
- // |writer_| handles the signals from |write_watcher_|. |
- WriteDelegate writer_; |
- |
- // |read_watcher_| watches for events from Read(). |
- base::win::ObjectWatcher read_watcher_; |
- // |write_watcher_| watches for events from Write(); |
- base::win::ObjectWatcher write_watcher_; |
- |
- DISALLOW_COPY_AND_ASSIGN(Core); |
-}; |
- |
-UDPSocketWin::Core::Core(UDPSocketWin* socket) |
- : socket_(socket), |
- reader_(this), |
- writer_(this) { |
- memset(&read_overlapped_, 0, sizeof(read_overlapped_)); |
- memset(&write_overlapped_, 0, sizeof(write_overlapped_)); |
- |
- read_overlapped_.hEvent = WSACreateEvent(); |
- write_overlapped_.hEvent = WSACreateEvent(); |
-} |
- |
-UDPSocketWin::Core::~Core() { |
- // Make sure the message loop is not watching this object anymore. |
- read_watcher_.StopWatching(); |
- write_watcher_.StopWatching(); |
- |
- WSACloseEvent(read_overlapped_.hEvent); |
- memset(&read_overlapped_, 0xaf, sizeof(read_overlapped_)); |
- WSACloseEvent(write_overlapped_.hEvent); |
- memset(&write_overlapped_, 0xaf, sizeof(write_overlapped_)); |
-} |
- |
-void UDPSocketWin::Core::WatchForRead() { |
- // We grab an extra reference because there is an IO operation in progress. |
- // Balanced in ReadDelegate::OnObjectSignaled(). |
- AddRef(); |
- read_watcher_.StartWatchingOnce(read_overlapped_.hEvent, &reader_); |
-} |
- |
-void UDPSocketWin::Core::WatchForWrite() { |
- // We grab an extra reference because there is an IO operation in progress. |
- // Balanced in WriteDelegate::OnObjectSignaled(). |
- AddRef(); |
- write_watcher_.StartWatchingOnce(write_overlapped_.hEvent, &writer_); |
-} |
- |
-void UDPSocketWin::Core::ReadDelegate::OnObjectSignaled(HANDLE object) { |
- DCHECK_EQ(object, core_->read_overlapped_.hEvent); |
- if (core_->socket_) |
- core_->socket_->DidCompleteRead(); |
- |
- core_->Release(); |
-} |
- |
-void UDPSocketWin::Core::WriteDelegate::OnObjectSignaled(HANDLE object) { |
- DCHECK_EQ(object, core_->write_overlapped_.hEvent); |
- if (core_->socket_) |
- core_->socket_->DidCompleteWrite(); |
- |
- core_->Release(); |
-} |
-//----------------------------------------------------------------------------- |
- |
QwaveAPI::QwaveAPI() : qwave_supported_(false) { |
HMODULE qwave = LoadLibrary(L"qwave.dll"); |
if (!qwave) |
@@ -255,7 +130,6 @@ UDPSocketWin::UDPSocketWin(DatagramSocket::BindType bind_type, |
multicast_time_to_live_(1), |
bind_type_(bind_type), |
rand_int_cb_(rand_int_cb), |
- use_non_blocking_io_(false), |
read_iobuffer_len_(0), |
write_iobuffer_len_(0), |
recv_from_address_(NULL), |
@@ -282,12 +156,8 @@ int UDPSocketWin::Open(AddressFamily address_family) { |
socket_ = CreatePlatformSocket(addr_family_, SOCK_DGRAM, IPPROTO_UDP); |
if (socket_ == INVALID_SOCKET) |
return MapSystemError(WSAGetLastError()); |
- if (!use_non_blocking_io_) { |
- core_ = new Core(this); |
- } else { |
- read_write_event_.Set(WSACreateEvent()); |
- WSAEventSelect(socket_, read_write_event_.Get(), FD_READ | FD_WRITE); |
- } |
+ read_write_event_.Set(WSACreateEvent()); |
+ WSAEventSelect(socket_, read_write_event_.Get(), FD_READ | FD_WRITE); |
return OK; |
} |
@@ -316,11 +186,6 @@ void UDPSocketWin::Close() { |
read_write_watcher_.StopWatching(); |
read_write_event_.Close(); |
- |
- if (core_) { |
- core_->Detach(); |
- core_ = NULL; |
- } |
} |
int UDPSocketWin::GetPeerAddress(IPEndPoint* address) const { |
@@ -386,8 +251,7 @@ int UDPSocketWin::RecvFrom(IOBuffer* buf, |
DCHECK(!callback.is_null()); // Synchronous operation not supported. |
DCHECK_GT(buf_len, 0); |
- int nread = core_ ? InternalRecvFromOverlapped(buf, buf_len, address) |
- : InternalRecvFromNonBlocking(buf, buf_len, address); |
+ int nread = InternalRecvFromNonBlocking(buf, buf_len, address); |
if (nread != ERR_IO_PENDING) |
return nread; |
@@ -420,8 +284,7 @@ int UDPSocketWin::SendToOrWrite(IOBuffer* buf, |
DCHECK_GT(buf_len, 0); |
DCHECK(!send_to_address_.get()); |
- int nwrite = core_ ? InternalSendToOverlapped(buf, buf_len, address) |
- : InternalSendToNonBlocking(buf, buf_len, address); |
+ int nwrite = InternalSendToNonBlocking(buf, buf_len, address); |
if (nwrite != ERR_IO_PENDING) |
return nwrite; |
@@ -596,44 +459,6 @@ void UDPSocketWin::DoWriteCallback(int rv) { |
c.Run(rv); |
} |
-void UDPSocketWin::DidCompleteRead() { |
- DWORD num_bytes, flags; |
- BOOL ok = WSAGetOverlappedResult(socket_, &core_->read_overlapped_, |
- &num_bytes, FALSE, &flags); |
- WSAResetEvent(core_->read_overlapped_.hEvent); |
- int result = ok ? num_bytes : MapSystemError(WSAGetLastError()); |
- // Convert address. |
- IPEndPoint address; |
- IPEndPoint* address_to_log = NULL; |
- if (result >= 0) { |
- if (address.FromSockAddr(core_->recv_addr_storage_.addr, |
- core_->recv_addr_storage_.addr_len)) { |
- if (recv_from_address_) |
- *recv_from_address_ = address; |
- address_to_log = &address; |
- } else { |
- result = ERR_ADDRESS_INVALID; |
- } |
- } |
- LogRead(result, core_->read_iobuffer_->data(), address_to_log); |
- core_->read_iobuffer_ = NULL; |
- recv_from_address_ = NULL; |
- DoReadCallback(result); |
-} |
- |
-void UDPSocketWin::DidCompleteWrite() { |
- DWORD num_bytes, flags; |
- BOOL ok = WSAGetOverlappedResult(socket_, &core_->write_overlapped_, |
- &num_bytes, FALSE, &flags); |
- WSAResetEvent(core_->write_overlapped_.hEvent); |
- int result = ok ? num_bytes : MapSystemError(WSAGetLastError()); |
- LogWrite(result, core_->write_iobuffer_->data(), send_to_address_.get()); |
- |
- send_to_address_.reset(); |
- core_->write_iobuffer_ = NULL; |
- DoWriteCallback(result); |
-} |
- |
void UDPSocketWin::OnObjectSignaled(HANDLE object) { |
DCHECK(object == read_write_event_.Get()); |
WSANETWORKEVENTS network_events; |
@@ -735,102 +560,6 @@ void UDPSocketWin::LogWrite(int result, |
NetworkActivityMonitor::GetInstance()->IncrementBytesSent(result); |
} |
-int UDPSocketWin::InternalRecvFromOverlapped(IOBuffer* buf, |
- int buf_len, |
- IPEndPoint* address) { |
- DCHECK(!core_->read_iobuffer_.get()); |
- SockaddrStorage& storage = core_->recv_addr_storage_; |
- storage.addr_len = sizeof(storage.addr_storage); |
- |
- WSABUF read_buffer; |
- read_buffer.buf = buf->data(); |
- read_buffer.len = buf_len; |
- |
- DWORD flags = 0; |
- DWORD num; |
- CHECK_NE(INVALID_SOCKET, socket_); |
- AssertEventNotSignaled(core_->read_overlapped_.hEvent); |
- int rv = WSARecvFrom(socket_, &read_buffer, 1, &num, &flags, storage.addr, |
- &storage.addr_len, &core_->read_overlapped_, NULL); |
- if (rv == 0) { |
- if (ResetEventIfSignaled(core_->read_overlapped_.hEvent)) { |
- int result = num; |
- // Convert address. |
- IPEndPoint address_storage; |
- IPEndPoint* address_to_log = NULL; |
- if (result >= 0) { |
- if (address_storage.FromSockAddr(core_->recv_addr_storage_.addr, |
- core_->recv_addr_storage_.addr_len)) { |
- if (address) |
- *address = address_storage; |
- address_to_log = &address_storage; |
- } else { |
- result = ERR_ADDRESS_INVALID; |
- } |
- } |
- LogRead(result, buf->data(), address_to_log); |
- return result; |
- } |
- } else { |
- int os_error = WSAGetLastError(); |
- if (os_error != WSA_IO_PENDING) { |
- int result = MapSystemError(os_error); |
- LogRead(result, NULL, NULL); |
- return result; |
- } |
- } |
- core_->WatchForRead(); |
- core_->read_iobuffer_ = buf; |
- return ERR_IO_PENDING; |
-} |
- |
-int UDPSocketWin::InternalSendToOverlapped(IOBuffer* buf, |
- int buf_len, |
- const IPEndPoint* address) { |
- DCHECK(!core_->write_iobuffer_.get()); |
- SockaddrStorage storage; |
- struct sockaddr* addr = storage.addr; |
- // Convert address. |
- if (!address) { |
- addr = NULL; |
- storage.addr_len = 0; |
- } else { |
- if (!address->ToSockAddr(addr, &storage.addr_len)) { |
- int result = ERR_ADDRESS_INVALID; |
- LogWrite(result, NULL, NULL); |
- return result; |
- } |
- } |
- |
- WSABUF write_buffer; |
- write_buffer.buf = buf->data(); |
- write_buffer.len = buf_len; |
- |
- DWORD flags = 0; |
- DWORD num; |
- AssertEventNotSignaled(core_->write_overlapped_.hEvent); |
- int rv = WSASendTo(socket_, &write_buffer, 1, &num, flags, |
- addr, storage.addr_len, &core_->write_overlapped_, NULL); |
- if (rv == 0) { |
- if (ResetEventIfSignaled(core_->write_overlapped_.hEvent)) { |
- int result = num; |
- LogWrite(result, buf->data(), address); |
- return result; |
- } |
- } else { |
- int os_error = WSAGetLastError(); |
- if (os_error != WSA_IO_PENDING) { |
- int result = MapSystemError(os_error); |
- LogWrite(result, NULL, NULL); |
- return result; |
- } |
- } |
- |
- core_->WatchForWrite(); |
- core_->write_iobuffer_ = buf; |
- return ERR_IO_PENDING; |
-} |
- |
int UDPSocketWin::InternalRecvFromNonBlocking(IOBuffer* buf, |
int buf_len, |
IPEndPoint* address) { |
@@ -1193,9 +922,4 @@ void UDPSocketWin::DetachFromThread() { |
base::NonThreadSafe::DetachFromThread(); |
} |
-void UDPSocketWin::UseNonBlockingIO() { |
- DCHECK(!core_); |
- use_non_blocking_io_ = true; |
-} |
- |
} // namespace net |