Chromium Code Reviews| Index: tools/memory_inspector/memory_inspector/core/memory_map.py |
| diff --git a/tools/memory_inspector/memory_inspector/core/memory_map.py b/tools/memory_inspector/memory_inspector/core/memory_map.py |
| index f987ab99cb0bb585ebbb662f459d6c4ef0c31010..81ff484b46ae3f3d2ee01bf41eeba85bd3020265 100644 |
| --- a/tools/memory_inspector/memory_inspector/core/memory_map.py |
| +++ b/tools/memory_inspector/memory_inspector/core/memory_map.py |
| @@ -5,13 +5,16 @@ |
| import bisect |
| +PAGE_SIZE = 4096 |
|
Primiano Tucci (use gerrit)
2014/09/09 10:24:54
This will be required (out of this module) soon by
|
| + |
| + |
| class Map(object): |
| """Models the memory map of a given |backends.Process|. |
| This is typically obtained by calling backends.Process.DumpMemoryMaps().""" |
| def __init__(self): |
| - self.entries = [] |
| + self.entries = [] # List of |MapEntry|, sorted by start address. |
| def Add(self, entry): |
| assert(isinstance(entry, MapEntry)) |
| @@ -39,7 +42,6 @@ class Map(object): |
| class MapEntry(object): |
| """An entry (address range + stats) in a memory |Map|.""" |
| - PAGE_SIZE = 4096 |
| def __init__(self, start, end, prot_flags, mapped_file, mapped_offset, |
| priv_dirty_bytes=0, priv_clean_bytes=0, shared_dirty_bytes=0, |
| @@ -67,17 +69,19 @@ class MapEntry(object): |
| def IsPageResident(self, relative_page_index): |
| """Checks whether a given memory page is resident in memory.""" |
| assert(relative_page_index >= 0 and |
| - relative_page_index < self.len / MapEntry.PAGE_SIZE) |
| - assert(len(self.resident_pages) * MapEntry.PAGE_SIZE * 8 >= self.len) |
| + relative_page_index < self.len / PAGE_SIZE) |
| arr_idx = relative_page_index / 8 |
| arr_bit = relative_page_index % 8 |
| + # Trailing zeros are trimmed by memdump (to optimize dump time). |
| + if arr_idx >= len(self.resident_pages): |
| + return False |
| return (self.resident_pages[arr_idx] & (1 << arr_bit)) != 0 |
| def __cmp__(self, other): |
| """Comparison operator required for bisect.""" |
| if isinstance(other, MapEntry): |
| return self.start - other.start |
| - elif isinstance(other, int): |
| + elif isinstance(other, (long, int)): |
| return self.start - other |
| else: |
| raise Exception('Cannot compare with %s' % other.__class__) |
| @@ -85,3 +89,8 @@ class MapEntry(object): |
| @property |
| def len(self): |
| return self.end - self.start + 1 |
| + |
| + @property |
| + def rss_bytes(self): |
| + return (self.priv_dirty_bytes + self.priv_clean_bytes + |
| + self.shared_dirty_bytes + self.shared_clean_bytes) |