| Index: base/sync_socket_posix.cc
|
| diff --git a/base/sync_socket_posix.cc b/base/sync_socket_posix.cc
|
| index c486cb5464e14cfe46f26ea78d9fd193c8f28b67..a6eb51f2266661170b3d31ab9dd53eb753c3e51e 100644
|
| --- a/base/sync_socket_posix.cc
|
| +++ b/base/sync_socket_posix.cc
|
| @@ -30,25 +30,26 @@ const size_t kMaxMessageLength = static_cast<size_t>(INT_MAX);
|
|
|
| const SyncSocket::Handle SyncSocket::kInvalidHandle = -1;
|
|
|
| -bool SyncSocket::CreatePair(SyncSocket* pair[2]) {
|
| - Handle handles[2] = { kInvalidHandle, kInvalidHandle };
|
| - SyncSocket* tmp_sockets[2] = { NULL, NULL };
|
| +SyncSocket::SyncSocket() : handle_(kInvalidHandle) {}
|
| +
|
| +SyncSocket::~SyncSocket() {
|
| + Close();
|
| +}
|
| +
|
| +// static
|
| +bool SyncSocket::CreatePair(SyncSocket* socket_a, SyncSocket* socket_b) {
|
| + DCHECK(socket_a != socket_b);
|
| + DCHECK(socket_a->handle_ == kInvalidHandle);
|
| + DCHECK(socket_b->handle_ == kInvalidHandle);
|
| +
|
| #if defined(OS_MACOSX)
|
| int nosigpipe = 1;
|
| #endif // defined(OS_MACOSX)
|
|
|
| - // Create the two SyncSocket objects first to avoid ugly cleanup issues.
|
| - tmp_sockets[0] = new SyncSocket(kInvalidHandle);
|
| - if (tmp_sockets[0] == NULL) {
|
| - goto cleanup;
|
| - }
|
| - tmp_sockets[1] = new SyncSocket(kInvalidHandle);
|
| - if (tmp_sockets[1] == NULL) {
|
| - goto cleanup;
|
| - }
|
| - if (socketpair(AF_UNIX, SOCK_STREAM, 0, handles) != 0) {
|
| + Handle handles[2] = { kInvalidHandle, kInvalidHandle };
|
| + if (socketpair(AF_UNIX, SOCK_STREAM, 0, handles) != 0)
|
| goto cleanup;
|
| - }
|
| +
|
| #if defined(OS_MACOSX)
|
| // On OSX an attempt to read or write to a closed socket may generate a
|
| // SIGPIPE rather than returning -1. setsockopt will shut this off.
|
| @@ -59,11 +60,11 @@ bool SyncSocket::CreatePair(SyncSocket* pair[2]) {
|
| goto cleanup;
|
| }
|
| #endif
|
| +
|
| // Copy the handles out for successful return.
|
| - tmp_sockets[0]->handle_ = handles[0];
|
| - pair[0] = tmp_sockets[0];
|
| - tmp_sockets[1]->handle_ = handles[1];
|
| - pair[1] = tmp_sockets[1];
|
| + socket_a->handle_ = handles[0];
|
| + socket_b->handle_ = handles[1];
|
| +
|
| return true;
|
|
|
| cleanup:
|
| @@ -75,8 +76,7 @@ bool SyncSocket::CreatePair(SyncSocket* pair[2]) {
|
| if (HANDLE_EINTR(close(handles[1])) < 0)
|
| DPLOG(ERROR) << "close";
|
| }
|
| - delete tmp_sockets[0];
|
| - delete tmp_sockets[1];
|
| +
|
| return false;
|
| }
|
|
|
| @@ -101,11 +101,9 @@ size_t SyncSocket::Send(const void* buffer, size_t length) {
|
| size_t SyncSocket::Receive(void* buffer, size_t length) {
|
| DCHECK_LE(length, kMaxMessageLength);
|
| char* charbuffer = static_cast<char*>(buffer);
|
| - if (file_util::ReadFromFD(handle_, charbuffer, length)) {
|
| + if (file_util::ReadFromFD(handle_, charbuffer, length))
|
| return length;
|
| - } else {
|
| - return -1;
|
| - }
|
| + return 0;
|
| }
|
|
|
| size_t SyncSocket::Peek() {
|
| @@ -117,4 +115,19 @@ size_t SyncSocket::Peek() {
|
| return (size_t) number_chars;
|
| }
|
|
|
| +CancelableSyncSocket::CancelableSyncSocket() {}
|
| +CancelableSyncSocket::CancelableSyncSocket(Handle handle)
|
| + : SyncSocket(handle) {
|
| +}
|
| +
|
| +bool CancelableSyncSocket::Shutdown() {
|
| + return HANDLE_EINTR(shutdown(handle(), SHUT_RDWR)) >= 0;
|
| +}
|
| +
|
| +// static
|
| +bool CancelableSyncSocket::CreatePair(CancelableSyncSocket* socket_a,
|
| + CancelableSyncSocket* socket_b) {
|
| + return SyncSocket::CreatePair(socket_a, socket_b);
|
| +}
|
| +
|
| } // namespace base
|
|
|