summaryrefslogtreecommitdiffstats
path: root/base
diff options
context:
space:
mode:
authorerikchen <erikchen@chromium.org>2015-11-02 11:46:06 -0800
committerCommit bot <commit-bot@chromium.org>2015-11-02 19:47:04 +0000
commita3aaaaf1c84c68c3c6804b369611224a1a04db64 (patch)
tree6ce818caf94987eee812bb60a52d4ffd8b6008ee /base
parent1d65464dd63c1456d5850859feacfc38c05fba2d (diff)
downloadchromium_src-a3aaaaf1c84c68c3c6804b369611224a1a04db64.zip
chromium_src-a3aaaaf1c84c68c3c6804b369611224a1a04db64.tar.gz
chromium_src-a3aaaaf1c84c68c3c6804b369611224a1a04db64.tar.bz2
reland 3: "mac: Run A/B experiment on SharedMemory mechanism for resource buffers."
The second reland still induced flaky crashes in GPU conformance tests related to over-releasing a scoped_refptr<MessageAttachment>. This CL should have fixed the problem: https://codereview.chromium.org/1408793008/. I can reproduce the failure non-deterministically locally. I get a crash every 2-3 runs of the ogles conformance tests. With the CL I mentioned above, I've had 20 runs with no crashes. > The CL changes the default behavior of resource buffer to use a Mach-backed > SharedMemory region. This CL adds a field trial to measure the effect of Mach vs > POSIX backed SharedMemory regions. > > BUG=547261, 466437 > Committed: https://crrev.com/e0e2fd398f3d07c8eebbe662d71a0f9286862476 > Cr-Commit-Position: refs/heads/master@{#356513} BUG=547261, 466437 TBR=mark@chromium.org, isherman@chromium.org, asvitkine@chromium.org, avi@chromium.org Review URL: https://codereview.chromium.org/1420203008 Cr-Commit-Position: refs/heads/master@{#357407}
Diffstat (limited to 'base')
-rw-r--r--base/memory/shared_memory.h4
-rw-r--r--base/memory/shared_memory_handle.h3
-rw-r--r--base/memory/shared_memory_mac.cc53
3 files changed, 60 insertions, 0 deletions
diff --git a/base/memory/shared_memory.h b/base/memory/shared_memory.h
index 18416c0..5cdcb0d 100644
--- a/base/memory/shared_memory.h
+++ b/base/memory/shared_memory.h
@@ -140,6 +140,10 @@ class BASE_EXPORT SharedMemory {
// http://crbug.com/466437.
bool CreateAndMapAnonymousPosix(size_t size);
bool CreateAnonymousPosix(size_t size);
+
+ // This method is an analog of CreateAndMapAnonymous that forces the
+ // underlying OS primitive to be a Mach memory object.
+ bool CreateAndMapAnonymousMach(size_t size);
#endif // defined(OS_MACOSX) && !defined(OS_IOS)
// Creates an anonymous shared memory segment of size size.
diff --git a/base/memory/shared_memory_handle.h b/base/memory/shared_memory_handle.h
index b3dfc8f..49398a4 100644
--- a/base/memory/shared_memory_handle.h
+++ b/base/memory/shared_memory_handle.h
@@ -75,12 +75,15 @@ class BASE_EXPORT SharedMemoryHandle {
#else
class BASE_EXPORT SharedMemoryHandle {
public:
+ // The values of these enums must not change, as they are used by the
+ // histogram OSX.SharedMemory.Mechanism.
enum Type {
// The SharedMemoryHandle is backed by a POSIX fd.
POSIX,
// The SharedMemoryHandle is backed by the Mach primitive "memory object".
MACH,
};
+ static const int TypeMax = 2;
// The format that should be used to transmit |Type| over the wire.
typedef int TypeWireFormat;
diff --git a/base/memory/shared_memory_mac.cc b/base/memory/shared_memory_mac.cc
index 799b8e3..8f198dc 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;