1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/child/child_histogram_message_filter.h"
6
7#include <ctype.h>
8
9#include "base/bind.h"
10#include "base/message_loop/message_loop.h"
11#include "base/metrics/histogram_delta_serialization.h"
12#include "content/child/child_process.h"
13#include "content/child/child_thread.h"
14#include "content/common/child_process_messages.h"
15#include "ipc/ipc_sender.h"
16
17namespace content {
18
19ChildHistogramMessageFilter::ChildHistogramMessageFilter()
20    : sender_(NULL),
21      io_message_loop_(ChildProcess::current()->io_message_loop_proxy()) {
22}
23
24ChildHistogramMessageFilter::~ChildHistogramMessageFilter() {
25}
26
27void ChildHistogramMessageFilter::OnFilterAdded(IPC::Sender* sender) {
28  sender_ = sender;
29}
30
31void ChildHistogramMessageFilter::OnFilterRemoved() {
32}
33
34bool ChildHistogramMessageFilter::OnMessageReceived(
35    const IPC::Message& message) {
36  bool handled = true;
37  IPC_BEGIN_MESSAGE_MAP(ChildHistogramMessageFilter, message)
38    IPC_MESSAGE_HANDLER(ChildProcessMsg_GetChildHistogramData,
39                        OnGetChildHistogramData)
40    IPC_MESSAGE_UNHANDLED(handled = false)
41  IPC_END_MESSAGE_MAP()
42  return handled;
43}
44
45void ChildHistogramMessageFilter::SendHistograms(int sequence_number) {
46  io_message_loop_->PostTask(
47      FROM_HERE, base::Bind(&ChildHistogramMessageFilter::UploadAllHistograms,
48                            this, sequence_number));
49}
50
51void ChildHistogramMessageFilter::OnGetChildHistogramData(int sequence_number) {
52  UploadAllHistograms(sequence_number);
53}
54
55void ChildHistogramMessageFilter::UploadAllHistograms(int sequence_number) {
56  if (!histogram_delta_serialization_) {
57    histogram_delta_serialization_.reset(
58        new base::HistogramDeltaSerialization("ChildProcess"));
59  }
60
61  std::vector<std::string> deltas;
62  histogram_delta_serialization_->PrepareAndSerializeDeltas(&deltas);
63  sender_->Send(
64      new ChildProcessHostMsg_ChildHistogramData(sequence_number, deltas));
65
66#ifndef NDEBUG
67  static int count = 0;
68  count++;
69  LOCAL_HISTOGRAM_COUNTS("Histogram.ChildProcessHistogramSentCount", count);
70#endif
71}
72
73}  // namespace content
74