summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrsesek@chromium.org <rsesek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-12 21:48:57 +0000
committerrsesek@chromium.org <rsesek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-12 21:48:57 +0000
commit0f8de3cecf676d9c052560a1129c13eb08f7cee1 (patch)
tree71daaf0ce38780d084492233d605861c1feff503
parent60028964db515686c70fe6b169950c3e8c3449c8 (diff)
downloadchromium_src-0f8de3cecf676d9c052560a1129c13eb08f7cee1.zip
chromium_src-0f8de3cecf676d9c052560a1129c13eb08f7cee1.tar.gz
chromium_src-0f8de3cecf676d9c052560a1129c13eb08f7cee1.tar.bz2
Remove base/mach_ipc_mac.{h,mm}.
The only bit that was still being used was GetNumberOfMachPorts(). Move the impl of that into its one caller. BUG=none Review URL: https://chromiumcodereview.appspot.com/14137013 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@194022 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--base/base.gypi2
-rw-r--r--base/mach_ipc_mac.h328
-rw-r--r--base/mach_ipc_mac.mm358
-rw-r--r--chrome/browser/automation/testing_automation_provider.cc27
-rw-r--r--content/app/content_main_runner.cc1
-rw-r--r--content/browser/mach_broker_mac.mm2
6 files changed, 26 insertions, 692 deletions
diff --git a/base/base.gypi b/base/base.gypi
index 2afc858..f26c4c7 100644
--- a/base/base.gypi
+++ b/base/base.gypi
@@ -248,8 +248,6 @@
'mac/scoped_nsexception_enabler.mm',
'mac/scoped_sending_event.h',
'mac/scoped_sending_event.mm',
- 'mach_ipc_mac.h',
- 'mach_ipc_mac.mm',
'memory/aligned_memory.cc',
'memory/aligned_memory.h',
'memory/discardable_memory.cc',
diff --git a/base/mach_ipc_mac.h b/base/mach_ipc_mac.h
deleted file mode 100644
index 7f5f7d6..0000000
--- a/base/mach_ipc_mac.h
+++ /dev/null
@@ -1,328 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_MACH_IPC_MAC_H_
-#define BASE_MACH_IPC_MAC_H_
-
-#include <mach/mach.h>
-#include <mach/message.h>
-#include <servers/bootstrap.h>
-#include <sys/types.h>
-
-#include <CoreServices/CoreServices.h>
-
-#include "base/base_export.h"
-#include "base/basictypes.h"
-
-//==============================================================================
-// DISCUSSION:
-//
-// The three main classes of interest are
-//
-// MachMessage: a wrapper for a Mach message of the following form
-// mach_msg_header_t
-// mach_msg_body_t
-// optional descriptors
-// optional extra message data
-//
-// MachReceiveMessage and MachSendMessage subclass MachMessage
-// and are used instead of MachMessage which is an abstract base class
-//
-// ReceivePort:
-// Represents a Mach port for which we have receive rights
-//
-// MachPortSender:
-// Represents a Mach port for which we have send rights
-//
-// Here's an example to receive a message on a server port:
-//
-// // This creates our named server port
-// ReceivePort receivePort("com.Google.MyService");
-//
-// MachReceiveMessage message;
-// kern_return_t result = receivePort.WaitForMessage(&message, 0);
-//
-// if (result == KERN_SUCCESS && message.GetMessageID() == 57) {
-// mach_port_t task = message.GetTranslatedPort(0);
-// mach_port_t thread = message.GetTranslatedPort(1);
-//
-// char *messageString = message.GetData();
-//
-// printf("message string = %s\n", messageString);
-// }
-//
-// Here is an example of using these classes to send a message to this port:
-//
-// // send to already named port
-// MachPortSender sender("com.Google.MyService");
-// MachSendMessage message(57); // our message ID is 57
-//
-// // add some ports to be translated for us
-// message.AddDescriptor(mach_task_self()); // our task
-// message.AddDescriptor(mach_thread_self()); // this thread
-//
-// char messageString[] = "Hello server!\n";
-// message.SetData(messageString, strlen(messageString)+1);
-// // timeout 1000ms
-// kern_return_t result = sender.SendMessage(message, 1000);
-//
-
-#define PRINT_MACH_RESULT(result_, message_) \
- printf(message_" %s (%d)\n", mach_error_string(result_), result_ );
-
-namespace base {
-
-//==============================================================================
-// A wrapper class for mach_msg_port_descriptor_t (with same memory layout)
-// with convenient constructors and accessors
-class MachMsgPortDescriptor : public mach_msg_port_descriptor_t {
- public:
- // General-purpose constructor
- MachMsgPortDescriptor(mach_port_t in_name,
- mach_msg_type_name_t in_disposition) {
- name = in_name;
- pad1 = 0;
- pad2 = 0;
- disposition = in_disposition;
- type = MACH_MSG_PORT_DESCRIPTOR;
- }
-
- // For passing send rights to a port
- MachMsgPortDescriptor(mach_port_t in_name) {
- name = in_name;
- pad1 = 0;
- pad2 = 0;
- disposition = MACH_MSG_TYPE_PORT_SEND;
- type = MACH_MSG_PORT_DESCRIPTOR;
- }
-
- // Copy constructor
- MachMsgPortDescriptor(const MachMsgPortDescriptor& desc) {
- name = desc.name;
- pad1 = desc.pad1;
- pad2 = desc.pad2;
- disposition = desc.disposition;
- type = desc.type;
- }
-
- mach_port_t GetMachPort() const {
- return name;
- }
-
- mach_msg_type_name_t GetDisposition() const {
- return disposition;
- }
-
- // For convenience
- operator mach_port_t() const {
- return GetMachPort();
- }
-};
-
-//==============================================================================
-// MachMessage: a wrapper for a Mach message
-// (mach_msg_header_t, mach_msg_body_t, extra data)
-//
-// This considerably simplifies the construction of a message for sending
-// and the getting at relevant data and descriptors for the receiver.
-//
-// This class can be initialized using external storage of an arbitrary size
-// or it can manage storage internally.
-// 1. If storage is allocated internally, the combined size of the descriptors
-// plus data must be less than 1024. But as a benefit no memory allocation is
-// necessary.
-// 2. For external storage, a buffer of at least EmptyMessageSize() must be
-// provided.
-//
-// A MachMessage object is used by ReceivePort::WaitForMessage
-// and MachPortSender::SendMessage
-//
-class BASE_EXPORT MachMessage {
- public:
- static const size_t kEmptyMessageSize;
-
- virtual ~MachMessage();
-
- // The receiver of the message can retrieve the raw data this way
- u_int8_t *GetData() const {
- return GetDataLength() > 0 ? GetDataPacket()->data : NULL;
- }
-
- u_int32_t GetDataLength() const {
- return EndianU32_LtoN(GetDataPacket()->data_length);
- }
-
- // The message ID may be used as a code identifying the type of message
- void SetMessageID(int32_t message_id) {
- GetDataPacket()->id = EndianU32_NtoL(message_id);
- }
-
- int32_t GetMessageID() const { return EndianU32_LtoN(GetDataPacket()->id); }
-
- // Adds a descriptor (typically a Mach port) to be translated
- // returns true if successful, otherwise not enough space
- bool AddDescriptor(const MachMsgPortDescriptor &desc);
-
- int GetDescriptorCount() const {
- return storage_->body.msgh_descriptor_count;
- }
-
- MachMsgPortDescriptor *GetDescriptor(int n) const;
-
- // Convenience method which gets the Mach port described by the descriptor
- mach_port_t GetTranslatedPort(int n) const;
-
- // A simple message is one with no descriptors
- bool IsSimpleMessage() const { return GetDescriptorCount() == 0; }
-
- // Sets raw data for the message (returns false if not enough space)
- bool SetData(const void* data, int32_t data_length);
-
- protected:
- // Consider this an abstract base class - must create an actual instance
- // of MachReceiveMessage or MachSendMessage
- MachMessage();
-
- // Constructor for use with preallocate storage.
- // storage_length must be >= EmptyMessageSize()
- MachMessage(void *storage, size_t storage_length);
-
- friend class ReceivePort;
- friend class MachPortSender;
-
- // Represents raw data in our message
- struct MessageDataPacket {
- int32_t id; // little-endian
- int32_t data_length; // little-endian
- u_int8_t data[1]; // actual size limited by storage_length_bytes_
- };
-
- MessageDataPacket* GetDataPacket() const;
-
- void SetDescriptorCount(int n);
- void SetDescriptor(int n, const MachMsgPortDescriptor &desc);
-
- // Returns total message size setting msgh_size in the header to this value
- int CalculateSize();
-
- // Returns total storage size that this object can grow to, this is inclusive
- // of the Mach header.
- size_t MaxSize() const { return storage_length_bytes_; }
-
- mach_msg_header_t *Head() const { return &(storage_->head); }
-
- private:
- struct MachMessageData {
- mach_msg_header_t head;
- mach_msg_body_t body;
- // descriptors and data may be embedded here.
- u_int8_t padding[1024];
- };
-
- MachMessageData *storage_;
- size_t storage_length_bytes_;
- bool own_storage_; // Is storage owned by this object?
-};
-
-//==============================================================================
-// MachReceiveMessage and MachSendMessage are useful to separate the idea
-// of a Mach message being sent and being received, and adds increased type
-// safety:
-// ReceivePort::WaitForMessage() only accepts a MachReceiveMessage
-// MachPortSender::SendMessage() only accepts a MachSendMessage
-
-//==============================================================================
-class MachReceiveMessage : public MachMessage {
- public:
- MachReceiveMessage() : MachMessage() {}
- MachReceiveMessage(void *storage, size_t storage_length)
- : MachMessage(storage, storage_length) {}
-
- private:
- DISALLOW_COPY_AND_ASSIGN(MachReceiveMessage);
-};
-
-//==============================================================================
-class BASE_EXPORT MachSendMessage : public MachMessage {
- public:
- explicit MachSendMessage(int32_t message_id);
- MachSendMessage(void *storage, size_t storage_length, int32_t message_id);
-
- private:
- void Initialize(int32_t message_id);
-
- DISALLOW_COPY_AND_ASSIGN(MachSendMessage);
-};
-
-//==============================================================================
-// Represents a Mach port for which we have receive rights
-class BASE_EXPORT ReceivePort {
- public:
- // Creates a new Mach port for receiving messages and registers a name for it
- explicit ReceivePort(const char *receive_port_name);
-
- // Given an already existing Mach port, use it. We take ownership of the
- // port and deallocate it in our destructor.
- explicit ReceivePort(mach_port_t receive_port);
-
- // Create a new Mach port for receiving messages
- ReceivePort();
-
- ~ReceivePort();
-
- // Waits on the Mach port until message received or timeout. If |timeout| is
- // MACH_MSG_TIMEOUT_NONE, this method waits forever.
- kern_return_t WaitForMessage(MachReceiveMessage *out_message,
- mach_msg_timeout_t timeout);
-
- // The underlying Mach port that we wrap
- mach_port_t GetPort() const { return port_; }
-
- private:
- mach_port_t port_;
- kern_return_t init_result_;
-
- DISALLOW_COPY_AND_ASSIGN(ReceivePort);
-};
-
-//==============================================================================
-// Represents a Mach port for which we have send rights
-class BASE_EXPORT MachPortSender {
- public:
- // get a port with send rights corresponding to a named registered service
- explicit MachPortSender(const char *receive_port_name);
-
-
- // Given an already existing Mach port, use it. Does not take ownership of
- // |send_port|.
- explicit MachPortSender(mach_port_t send_port);
-
- kern_return_t SendMessage(const MachSendMessage& message,
- mach_msg_timeout_t timeout);
-
- mach_port_t GetPort() const { return send_port_; }
-
- private:
- mach_port_t send_port_;
- kern_return_t init_result_;
-
- DISALLOW_COPY_AND_ASSIGN(MachPortSender);
-};
-
-//==============================================================================
-// Static utility functions.
-
-namespace mac {
-
-// Returns the number of Mach ports to which the given task has a right.
-// Note that unless the calling task has send rights to the passed task port,
-// this will fail unless the calling task is running as root.
-kern_return_t BASE_EXPORT GetNumberOfMachPorts(mach_port_t task_port,
- int* port_count);
-
-} // namespace mac
-
-} // namespace base
-
-#endif // BASE_MACH_IPC_MAC_H_
diff --git a/base/mach_ipc_mac.mm b/base/mach_ipc_mac.mm
deleted file mode 100644
index 6f2575e..0000000
--- a/base/mach_ipc_mac.mm
+++ /dev/null
@@ -1,358 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/mach_ipc_mac.h"
-
-#import <Foundation/Foundation.h>
-#include <mach/vm_map.h>
-
-#include <stdio.h>
-#include "base/logging.h"
-
-namespace base {
-
-// static
-const size_t MachMessage::kEmptyMessageSize = sizeof(mach_msg_header_t) +
- sizeof(mach_msg_body_t) + sizeof(MessageDataPacket);
-
-//==============================================================================
-MachSendMessage::MachSendMessage(int32_t message_id) : MachMessage() {
- Initialize(message_id);
-}
-
-MachSendMessage::MachSendMessage(void *storage, size_t storage_length,
- int32_t message_id)
- : MachMessage(storage, storage_length) {
- Initialize(message_id);
-}
-
-void MachSendMessage::Initialize(int32_t message_id) {
- Head()->msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0);
-
- // head.msgh_remote_port = ...; // filled out in MachPortSender::SendMessage()
- Head()->msgh_local_port = MACH_PORT_NULL;
- Head()->msgh_reserved = 0;
- Head()->msgh_id = 0;
-
- SetDescriptorCount(0); // start out with no descriptors
-
- SetMessageID(message_id);
- SetData(NULL, 0); // client may add data later
-}
-
-//==============================================================================
-MachMessage::MachMessage()
- : storage_(new MachMessageData), // Allocate storage_ ourselves
- storage_length_bytes_(sizeof(MachMessageData)),
- own_storage_(true) {
- memset(storage_, 0, storage_length_bytes_);
-}
-
-//==============================================================================
-MachMessage::MachMessage(void *storage, size_t storage_length)
- : storage_(static_cast<MachMessageData*>(storage)),
- storage_length_bytes_(storage_length),
- own_storage_(false) {
- DCHECK(storage);
- DCHECK_GE(storage_length, kEmptyMessageSize);
-}
-
-//==============================================================================
-MachMessage::~MachMessage() {
- if (own_storage_) {
- delete storage_;
- storage_ = NULL;
- }
-}
-
-//==============================================================================
-// returns true if successful
-bool MachMessage::SetData(const void* data,
- int32_t data_length) {
- // Enforce the fact that it's only safe to call this method once on a
- // message.
- DCHECK(GetDataPacket()->data_length == 0);
-
- // first check to make sure we have enough space
- int size = CalculateSize();
- int new_size = size + data_length;
-
- if ((unsigned)new_size > storage_length_bytes_) {
- return false; // not enough space
- }
-
- GetDataPacket()->data_length = EndianU32_NtoL(data_length);
- if (data) memcpy(GetDataPacket()->data, data, data_length);
-
- // Update the Mach header with the new aligned size of the message.
- CalculateSize();
-
- return true;
-}
-
-//==============================================================================
-// calculates and returns the total size of the message
-// Currently, the entire message MUST fit inside of the MachMessage
-// messsage size <= EmptyMessageSize()
-int MachMessage::CalculateSize() {
- int size = sizeof(mach_msg_header_t) + sizeof(mach_msg_body_t);
-
- // add space for MessageDataPacket
- int32_t alignedDataLength = (GetDataLength() + 3) & ~0x3;
- size += 2*sizeof(int32_t) + alignedDataLength;
-
- // add space for descriptors
- size += GetDescriptorCount() * sizeof(MachMsgPortDescriptor);
-
- Head()->msgh_size = size;
-
- return size;
-}
-
-//==============================================================================
-MachMessage::MessageDataPacket *MachMessage::GetDataPacket() const {
- int desc_size = sizeof(MachMsgPortDescriptor)*GetDescriptorCount();
- MessageDataPacket *packet =
- reinterpret_cast<MessageDataPacket*>(storage_->padding + desc_size);
-
- return packet;
-}
-
-//==============================================================================
-void MachMessage::SetDescriptor(int n,
- const MachMsgPortDescriptor &desc) {
- MachMsgPortDescriptor *desc_array =
- reinterpret_cast<MachMsgPortDescriptor*>(storage_->padding);
- desc_array[n] = desc;
-}
-
-//==============================================================================
-// returns true if successful otherwise there was not enough space
-bool MachMessage::AddDescriptor(const MachMsgPortDescriptor &desc) {
- // first check to make sure we have enough space
- int size = CalculateSize();
- int new_size = size + sizeof(MachMsgPortDescriptor);
-
- if ((unsigned)new_size > storage_length_bytes_) {
- return false; // not enough space
- }
-
- // unfortunately, we need to move the data to allow space for the
- // new descriptor
- u_int8_t *p = reinterpret_cast<u_int8_t*>(GetDataPacket());
- bcopy(p, p+sizeof(MachMsgPortDescriptor), GetDataLength()+2*sizeof(int32_t));
-
- SetDescriptor(GetDescriptorCount(), desc);
- SetDescriptorCount(GetDescriptorCount() + 1);
-
- CalculateSize();
-
- return true;
-}
-
-//==============================================================================
-void MachMessage::SetDescriptorCount(int n) {
- storage_->body.msgh_descriptor_count = n;
-
- if (n > 0) {
- Head()->msgh_bits |= MACH_MSGH_BITS_COMPLEX;
- } else {
- Head()->msgh_bits &= ~MACH_MSGH_BITS_COMPLEX;
- }
-}
-
-//==============================================================================
-MachMsgPortDescriptor *MachMessage::GetDescriptor(int n) const {
- if (n < GetDescriptorCount()) {
- MachMsgPortDescriptor *desc =
- reinterpret_cast<MachMsgPortDescriptor*>(storage_->padding);
- return desc + n;
- }
-
- return nil;
-}
-
-//==============================================================================
-mach_port_t MachMessage::GetTranslatedPort(int n) const {
- if (n < GetDescriptorCount()) {
- return GetDescriptor(n)->GetMachPort();
- }
- return MACH_PORT_NULL;
-}
-
-#pragma mark -
-
-//==============================================================================
-// create a new mach port for receiving messages and register a name for it
-ReceivePort::ReceivePort(const char *receive_port_name) {
- mach_port_t current_task = mach_task_self();
-
- init_result_ = mach_port_allocate(current_task,
- MACH_PORT_RIGHT_RECEIVE,
- &port_);
-
- if (init_result_ != KERN_SUCCESS)
- return;
-
- init_result_ = mach_port_insert_right(current_task,
- port_,
- port_,
- MACH_MSG_TYPE_MAKE_SEND);
-
- if (init_result_ != KERN_SUCCESS)
- return;
-
- // Without |NSMachPortDeallocateNone|, the NSMachPort seems to deallocate
- // receive rights on port when it is eventually released. It is not necessary
- // to deallocate any rights here as |port_| is fully deallocated in the
- // ReceivePort destructor.
- NSPort *ns_port = [NSMachPort portWithMachPort:port_
- options:NSMachPortDeallocateNone];
- NSString *port_name = [NSString stringWithUTF8String:receive_port_name];
- [[NSMachBootstrapServer sharedInstance] registerPort:ns_port name:port_name];
-}
-
-//==============================================================================
-// create a new mach port for receiving messages
-ReceivePort::ReceivePort() {
- mach_port_t current_task = mach_task_self();
-
- init_result_ = mach_port_allocate(current_task,
- MACH_PORT_RIGHT_RECEIVE,
- &port_);
-
- if (init_result_ != KERN_SUCCESS)
- return;
-
- init_result_ = mach_port_insert_right(current_task,
- port_,
- port_,
- MACH_MSG_TYPE_MAKE_SEND);
-}
-
-//==============================================================================
-// Given an already existing mach port, use it. We take ownership of the
-// port and deallocate it in our destructor.
-ReceivePort::ReceivePort(mach_port_t receive_port)
- : port_(receive_port),
- init_result_(KERN_SUCCESS) {
-}
-
-//==============================================================================
-ReceivePort::~ReceivePort() {
- if (init_result_ == KERN_SUCCESS)
- mach_port_deallocate(mach_task_self(), port_);
-}
-
-//==============================================================================
-kern_return_t ReceivePort::WaitForMessage(MachReceiveMessage *out_message,
- mach_msg_timeout_t timeout) {
- if (!out_message) {
- return KERN_INVALID_ARGUMENT;
- }
-
- // return any error condition encountered in constructor
- if (init_result_ != KERN_SUCCESS)
- return init_result_;
-
- out_message->Head()->msgh_bits = 0;
- out_message->Head()->msgh_local_port = port_;
- out_message->Head()->msgh_remote_port = MACH_PORT_NULL;
- out_message->Head()->msgh_reserved = 0;
- out_message->Head()->msgh_id = 0;
-
- mach_msg_option_t rcv_options = MACH_RCV_MSG;
- if (timeout != MACH_MSG_TIMEOUT_NONE)
- rcv_options |= MACH_RCV_TIMEOUT;
-
- kern_return_t result = mach_msg(out_message->Head(),
- rcv_options,
- 0,
- out_message->MaxSize(),
- port_,
- timeout, // timeout in ms
- MACH_PORT_NULL);
-
- return result;
-}
-
-#pragma mark -
-
-//==============================================================================
-// get a port with send rights corresponding to a named registered service
-MachPortSender::MachPortSender(const char *receive_port_name) {
- mach_port_t bootstrap_port = 0;
- init_result_ = task_get_bootstrap_port(mach_task_self(), &bootstrap_port);
-
- if (init_result_ != KERN_SUCCESS)
- return;
-
- init_result_ = bootstrap_look_up(bootstrap_port,
- const_cast<char*>(receive_port_name),
- &send_port_);
-}
-
-//==============================================================================
-MachPortSender::MachPortSender(mach_port_t send_port)
- : send_port_(send_port),
- init_result_(KERN_SUCCESS) {
-}
-
-//==============================================================================
-kern_return_t MachPortSender::SendMessage(const MachSendMessage& message,
- mach_msg_timeout_t timeout) {
- if (message.Head()->msgh_size == 0) {
- NOTREACHED();
- return KERN_INVALID_VALUE; // just for safety -- never should occur
- };
-
- if (init_result_ != KERN_SUCCESS)
- return init_result_;
-
- message.Head()->msgh_remote_port = send_port_;
-
- kern_return_t result = mach_msg(message.Head(),
- MACH_SEND_MSG | MACH_SEND_TIMEOUT,
- message.Head()->msgh_size,
- 0,
- MACH_PORT_NULL,
- timeout, // timeout in ms
- MACH_PORT_NULL);
-
- return result;
-}
-
-//==============================================================================
-
-namespace mac {
-
-kern_return_t GetNumberOfMachPorts(mach_port_t task_port, int* num_ports) {
- mach_port_name_array_t names;
- mach_msg_type_number_t names_count;
- mach_port_type_array_t types;
- mach_msg_type_number_t types_count;
-
- // A friendlier interface would allow NULL buffers to only get the counts.
- kern_return_t kr = mach_port_names(task_port, &names, &names_count,
- &types, &types_count);
- if (kr != KERN_SUCCESS)
- return kr;
-
- // The documentation states this is an invariant.
- DCHECK_EQ(names_count, types_count);
- *num_ports = names_count;
-
- kr = vm_deallocate(mach_task_self(),
- reinterpret_cast<vm_address_t>(names),
- names_count * sizeof(mach_port_name_array_t));
- kr = vm_deallocate(mach_task_self(),
- reinterpret_cast<vm_address_t>(types),
- types_count * sizeof(mach_port_type_array_t));
-
- return kr;
-}
-
-} // namespace mac
-
-} // namespace base
diff --git a/chrome/browser/automation/testing_automation_provider.cc b/chrome/browser/automation/testing_automation_provider.cc
index 6442107..e5bbdb1 100644
--- a/chrome/browser/automation/testing_automation_provider.cc
+++ b/chrome/browser/automation/testing_automation_provider.cc
@@ -159,7 +159,8 @@
#endif
#if defined(OS_MACOSX)
-#include "base/mach_ipc_mac.h"
+#include <mach/mach.h>
+#include <mach/mach_vm.h>
#endif
#if !defined(NO_TCMALLOC) && (defined(OS_LINUX) || defined(OS_CHROMEOS))
@@ -490,7 +491,29 @@ void TestingAutomationProvider::AppendTab(int handle,
void TestingAutomationProvider::GetMachPortCount(int* port_count) {
#if defined(OS_MACOSX)
- base::mac::GetNumberOfMachPorts(mach_task_self(), port_count);
+ mach_port_name_array_t names;
+ mach_msg_type_number_t names_count;
+ mach_port_type_array_t types;
+ mach_msg_type_number_t types_count;
+
+ mach_port_t port = mach_task_self();
+
+ // A friendlier interface would allow NULL buffers to only get the counts.
+ kern_return_t kr = mach_port_names(port, &names, &names_count,
+ &types, &types_count);
+ if (kr != KERN_SUCCESS) {
+ *port_count = 0;
+ return;
+ }
+
+ // The documentation states this is an invariant.
+ DCHECK_EQ(names_count, types_count);
+ *port_count = names_count;
+
+ mach_vm_deallocate(port, reinterpret_cast<mach_vm_address_t>(names),
+ names_count * sizeof(mach_port_name_array_t));
+ mach_vm_deallocate(port, reinterpret_cast<mach_vm_address_t>(types),
+ types_count * sizeof(mach_port_type_array_t));
#else
*port_count = 0;
#endif
diff --git a/content/app/content_main_runner.cc b/content/app/content_main_runner.cc
index 257f701..46599ac 100644
--- a/content/app/content_main_runner.cc
+++ b/content/app/content_main_runner.cc
@@ -66,7 +66,6 @@
#elif defined(OS_MACOSX)
#include "base/mac/scoped_nsautorelease_pool.h"
#if !defined(OS_IOS)
-#include "base/mach_ipc_mac.h"
#include "base/power_monitor/power_monitor.h"
#include "content/browser/mach_broker_mac.h"
#include "content/common/sandbox_init_mac.h"
diff --git a/content/browser/mach_broker_mac.mm b/content/browser/mach_broker_mac.mm
index d765cf5..783b708 100644
--- a/content/browser/mach_broker_mac.mm
+++ b/content/browser/mach_broker_mac.mm
@@ -5,6 +5,7 @@
#include "content/browser/mach_broker_mac.h"
#include <bsm/libbsm.h>
+#include <servers/bootstrap.h>
#include "base/bind.h"
#include "base/bind_helpers.h"
@@ -12,7 +13,6 @@
#include "base/logging.h"
#include "base/mac/foundation_util.h"
#include "base/mac/scoped_mach_port.h"
-#include "base/mach_ipc_mac.h"
#include "base/string_util.h"
#include "base/stringprintf.h"
#include "base/strings/sys_string_conversions.h"