| Index: base/memory/shared_memory_mac.cc
|
| diff --git a/base/memory/shared_memory_mac.cc b/base/memory/shared_memory_mac.cc
|
| index 799b8e3dfcda0acb8006e119d980bc411a17d6af..8f198dcbf75aaeab13c7ffcad774b0ec7e3ffbb7 100644
|
| --- a/base/memory/shared_memory_mac.cc
|
| +++ b/base/memory/shared_memory_mac.cc
|
| @@ -13,7 +13,10 @@
|
| #include "base/files/file_util.h"
|
| #include "base/files/scoped_file.h"
|
| #include "base/logging.h"
|
| +#include "base/mac/mac_util.h"
|
| #include "base/mac/scoped_mach_vm.h"
|
| +#include "base/metrics/field_trial.h"
|
| +#include "base/metrics/histogram_macros.h"
|
| #include "base/posix/eintr_wrapper.h"
|
| #include "base/posix/safe_strerror.h"
|
| #include "base/process/process_metrics.h"
|
| @@ -29,6 +32,38 @@ namespace base {
|
|
|
| namespace {
|
|
|
| +const char kTrialName[] = "MacMemoryMechanism";
|
| +const char kTrialMach[] = "Mach";
|
| +const char kTrialPosix[] = "Posix";
|
| +
|
| +SharedMemoryHandle::Type GetABTestMechanism() {
|
| + static bool found_group = false;
|
| + static SharedMemoryHandle::Type group = SharedMemoryHandle::MACH;
|
| +
|
| + if (found_group)
|
| + return group;
|
| +
|
| + const std::string group_name =
|
| + base::FieldTrialList::FindFullName(kTrialName);
|
| + if (group_name == kTrialMach) {
|
| + group = SharedMemoryHandle::MACH;
|
| + found_group = true;
|
| + } else if (group_name == kTrialPosix) {
|
| + group = SharedMemoryHandle::POSIX;
|
| + found_group = true;
|
| + } else {
|
| + group = SharedMemoryHandle::MACH;
|
| + }
|
| +
|
| + return group;
|
| +}
|
| +
|
| +// Emits a histogram entry indicating which type of SharedMemory was created.
|
| +void EmitMechanism(SharedMemoryHandle::Type type) {
|
| + UMA_HISTOGRAM_ENUMERATION("OSX.SharedMemory.Mechanism", type,
|
| + SharedMemoryHandle::TypeMax);
|
| +}
|
| +
|
| // Returns whether the operation succeeded.
|
| // |new_handle| is an output variable, populated on success. The caller takes
|
| // ownership of the underlying memory object.
|
| @@ -227,6 +262,22 @@ bool SharedMemory::CreateAnonymousPosix(size_t size) {
|
| return Create(options);
|
| }
|
|
|
| +bool SharedMemory::CreateAndMapAnonymousMach(size_t size) {
|
| + SharedMemoryCreateOptions options;
|
| +
|
| + if (mac::IsOSLionOrLater()) {
|
| + // A/B test the mechanism. Once the experiment is over, this will always be
|
| + // set to SharedMemoryHandle::MACH.
|
| + // http://crbug.com/547261
|
| + options.type = GetABTestMechanism();
|
| + } else {
|
| + // Mach shared memory isn't supported on OSX 10.6 or older.
|
| + options.type = SharedMemoryHandle::POSIX;
|
| + }
|
| + options.size = size;
|
| + return Create(options) && Map(size);
|
| +}
|
| +
|
| // static
|
| bool SharedMemory::GetSizeFromSharedMemoryHandle(
|
| const SharedMemoryHandle& handle,
|
| @@ -248,6 +299,8 @@ bool SharedMemory::Create(const SharedMemoryCreateOptions& options) {
|
| if (options.size > static_cast<size_t>(std::numeric_limits<int>::max()))
|
| return false;
|
|
|
| + EmitMechanism(options.type);
|
| +
|
| if (options.type == SharedMemoryHandle::MACH) {
|
| shm_ = SharedMemoryHandle(options.size);
|
| requested_size_ = options.size;
|
|
|