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