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 "content/browser/profiler_message_filter.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/tracked_objects.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/profiler_controller_impl.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/tcmalloc_internals_request_job.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/child_process_messages.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ProfilerMessageFilter::ProfilerMessageFilter(int process_type)
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : BrowserMessageFilter(ChildProcessMsgStart),
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      process_type_(process_type) {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfilerMessageFilter::OnChannelConnected(int32 peer_pid) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tracked_objects::ThreadData::Status status =
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tracked_objects::ThreadData::status();
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ChildProcessMsg_SetProfilerStatus(status));
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool ProfilerMessageFilter::OnMessageReceived(const IPC::Message& message) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(ProfilerMessageFilter, message)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChildProcessHostMsg_ChildProfilerData,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnChildProfilerData)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_TCMALLOC)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChildProcessHostMsg_TcmallocStats, OnTcmallocStats)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProfilerMessageFilter::~ProfilerMessageFilter() {}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfilerMessageFilter::OnChildProfilerData(
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int sequence_number,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const tracked_objects::ProcessDataSnapshot& profiler_data) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfilerControllerImpl::GetInstance()->OnProfilerDataCollected(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sequence_number, profiler_data, process_type_);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_TCMALLOC)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProfilerMessageFilter::OnTcmallocStats(const std::string& output) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AboutTcmallocOutputs::GetInstance()->OnStatsForChildProcess(
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        peer_pid(), process_type_, output);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55