Index: net/udp/udp_socket_libevent.cc |
diff --git a/net/udp/udp_socket_libevent.cc b/net/udp/udp_socket_libevent.cc |
index 7c75ce39a59b457bf013d75acacc5ed661cdd184..de24253539f2ab4198fdfe29861ed2f351d71be7 100644 |
--- a/net/udp/udp_socket_libevent.cc |
+++ b/net/udp/udp_socket_libevent.cc |
@@ -63,6 +63,8 @@ int MapPosixError(int os_error) { |
return ERR_ADDRESS_INVALID; |
case EMSGSIZE: |
return ERR_MSG_TOO_BIG; |
+ case ENOTCONN: |
+ return ERR_SOCKET_NOT_CONNECTED; |
case 0: |
return OK; |
default: |
@@ -99,9 +101,21 @@ UDPSocketLibevent::~UDPSocketLibevent() { |
} |
void UDPSocketLibevent::Close() { |
+ DCHECK(CalledOnValidThread()); |
+ |
+ if (read_callback_) |
+ DoReadCallback(ERR_ABORTED); |
+ if (write_callback_) |
+ DoReadCallback(ERR_ABORTED); |
+ |
if (!is_connected()) |
return; |
+ bool ok = read_socket_watcher_.StopWatchingFileDescriptor(); |
+ DCHECK(ok); |
+ ok = write_socket_watcher_.StopWatchingFileDescriptor(); |
+ DCHECK(ok); |
+ |
if (HANDLE_EINTR(close(socket_)) < 0) |
PLOG(ERROR) << "close"; |
@@ -161,10 +175,7 @@ int UDPSocketLibevent::Read(IOBuffer* buf, |
DCHECK(callback); // Synchronous operation not supported |
DCHECK_GT(buf_len, 0); |
- read_buf_ = buf; |
- read_buf_len_ = buf_len; |
- |
- int nread = InternalRead(); |
+ int nread = InternalRead(buf, buf_len); |
if (nread != ERR_IO_PENDING) |
return nread; |
@@ -175,6 +186,8 @@ int UDPSocketLibevent::Read(IOBuffer* buf, |
return MapPosixError(errno); |
} |
+ read_buf_ = buf; |
+ read_buf_len_ = buf_len; |
read_callback_ = callback; |
return ERR_IO_PENDING; |
} |
@@ -232,7 +245,7 @@ int UDPSocketLibevent::Connect(const IPEndPoint& address) { |
DCHECK(!remote_address_.get()); |
int rv = CreateSocket(address); |
if (rv < 0) |
- return MapPosixError(rv); |
+ return rv; |
struct sockaddr_storage addr_storage; |
size_t addr_len = sizeof(addr_storage); |
@@ -242,7 +255,7 @@ int UDPSocketLibevent::Connect(const IPEndPoint& address) { |
rv = HANDLE_EINTR(connect(socket_, addr, addr_len)); |
if (rv < 0) |
- return MapPosixError(rv); |
+ return MapPosixError(errno); |
remote_address_.reset(new IPEndPoint(address)); |
return rv; |
@@ -253,7 +266,7 @@ int UDPSocketLibevent::Bind(const IPEndPoint& address) { |
DCHECK(!local_address_.get()); |
int rv = CreateSocket(address); |
if (rv < 0) |
- return MapPosixError(rv); |
+ return rv; |
struct sockaddr_storage addr_storage; |
size_t addr_len = sizeof(addr_storage); |
@@ -263,7 +276,7 @@ int UDPSocketLibevent::Bind(const IPEndPoint& address) { |
rv = bind(socket_, addr, addr_len); |
if (rv < 0) |
- return MapPosixError(rv); |
+ return MapPosixError(errno); |
local_address_.reset(new IPEndPoint(address)); |
return rv; |
@@ -292,7 +305,7 @@ void UDPSocketLibevent::DoWriteCallback(int rv) { |
} |
void UDPSocketLibevent::DidCompleteRead() { |
- int result = InternalRead(); |
+ int result = InternalRead(read_buf_, read_buf_len_); |
if (result != ERR_IO_PENDING) { |
read_buf_ = NULL; |
read_buf_len_ = 0; |
@@ -305,9 +318,9 @@ void UDPSocketLibevent::DidCompleteRead() { |
int UDPSocketLibevent::CreateSocket(const IPEndPoint& address) { |
socket_ = socket(address.GetFamily(), SOCK_DGRAM, 0); |
if (socket_ == kInvalidSocket) |
- return errno; |
+ return MapPosixError(errno); |
if (SetNonBlocking(socket_)) { |
- const int err = errno; |
+ const int err = MapPosixError(errno); |
Close(); |
return err; |
} |
@@ -331,7 +344,7 @@ void UDPSocketLibevent::DidCompleteWrite() { |
} |
} |
-int UDPSocketLibevent::InternalRead() { |
+int UDPSocketLibevent::InternalRead(IOBuffer* buf, int buf_len) { |
int bytes_transferred; |
int flags = 0; |
@@ -341,8 +354,8 @@ int UDPSocketLibevent::InternalRead() { |
bytes_transferred = |
HANDLE_EINTR(recvfrom(socket_, |
- read_buf_->data(), |
- read_buf_len_, |
+ buf->data(), |
+ buf_len, |
flags, |
addr, |
&addr_len)); |
@@ -360,6 +373,7 @@ int UDPSocketLibevent::InternalRead() { |
} |
return result; |
} |
+ |
int UDPSocketLibevent::InternalWrite(IOBuffer* buf, int buf_len) { |
struct sockaddr_storage addr_storage; |
size_t addr_len = sizeof(addr_storage); |