From 6a8a6723d3d586fe611187928b495f4b596e64c2 Mon Sep 17 00:00:00 2001 From: "andresp@webrtc.org" Date: Fri, 9 May 2014 07:14:34 +0000 Subject: [PATCH] FieldTrial implementation for webrtc. BUG=crbug/367114 R=asvitkine@chromium.org, mflodman@webrtc.org, tommi@webrtc.org Review URL: https://webrtc-codereview.appspot.com/14399004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@6089 4adac7df-926f-26a2-2b94-8c16560cd09d --- .../system_wrappers/interface/field_trial.h | 67 +++++++++++++++++++ webrtc/system_wrappers/source/field_trial.cc | 30 +++++++++ .../source/system_wrappers.gyp | 2 + 3 files changed, 99 insertions(+) create mode 100644 webrtc/system_wrappers/interface/field_trial.h create mode 100644 webrtc/system_wrappers/source/field_trial.cc diff --git a/webrtc/system_wrappers/interface/field_trial.h b/webrtc/system_wrappers/interface/field_trial.h new file mode 100644 index 000000000..7397cafcd --- /dev/null +++ b/webrtc/system_wrappers/interface/field_trial.h @@ -0,0 +1,67 @@ +// +// Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. +// + +#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_FIELD_TRIAL_H_ +#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_FIELD_TRIAL_H_ + +#include + +#include "webrtc/common_types.h" + +// Field trials allow a client of webrtc (such as Chrome) to turn on feature +// code in binraries out in the field and gather information with that. +// WebRTC field trials are designed to be wired up directly to chrome field +// trials and speed up the time developers need to get features out there by +// spending less time wiring up APIs to control whether the feature is on/off. +// Note, that not every feature is candidate to be controlled by them as it may +// require proper negotiation between involved parties (e.g. SDP negotiation). +// +// E.g.: To experiment with a new method that could lead to a different +// trade-off between CPU/bandwidth: +// +// 1 - Develop the feature with default behaviour off: +// +// if (FieldTrial::FindFullName("WebRTCExperimenMethod2") == "Enabled") +// method2(); +// else +// method1(); +// +// 2 - Once the changes are rolled to chrome, the new code path can be executed +// by running chrome with --force-fieldtrials=WebRTCExperimentMethod2/Enabled/ +// or controled by finch studies. +// +// 3 - Evaluate the new feature and clean the code paths. +// +// TODO(andresp): find out how to get bots and unit tests to run with field +// trials enabled. + +namespace webrtc { +namespace field_trial { + +typedef std::string (*FindFullNameMethod)(const std::string&); + +// Returns the group name chosen for the named trial, or the empty string +// if the trial does not exists. +// +// Note: To keep things tidy append all the trial names with WebRTC. +std::string FindFullName(const std::string& name); + +// WebRTC clients MUST call this method to setup field trials. +// Failing to do so will crash the first time code tries to access a field +// trial. +// +// This method must be called before any WebRTC methods. Functions +// provided should be thread-safe. +WEBRTC_DLLEXPORT void Init(FindFullNameMethod find); + +} // namespace field_trial +} // namespace webrtc + +#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_FIELD_TRIAL_H_ diff --git a/webrtc/system_wrappers/source/field_trial.cc b/webrtc/system_wrappers/source/field_trial.cc new file mode 100644 index 000000000..53822644e --- /dev/null +++ b/webrtc/system_wrappers/source/field_trial.cc @@ -0,0 +1,30 @@ +// Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. +// + +#include "webrtc/system_wrappers/interface/field_trial.h" + +#include + +namespace webrtc { +namespace field_trial { +namespace { +FindFullNameMethod find_full_name_method_ = NULL; +} // namespace + +void Init(FindFullNameMethod method) { + assert(find_full_name_method_ == NULL); + find_full_name_method_ = method; +} + +std::string FindFullName(const std::string& name) { + assert(find_full_name_method_ != NULL); + return find_full_name_method_(name); +} +} // namespace field_trial +} // namespace webrtc diff --git a/webrtc/system_wrappers/source/system_wrappers.gyp b/webrtc/system_wrappers/source/system_wrappers.gyp index 36d4d9cd5..dd25de674 100644 --- a/webrtc/system_wrappers/source/system_wrappers.gyp +++ b/webrtc/system_wrappers/source/system_wrappers.gyp @@ -35,6 +35,7 @@ '../interface/data_log_impl.h', '../interface/event_tracer.h', '../interface/event_wrapper.h', + '../interface/field_trial.h', '../interface/file_wrapper.h', '../interface/fix_interlocked_exchange_pointer_win.h', '../interface/logcat_trace_context.h', @@ -85,6 +86,7 @@ 'event_tracer.cc', 'event_win.cc', 'event_win.h', + 'field_trial.cc', 'file_impl.cc', 'file_impl.h', 'logcat_trace_context.cc',