Index: base/mach_ipc_mac.mm |
diff --git a/base/mach_ipc_mac.mm b/base/mach_ipc_mac.mm |
index b6dedd2b89190b7cea5dba167105c77db155e818..e89cf286c23a4d6e723bac0e167bfaea5de1eae8 100644 |
--- a/base/mach_ipc_mac.mm |
+++ b/base/mach_ipc_mac.mm |
@@ -5,6 +5,7 @@ |
#include "base/mach_ipc_mac.h" |
#import <Foundation/Foundation.h> |
+#include <mach/vm_map.h> |
#include <stdio.h> |
#include "base/logging.h" |
@@ -322,4 +323,36 @@ kern_return_t MachPortSender::SendMessage(MachSendMessage &message, |
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(task_port, |
Mark Mentovai
2012/01/23 21:12:30
346 and 349 should use mach_task_self.
Robert Sesek
2012/01/23 21:58:41
Done.
|
+ reinterpret_cast<vm_address_t>(names), |
+ names_count * sizeof(mach_port_name_array_t)); |
+ kr = vm_deallocate(task_port, |
+ reinterpret_cast<vm_address_t>(types), |
+ types_count * sizeof(mach_port_type_array_t)); |
+ |
+ return kr; |
+} |
+ |
+} // namespace mac |
+ |
} // namespace base |