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) 5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/child_histogram_message_filter.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ctype.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/metrics/histogram_delta_serialization.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/child_process.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/child_thread.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/child_process_messages.h" 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ipc/ipc_sender.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChildHistogramMessageFilter::ChildHistogramMessageFilter() 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : sender_(NULL), 211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) io_message_loop_(ChildProcess::current()->io_message_loop_proxy()) { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChildHistogramMessageFilter::~ChildHistogramMessageFilter() { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ChildHistogramMessageFilter::OnFilterAdded(IPC::Sender* sender) { 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) sender_ = sender; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChildHistogramMessageFilter::OnFilterRemoved() { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChildHistogramMessageFilter::OnMessageReceived( 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& message) { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(ChildHistogramMessageFilter, message) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChildProcessMsg_GetChildHistogramData, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnGetChildHistogramData) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChildHistogramMessageFilter::SendHistograms(int sequence_number) { 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch io_message_loop_->PostTask( 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, base::Bind(&ChildHistogramMessageFilter::UploadAllHistograms, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, sequence_number)); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChildHistogramMessageFilter::OnGetChildHistogramData(int sequence_number) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UploadAllHistograms(sequence_number); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChildHistogramMessageFilter::UploadAllHistograms(int sequence_number) { 561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!histogram_delta_serialization_) { 571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) histogram_delta_serialization_.reset( 581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) new base::HistogramDeltaSerialization("ChildProcess")); 591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::vector<std::string> deltas; 621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) histogram_delta_serialization_->PrepareAndSerializeDeltas(&deltas); 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) sender_->Send( 641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) new ChildProcessHostMsg_ChildHistogramData(sequence_number, deltas)); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef NDEBUG 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int count = 0; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count++; 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci LOCAL_HISTOGRAM_COUNTS("Histogram.ChildProcessHistogramSentCount", count); 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 74