| Index: base/sync_socket_posix.cc
|
| ===================================================================
|
| --- base/sync_socket_posix.cc (revision 118668)
|
| +++ base/sync_socket_posix.cc (working copy)
|
| @@ -30,25 +30,26 @@
|
|
|
| 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) {
|
| + Handle handles[2] = { kInvalidHandle, kInvalidHandle };
|
| + if (socketpair(AF_UNIX, SOCK_STREAM, 0, handles) != 0)
|
| goto cleanup;
|
| - }
|
| - tmp_sockets[1] = new SyncSocket(kInvalidHandle);
|
| - if (tmp_sockets[1] == NULL) {
|
| - goto cleanup;
|
| - }
|
| - 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 @@
|
| 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 @@
|
| if (HANDLE_EINTR(close(handles[1])) < 0)
|
| DPLOG(ERROR) << "close";
|
| }
|
| - delete tmp_sockets[0];
|
| - delete tmp_sockets[1];
|
| +
|
| return false;
|
| }
|
|
|
| @@ -117,4 +117,13 @@
|
| return (size_t) number_chars;
|
| }
|
|
|
| +CancelableSyncSocket::CancelableSyncSocket() {}
|
| +CancelableSyncSocket::CancelableSyncSocket(Handle handle)
|
| + : SyncSocket(handle) {
|
| +}
|
| +
|
| +bool CancelableSyncSocket::Shutdown() {
|
| + return HANDLE_EINTR(shutdown(handle(), SHUT_RDWR)) >= 0;
|
| +}
|
| +
|
| } // namespace base
|
|
|