Index: base/process_util_posix.cc |
=================================================================== |
--- base/process_util_posix.cc (revision 35883) |
+++ base/process_util_posix.cc (working copy) |
@@ -26,12 +26,6 @@ |
#include "base/time.h" |
#include "base/waitable_event.h" |
-#if defined(OS_MACOSX) |
-#include "base/mach_broker_mac.h" |
- |
- |
-#endif |
- |
const int kMicrosecondsPerSecond = 1000000; |
namespace base { |
@@ -286,148 +280,11 @@ |
} |
} |
-#if defined(OS_MACOSX) |
- |
-#define CHECK_MACH_ERROR(err, s) \ |
-do { \ |
- if (err != KERN_SUCCESS) { \ |
- fprintf(stderr, "%s 0x%x", s, (int)err); \ |
- exit(1); \ |
- } \ |
-} while (0) |
- |
-static int |
-setup_recv_port (mach_port_t *recv_port) |
-{ |
- kern_return_t err; |
- mach_port_t port = MACH_PORT_NULL; |
- err = mach_port_allocate (mach_task_self (), |
- MACH_PORT_RIGHT_RECEIVE, &port); |
- CHECK_MACH_ERROR (err, "mach_port_allocate failed:"); |
- |
- err = mach_port_insert_right (mach_task_self (), |
- port, |
- port, |
- MACH_MSG_TYPE_MAKE_SEND); |
- CHECK_MACH_ERROR (err, "mach_port_insert_right failed:"); |
- |
- *recv_port = port; |
- return 0; |
-} |
- |
-static int |
-send_port (mach_port_t remote_port, mach_port_t port) |
-{ |
- kern_return_t err; |
- |
- struct { |
- mach_msg_header_t header; |
- mach_msg_body_t body; |
- mach_msg_port_descriptor_t task_port; |
- } msg; |
- |
- msg.header.msgh_remote_port = remote_port; |
- msg.header.msgh_local_port = MACH_PORT_NULL; |
- msg.header.msgh_bits = MACH_MSGH_BITS (MACH_MSG_TYPE_COPY_SEND, 0) | |
- MACH_MSGH_BITS_COMPLEX; |
- msg.header.msgh_size = sizeof msg; |
- |
- msg.body.msgh_descriptor_count = 1; |
- msg.task_port.name = port; |
- msg.task_port.disposition = MACH_MSG_TYPE_COPY_SEND; |
- msg.task_port.type = MACH_MSG_PORT_DESCRIPTOR; |
- |
- err = mach_msg_send (&msg.header); |
- CHECK_MACH_ERROR (err, "mach_msg_send failed:"); |
- |
- return 0; |
-} |
- |
-static int |
-recv_port (mach_port_t recv_port, mach_port_t *port) |
-{ |
- kern_return_t err; |
- struct { |
- mach_msg_header_t header; |
- mach_msg_body_t body; |
- mach_msg_port_descriptor_t task_port; |
- mach_msg_trailer_t trailer; |
- } msg; |
- |
- err = mach_msg (&msg.header, MACH_RCV_MSG, |
- 0, sizeof msg, recv_port, |
- MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); |
- CHECK_MACH_ERROR (err, "mach_msg failed:"); |
- |
- *port = msg.task_port.name; |
- return 0; |
-} |
- |
-static task_t child_task = MACH_PORT_NULL; |
- |
-pid_t |
-sampling_fork () |
-{ |
- kern_return_t err; |
- mach_port_t parent_recv_port = MACH_PORT_NULL; |
- mach_port_t child_recv_port = MACH_PORT_NULL; |
- |
- if (setup_recv_port (&parent_recv_port) != 0) |
- return -1; |
- err = task_set_bootstrap_port (mach_task_self (), parent_recv_port); |
- CHECK_MACH_ERROR (err, "task_set_bootstrap_port failed:"); |
- |
- pid_t pid; |
- switch (pid = fork ()) { |
- case -1: |
- err = mach_port_deallocate (mach_task_self(), parent_recv_port); |
- CHECK_MACH_ERROR (err, "mach_port_deallocate failed:"); |
- return pid; |
- case 0: /* child */ |
- err = task_get_bootstrap_port (mach_task_self (), &parent_recv_port); |
- CHECK_MACH_ERROR (err, "task_get_bootstrap_port failed:"); |
- if (setup_recv_port (&child_recv_port) != 0) |
- return -1; |
- if (send_port (parent_recv_port, mach_task_self ()) != 0) |
- return -1; |
- if (send_port (parent_recv_port, child_recv_port) != 0) |
- return -1; |
- if (recv_port (child_recv_port, &bootstrap_port) != 0) |
- return -1; |
- err = task_set_bootstrap_port (mach_task_self (), bootstrap_port); |
- CHECK_MACH_ERROR (err, "task_set_bootstrap_port failed:"); |
- break; |
- default: /* parent */ |
- err = task_set_bootstrap_port (mach_task_self (), bootstrap_port); |
- CHECK_MACH_ERROR (err, "task_set_bootstrap_port failed:"); |
- if (recv_port (parent_recv_port, &child_task) != 0) |
- return -1; |
- if (recv_port (parent_recv_port, &child_recv_port) != 0) |
- return -1; |
- if (send_port (child_recv_port, bootstrap_port) != 0) |
- return -1; |
- err = mach_port_deallocate (mach_task_self(), parent_recv_port); |
- CHECK_MACH_ERROR (err, "mach_port_deallocate failed:"); |
- break; |
- } |
- |
- return pid; |
-} |
-#endif |
- |
bool LaunchApp(const std::vector<std::string>& argv, |
const environment_vector& environ, |
const file_handle_mapping_vector& fds_to_remap, |
bool wait, ProcessHandle* process_handle) { |
-#if defined(OS_MACOSX) |
- // Needs to be mutexed! :-( |
- pid_t pid = sampling_fork(); |
- MachBroker::instance()->RegisterPid( |
- pid, |
- MachBroker::MachInfo().SetTask(child_task)); |
-#else |
pid_t pid = fork(); |
-#endif |
if (pid < 0) |
return false; |