1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// found in the LICENSE file.
4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "webkit/child/webkit_child_helpers.h"
6ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_LINUX)
8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include <malloc.h>
9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif
10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/logging.h"
12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/memory/scoped_ptr.h"
1358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "base/process/process_metrics.h"
14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "v8/include/v8.h"
15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace webkit_glue {
17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
18ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_LINUX) || defined(OS_ANDROID)
19ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochsize_t MemoryUsageKB() {
20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  struct mallinfo minfo = mallinfo();
21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  uint64_t mem_usage =
22ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(USE_TCMALLOC)
23ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      minfo.uordblks
24ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#else
25ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      (minfo.hblkhd + minfo.arena)
26ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif
27ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      >> 10;
28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  v8::HeapStatistics stat;
30ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // TODO(svenpanne) The call below doesn't take web workers into account, this
31ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // has to be done manually by iterating over all Isolates involved.
32ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  v8::Isolate::GetCurrent()->GetHeapStatistics(&stat);
33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return mem_usage + (static_cast<uint64_t>(stat.total_heap_size()) >> 10);
34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
35ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#elif defined(OS_MACOSX)
36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochsize_t MemoryUsageKB() {
37ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_ptr<base::ProcessMetrics> process_metrics(
38ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      // The default port provider is sufficient to get data for the current
39ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      // process.
40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      base::ProcessMetrics::CreateProcessMetrics(
41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          base::GetCurrentProcessHandle(), NULL));
42ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return process_metrics->GetWorkingSetSize() >> 10;
43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#else
45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochsize_t MemoryUsageKB() {
46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_ptr<base::ProcessMetrics> process_metrics(
47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      base::ProcessMetrics::CreateProcessMetrics(
48ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          base::GetCurrentProcessHandle()));
49ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return process_metrics->GetPagefileUsage() >> 10;
50ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
51ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif
52ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
53ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}  // webkit_glue
54