Index: util/test/mac/mach_multiprocess.cc |
diff --git a/util/test/mac/mach_multiprocess.cc b/util/test/mac/mach_multiprocess.cc |
index 9d634f91a15289459e9f1ebf7d238e9c673a50a3..c5e749cf48c2f7ef35797c15c27caa59e1ba8866 100644 |
--- a/util/test/mac/mach_multiprocess.cc |
+++ b/util/test/mac/mach_multiprocess.cc |
@@ -67,19 +67,25 @@ namespace internal { |
struct MachMultiprocessInfo { |
MachMultiprocessInfo() |
: service_name(), |
- read_pipe(-1), |
- write_pipe(-1), |
+ pipe_c2p_read(-1), |
+ pipe_c2p_write(-1), |
+ pipe_p2c_read(-1), |
+ pipe_p2c_write(-1), |
child_pid(0), |
- pipe_fd(-1), |
+ read_pipe_fd(-1), |
+ write_pipe_fd(-1), |
local_port(MACH_PORT_NULL), |
remote_port(MACH_PORT_NULL), |
child_task(MACH_PORT_NULL) {} |
std::string service_name; |
- base::ScopedFD read_pipe; |
- base::ScopedFD write_pipe; |
+ base::ScopedFD pipe_c2p_read; // child to parent |
+ base::ScopedFD pipe_c2p_write; // child to parent |
+ base::ScopedFD pipe_p2c_read; // parent to child |
+ base::ScopedFD pipe_p2c_write; // parent to child |
pid_t child_pid; // valid only in parent |
- int pipe_fd; // read_pipe in parent, write_pipe in child |
+ int read_pipe_fd; // pipe_c2p_read in parent, pipe_p2c_read in child |
+ int write_pipe_fd; // pipe_p2c_write in parent, pipe_c2p_write in child |
base::mac::ScopedMachReceiveRight local_port; |
base::mac::ScopedMachSendRight remote_port; |
base::mac::ScopedMachSendRight child_task; // valid only in parent |
@@ -97,12 +103,19 @@ void MachMultiprocess::Run() { |
base::AutoReset<internal::MachMultiprocessInfo*> reset_info(&info_, |
info.get()); |
- int pipe_fds[2]; |
- int rv = pipe(pipe_fds); |
+ int pipe_fds_c2p[2]; |
+ int rv = pipe(pipe_fds_c2p); |
ASSERT_EQ(0, rv) << ErrnoMessage("pipe"); |
- info_->read_pipe.reset(pipe_fds[0]); |
- info_->write_pipe.reset(pipe_fds[1]); |
+ info_->pipe_c2p_read.reset(pipe_fds_c2p[0]); |
+ info_->pipe_c2p_write.reset(pipe_fds_c2p[1]); |
+ |
+ int pipe_fds_p2c[2]; |
+ rv = pipe(pipe_fds_p2c); |
+ ASSERT_EQ(0, rv) << ErrnoMessage("pipe"); |
+ |
+ info_->pipe_p2c_read.reset(pipe_fds_p2c[0]); |
+ info_->pipe_p2c_write.reset(pipe_fds_p2c[1]); |
// Set up the parent port and register it with the bootstrap server before |
// forking, so that it’s guaranteed to be there when the child attempts to |
@@ -169,9 +182,14 @@ pid_t MachMultiprocess::ChildPID() const { |
return info_->child_pid; |
} |
-int MachMultiprocess::PipeFD() const { |
- EXPECT_NE(-1, info_->pipe_fd); |
- return info_->pipe_fd; |
+int MachMultiprocess::ReadPipeFD() const { |
+ EXPECT_NE(-1, info_->read_pipe_fd); |
+ return info_->read_pipe_fd; |
+} |
+ |
+int MachMultiprocess::WritePipeFD() const { |
+ EXPECT_NE(-1, info_->write_pipe_fd); |
+ return info_->write_pipe_fd; |
} |
mach_port_t MachMultiprocess::LocalPort() const { |
@@ -190,9 +208,11 @@ mach_port_t MachMultiprocess::ChildTask() const { |
} |
void MachMultiprocess::RunParent() { |
- // The parent uses the read end of the pipe. |
- info_->write_pipe.reset(); |
- info_->pipe_fd = info_->read_pipe.get(); |
+ // The parent uses the read end of c2p and the write end of p2c. |
+ info_->pipe_c2p_write.reset(); |
+ info_->read_pipe_fd = info_->pipe_c2p_read.get(); |
+ info_->pipe_p2c_read.reset(); |
+ info_->write_pipe_fd = info_->pipe_p2c_write.get(); |
ReceiveHelloMessage message = {}; |
@@ -284,8 +304,10 @@ void MachMultiprocess::RunParent() { |
info_->remote_port.reset(); |
info_->local_port.reset(); |
- info_->pipe_fd = -1; |
- info_->read_pipe.reset(); |
+ info_->read_pipe_fd = -1; |
+ info_->pipe_c2p_read.reset(); |
+ info_->write_pipe_fd = -1; |
+ info_->pipe_p2c_write.reset(); |
} |
void MachMultiprocess::RunChild() { |
@@ -294,9 +316,11 @@ void MachMultiprocess::RunChild() { |
// local_port is not valid in the forked child process. |
ignore_result(info_->local_port.release()); |
- // The child uses the write end of the pipe. |
- info_->read_pipe.reset(); |
- info_->pipe_fd = info_->write_pipe.get(); |
+ // The child uses the write end of c2p and the read end of p2c. |
+ info_->pipe_c2p_read.reset(); |
+ info_->write_pipe_fd = info_->pipe_c2p_write.get(); |
+ info_->pipe_p2c_write.reset(); |
+ info_->read_pipe_fd = info_->pipe_p2c_read.get(); |
mach_port_t local_port; |
kern_return_t kr = mach_port_allocate( |
@@ -341,8 +365,10 @@ void MachMultiprocess::RunChild() { |
info_->remote_port.reset(); |
info_->local_port.reset(); |
- info_->pipe_fd = -1; |
- info_->write_pipe.reset(); |
+ info_->write_pipe_fd = -1; |
+ info_->pipe_c2p_write.reset(); |
+ info_->read_pipe_fd = -1; |
+ info_->pipe_p2c_read.reset(); |
if (Test::HasFailure()) { |
// Trigger the ScopedNotReached destructor. |