1# Copyright 2013 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
5import logging
6import os
7
8
9LOGGER = logging.getLogger('dmprof')
10
11
12class Dump(object):
13  """Represents a heap profile dump."""
14  def __init__(self):
15    pass
16
17  @property
18  def path(self):
19    raise NotImplementedError
20
21  @property
22  def count(self):
23    raise NotImplementedError
24
25  @property
26  def time(self):
27    raise NotImplementedError
28
29  @property
30  def iter_map(self):
31    raise NotImplementedError
32
33  @property
34  def iter_stacktrace(self):
35    raise NotImplementedError
36
37  def global_stat(self, name):
38    raise NotImplementedError
39
40  @property
41  def run_id(self):
42    raise NotImplementedError
43
44  @property
45  def pagesize(self):
46    raise NotImplementedError
47
48  @property
49  def pageframe_length(self):
50    raise NotImplementedError
51
52  @property
53  def pageframe_encoding(self):
54    raise NotImplementedError
55
56  @property
57  def has_pagecount(self):
58    raise NotImplementedError
59
60  @staticmethod
61  def load(path, log_header='Loading a heap profile dump: '):
62    """Loads a heap profile dump.
63
64    Args:
65        path: A file path string to load.
66        log_header: A preceding string for log messages.
67
68    Returns:
69        A loaded Dump object.
70
71    Raises:
72        ParsingException for invalid heap profile dumps.
73    """
74    from lib.deep_dump import DeepDump
75    dump = DeepDump(path, os.stat(path).st_mtime)
76    with open(path, 'r') as f:
77      dump.load_file(f, log_header)
78    return dump
79
80
81class DumpList(object):
82  """Represents a sequence of heap profile dumps.
83
84  Individual dumps are loaded into memory lazily as the sequence is accessed,
85  either while being iterated through or randomly accessed.  Loaded dumps are
86  not cached, meaning a newly loaded Dump object is returned every time an
87  element in the list is accessed.
88  """
89
90  def __init__(self, dump_path_list):
91    self._dump_path_list = dump_path_list
92
93  @staticmethod
94  def load(path_list):
95    return DumpList(path_list)
96
97  def __len__(self):
98    return len(self._dump_path_list)
99
100  def __iter__(self):
101    for dump in self._dump_path_list:
102      yield Dump.load(dump)
103
104  def __getitem__(self, index):
105    return Dump.load(self._dump_path_list[index])
106