| Index: base/metrics/field_trial.cc
|
| diff --git a/base/metrics/field_trial.cc b/base/metrics/field_trial.cc
|
| index dec24c9663b19d5577b6739abb67571acf54607f..47baafbe4d814f2f578697dfddd59f6c9c78a4b9 100644
|
| --- a/base/metrics/field_trial.cc
|
| +++ b/base/metrics/field_trial.cc
|
| @@ -12,7 +12,6 @@
|
| #include "base/command_line.h"
|
| #include "base/feature_list.h"
|
| #include "base/logging.h"
|
| -#include "base/metrics/histogram_macros.h"
|
| #include "base/pickle.h"
|
| #include "base/process/memory.h"
|
| #include "base/rand_util.h"
|
| @@ -42,16 +41,28 @@ const bool kUseSharedMemoryForFieldTrials = false;
|
|
|
| // Constants for the field trial allocator.
|
| const char kAllocatorName[] = "FieldTrialAllocator";
|
| -const uint32_t kFieldTrialType = 0xABA17E13 + 1; // SHA1(FieldTrialEntry) v1
|
| +const uint32_t kFieldTrialType = 0xABA17E13 + 2; // SHA1(FieldTrialEntry) v2
|
| +
|
| +// We allocate 64 KiB to hold all the field trial data. This should be enough,
|
| +// as currently we use ~8KiB for the field trials, and ~10KiB for experiment
|
| +// parameters (as of 9/11/2016). This also doesn't allocate all 64 KiB at once
|
| +// -- the pages only get mapped to physical memory when they are touched. If the
|
| +// size of the allocated field trials does get larger than 64 KiB, then we will
|
| +// drop some field trials in child processes, leading to an inconsistent view
|
| +// between browser and child processes and possibly causing crashes (see
|
| +// crbug.com/661617).
|
| #if !defined(OS_NACL)
|
| -const size_t kFieldTrialAllocationSize = 4 << 10; // 4 KiB = one page
|
| +const size_t kFieldTrialAllocationSize = 64 << 10; // 64 KiB
|
| #endif
|
|
|
| // We create one FieldTrialEntry per field trial in shared memory, via
|
| // AddToAllocatorWhileLocked. The FieldTrialEntry is followed by a base::Pickle
|
| -// object that we unpickle and read from.
|
| +// object that we unpickle and read from. Any changes to this structure requires
|
| +// a bump in kFieldTrialType id defined above.
|
| struct FieldTrialEntry {
|
| - bool activated;
|
| + // Whether or not this field trial is activated. This is really just a boolean
|
| + // but marked as a uint32_t for portability reasons.
|
| + uint32_t activated;
|
|
|
| // Size of the pickled structure, NOT the total size of this entry.
|
| uint32_t size;
|
| @@ -728,8 +739,7 @@ void FieldTrialList::CopyFieldTrialStateToFlags(
|
| std::to_string(field_trial_length);
|
|
|
| cmd_line->AppendSwitchASCII(field_trial_handle_switch, field_trial_handle);
|
| - UMA_HISTOGRAM_COUNTS_10000("UMA.FieldTrialAllocator.Size",
|
| - field_trial_length);
|
| + global_->field_trial_allocator_->UpdateTrackingHistograms();
|
| return;
|
| }
|
| #endif
|
| @@ -904,7 +914,7 @@ void FieldTrialList::AddToAllocatorWhileLocked(FieldTrial* field_trial) {
|
| return;
|
|
|
| // Or if we've already added it.
|
| - if (field_trial->ref_ != SharedPersistentMemoryAllocator::kReferenceNull)
|
| + if (field_trial->ref_)
|
| return;
|
|
|
| FieldTrial::State trial_state;
|
|
|