15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/metrics/field_trial_synchronizer.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/variations/variations_util.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This singleton instance should be constructed during the single threaded 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// portion of main(). It initializes globals to provide support for all future 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// calls. This object is created on the UI thread, and it is destroyed after 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// all the other threads have gone away. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FieldTrialSynchronizer* g_field_trial_synchronizer = NULL; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FieldTrialSynchronizer::FieldTrialSynchronizer() { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(g_field_trial_synchronizer == NULL); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_field_trial_synchronizer = this; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::FieldTrialList::AddObserver(this); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome_variations::SetChildProcessLoggingVariationList(); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FieldTrialSynchronizer::NotifyAllRenderers( 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& field_trial_name, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& group_name) { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To iterate over RenderProcessHosts, or to send messages to the hosts, we 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // need to be on the UI thread. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (content::RenderProcessHost::iterator it( 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost::AllHostsIterator()); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !it.IsAtEnd(); it.Advance()) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it.GetCurrentValue()->Send( 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ChromeViewMsg_SetFieldTrialGroup(field_trial_name, group_name)); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FieldTrialSynchronizer::OnFieldTrialGroupFinalized( 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& field_trial_name, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& group_name) { 54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK(!field_trial_name.empty() && !group_name.empty()); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&FieldTrialSynchronizer::NotifyAllRenderers, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_trial_name, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_name)); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome_variations::SetChildProcessLoggingVariationList(); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FieldTrialSynchronizer::~FieldTrialSynchronizer() { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::FieldTrialList::RemoveObserver(this); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_field_trial_synchronizer = NULL; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 68