| Index: base/metrics/field_trial.cc
|
| diff --git a/base/metrics/field_trial.cc b/base/metrics/field_trial.cc
|
| index 106ca96cad2819860c15b712c27481a4d0b8d66b..a4f40cd45e66cf07c14a6af1887dce64390e65f1 100644
|
| --- a/base/metrics/field_trial.cc
|
| +++ b/base/metrics/field_trial.cc
|
| @@ -55,7 +55,6 @@ const bool kUseSharedMemoryForFieldTrials = true;
|
|
|
| // Constants for the field trial allocator.
|
| const char kAllocatorName[] = "FieldTrialAllocator";
|
| -const uint32_t kFieldTrialType = 0xABA17E13 + 2; // SHA1(FieldTrialEntry) v2
|
|
|
| // We allocate 128 KiB to hold all the field trial data. This should be enough,
|
| // as most people use 3 - 25 KiB for field trials (as of 11/25/2016).
|
| @@ -717,13 +716,9 @@ void FieldTrialList::GetInitiallyActiveFieldTrials(
|
|
|
| FieldTrialAllocator* allocator = global_->field_trial_allocator_.get();
|
| FieldTrialAllocator::Iterator mem_iter(allocator);
|
| - FieldTrial::FieldTrialRef ref;
|
| - while ((ref = mem_iter.GetNextOfType(kFieldTrialType)) !=
|
| - SharedPersistentMemoryAllocator::kReferenceNull) {
|
| - const FieldTrial::FieldTrialEntry* entry =
|
| - allocator->GetAsObject<const FieldTrial::FieldTrialEntry>(
|
| - ref, kFieldTrialType);
|
| -
|
| + const FieldTrial::FieldTrialEntry* entry;
|
| + while ((entry = mem_iter.GetNextOfObject<FieldTrial::FieldTrialEntry>()) !=
|
| + nullptr) {
|
| StringPiece trial_name;
|
| StringPiece group_name;
|
| if (subtle::NoBarrier_Load(&entry->activated) &&
|
| @@ -1042,9 +1037,8 @@ bool FieldTrialList::GetParamsFromSharedMemory(
|
| return false;
|
|
|
| const FieldTrial::FieldTrialEntry* entry =
|
| - global_->field_trial_allocator_
|
| - ->GetAsObject<const FieldTrial::FieldTrialEntry>(field_trial->ref_,
|
| - kFieldTrialType);
|
| + global_->field_trial_allocator_->GetAsObject<FieldTrial::FieldTrialEntry>(
|
| + field_trial->ref_);
|
|
|
| size_t allocated_size =
|
| global_->field_trial_allocator_->GetAllocSize(field_trial->ref_);
|
| @@ -1075,12 +1069,11 @@ void FieldTrialList::ClearParamsFromSharedMemoryForTesting() {
|
| std::vector<FieldTrial::FieldTrialRef> new_refs;
|
|
|
| FieldTrial::FieldTrialRef prev_ref;
|
| - while ((prev_ref = mem_iter.GetNextOfType(kFieldTrialType)) !=
|
| + while ((prev_ref = mem_iter.GetNextOfType<FieldTrial::FieldTrialEntry>()) !=
|
| FieldTrialAllocator::kReferenceNull) {
|
| // Get the existing field trial entry in shared memory.
|
| const FieldTrial::FieldTrialEntry* prev_entry =
|
| - allocator->GetAsObject<const FieldTrial::FieldTrialEntry>(
|
| - prev_ref, kFieldTrialType);
|
| + allocator->GetAsObject<FieldTrial::FieldTrialEntry>(prev_ref);
|
| StringPiece trial_name;
|
| StringPiece group_name;
|
| if (!prev_entry->GetTrialAndGroupName(&trial_name, &group_name))
|
| @@ -1091,11 +1084,8 @@ void FieldTrialList::ClearParamsFromSharedMemoryForTesting() {
|
| pickle.WriteString(trial_name);
|
| pickle.WriteString(group_name);
|
| size_t total_size = sizeof(FieldTrial::FieldTrialEntry) + pickle.size();
|
| - FieldTrial::FieldTrialRef new_ref =
|
| - allocator->Allocate(total_size, kFieldTrialType);
|
| FieldTrial::FieldTrialEntry* new_entry =
|
| - allocator->GetAsObject<FieldTrial::FieldTrialEntry>(new_ref,
|
| - kFieldTrialType);
|
| + allocator->AllocateObject<FieldTrial::FieldTrialEntry>(total_size);
|
| subtle::NoBarrier_Store(&new_entry->activated,
|
| subtle::NoBarrier_Load(&prev_entry->activated));
|
| new_entry->pickle_size = pickle.size();
|
| @@ -1108,12 +1098,14 @@ void FieldTrialList::ClearParamsFromSharedMemoryForTesting() {
|
|
|
| // Update the ref on the field trial and add it to the list to be made
|
| // iterable.
|
| + FieldTrial::FieldTrialRef new_ref = allocator->GetAsReference(new_entry);
|
| FieldTrial* trial = global_->PreLockedFind(trial_name.as_string());
|
| trial->ref_ = new_ref;
|
| new_refs.push_back(new_ref);
|
|
|
| // Mark the existing entry as unused.
|
| - allocator->ChangeType(prev_ref, 0, kFieldTrialType);
|
| + allocator->ChangeType(prev_ref, 0,
|
| + FieldTrial::FieldTrialEntry::kPersistentTypeId);
|
| }
|
|
|
| for (const auto& ref : new_refs) {
|
| @@ -1137,13 +1129,10 @@ std::vector<const FieldTrial::FieldTrialEntry*>
|
| FieldTrialList::GetAllFieldTrialsFromPersistentAllocator(
|
| PersistentMemoryAllocator const& allocator) {
|
| std::vector<const FieldTrial::FieldTrialEntry*> entries;
|
| - FieldTrial::FieldTrialRef ref;
|
| FieldTrialAllocator::Iterator iter(&allocator);
|
| - while ((ref = iter.GetNextOfType(kFieldTrialType)) !=
|
| - FieldTrialAllocator::kReferenceNull) {
|
| - const FieldTrial::FieldTrialEntry* entry =
|
| - allocator.GetAsObject<const FieldTrial::FieldTrialEntry>(
|
| - ref, kFieldTrialType);
|
| + const FieldTrial::FieldTrialEntry* entry;
|
| + while ((entry = iter.GetNextOfObject<FieldTrial::FieldTrialEntry>()) !=
|
| + nullptr) {
|
| entries.push_back(entry);
|
| }
|
| return entries;
|
| @@ -1182,13 +1171,9 @@ bool FieldTrialList::CreateTrialsFromSharedMemory(
|
| FieldTrialAllocator* shalloc = global_->field_trial_allocator_.get();
|
| FieldTrialAllocator::Iterator mem_iter(shalloc);
|
|
|
| - FieldTrial::FieldTrialRef ref;
|
| - while ((ref = mem_iter.GetNextOfType(kFieldTrialType)) !=
|
| - FieldTrialAllocator::kReferenceNull) {
|
| - const FieldTrial::FieldTrialEntry* entry =
|
| - shalloc->GetAsObject<const FieldTrial::FieldTrialEntry>(
|
| - ref, kFieldTrialType);
|
| -
|
| + const FieldTrial::FieldTrialEntry* entry;
|
| + while ((entry = mem_iter.GetNextOfObject<FieldTrial::FieldTrialEntry>()) !=
|
| + nullptr) {
|
| StringPiece trial_name;
|
| StringPiece group_name;
|
| if (!entry->GetTrialAndGroupName(&trial_name, &group_name))
|
| @@ -1199,7 +1184,7 @@ bool FieldTrialList::CreateTrialsFromSharedMemory(
|
| FieldTrial* trial =
|
| CreateFieldTrial(trial_name.as_string(), group_name.as_string());
|
|
|
| - trial->ref_ = ref;
|
| + trial->ref_ = mem_iter.GetAsReference(entry);
|
| if (subtle::NoBarrier_Load(&entry->activated)) {
|
| // Call |group()| to mark the trial as "used" and notify observers, if
|
| // any. This is useful to ensure that field trials created in child
|
| @@ -1286,15 +1271,15 @@ void FieldTrialList::AddToAllocatorWhileLocked(
|
| }
|
|
|
| size_t total_size = sizeof(FieldTrial::FieldTrialEntry) + pickle.size();
|
| - FieldTrial::FieldTrialRef ref =
|
| - allocator->Allocate(total_size, kFieldTrialType);
|
| + FieldTrial::FieldTrialRef ref = allocator->Allocate(
|
| + total_size, FieldTrial::FieldTrialEntry::kPersistentTypeId);
|
| if (ref == FieldTrialAllocator::kReferenceNull) {
|
| NOTREACHED();
|
| return;
|
| }
|
|
|
| FieldTrial::FieldTrialEntry* entry =
|
| - allocator->GetAsObject<FieldTrial::FieldTrialEntry>(ref, kFieldTrialType);
|
| + allocator->GetAsObject<FieldTrial::FieldTrialEntry>(ref);
|
| subtle::NoBarrier_Store(&entry->activated, trial_state.activated);
|
| entry->pickle_size = pickle.size();
|
|
|
| @@ -1328,8 +1313,7 @@ void FieldTrialList::ActivateFieldTrialEntryWhileLocked(
|
| // the only thing that happens on a stale read here is a slight performance
|
| // hit from the child re-synchronizing activation state.
|
| FieldTrial::FieldTrialEntry* entry =
|
| - allocator->GetAsObject<FieldTrial::FieldTrialEntry>(ref,
|
| - kFieldTrialType);
|
| + allocator->GetAsObject<FieldTrial::FieldTrialEntry>(ref);
|
| subtle::NoBarrier_Store(&entry->activated, 1);
|
| }
|
| }
|
|
|