Chromium Code Reviews| Index: ipc/ipc_channel_win.cc |
| diff --git a/ipc/ipc_channel_win.cc b/ipc/ipc_channel_win.cc |
| index cd313d21a96fbd83af6189696ba60960091d8870..d324bfb2953c97dac1c07a437d3bf04c7683849c 100644 |
| --- a/ipc/ipc_channel_win.cc |
| +++ b/ipc/ipc_channel_win.cc |
| @@ -114,11 +114,28 @@ const std::wstring Channel::ChannelImpl::PipeName( |
| bool Channel::ChannelImpl::CreatePipe(const IPC::ChannelHandle &channel_handle, |
| Mode mode) { |
| DCHECK_EQ(INVALID_HANDLE_VALUE, pipe_); |
| - const std::wstring pipe_name = PipeName(channel_handle.name); |
| - if (mode & MODE_SERVER_FLAG) { |
| + std::wstring pipe_name; |
| + // If we already have a valid pipe for channel just copy it. |
| + if (channel_handle.pipe.handle) { |
| + DCHECK(channel_handle.name.empty()); |
| + pipe_name = L"Not Available"; // Just used for LOG |
| + if (!DuplicateHandle(GetCurrentProcess(), |
| + channel_handle.pipe.handle, |
| + GetCurrentProcess(), |
| + &pipe_, |
| + 0, |
| + FALSE, |
| + DUPLICATE_SAME_ACCESS)) { |
| + LOG(WARNING) << "DuplicateHandle failed. Error :" << GetLastError(); |
| + return false; |
|
cpu_(ooo_6.6-7.5)
2012/01/20 22:22:25
How do you feel about calling GetNamedPipeInfo an
|
| + } |
| + } else if (mode & MODE_SERVER_FLAG) { |
| + DCHECK(!channel_handle.pipe.handle); |
| + const DWORD open_mode = PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED | |
| + FILE_FLAG_FIRST_PIPE_INSTANCE; |
| + pipe_name = PipeName(channel_handle.name); |
| pipe_ = CreateNamedPipeW(pipe_name.c_str(), |
| - PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED | |
| - FILE_FLAG_FIRST_PIPE_INSTANCE, |
| + open_mode, |
| PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, |
| 1, |
| Channel::kReadBufferSize, |
| @@ -126,6 +143,8 @@ bool Channel::ChannelImpl::CreatePipe(const IPC::ChannelHandle &channel_handle, |
| 5000, |
| NULL); |
| } else if (mode & MODE_CLIENT_FLAG) { |
| + DCHECK(!channel_handle.pipe.handle); |
| + pipe_name = PipeName(channel_handle.name); |
| pipe_ = CreateFileW(pipe_name.c_str(), |
| GENERIC_READ | GENERIC_WRITE, |
| 0, |
| @@ -137,6 +156,7 @@ bool Channel::ChannelImpl::CreatePipe(const IPC::ChannelHandle &channel_handle, |
| } else { |
| NOTREACHED(); |
| } |
| + |
| if (pipe_ == INVALID_HANDLE_VALUE) { |
| // If this process is being closed, the pipe may be gone already. |
| LOG(WARNING) << "Unable to create pipe \"" << pipe_name << |