Index: third_party/tcmalloc/chromium/src/deep-heap-profile.h |
diff --git a/third_party/tcmalloc/chromium/src/deep-heap-profile.h b/third_party/tcmalloc/chromium/src/deep-heap-profile.h |
deleted file mode 100644 |
index 0544b31c7dd1de95a87f811ff87bf2f734c19855..0000000000000000000000000000000000000000 |
--- a/third_party/tcmalloc/chromium/src/deep-heap-profile.h |
+++ /dev/null |
@@ -1,407 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-// --- |
-// Author: Sainbayar Sukhbaatar |
-// Dai Mikurube |
-// |
-// This file contains a class DeepHeapProfile and its public function |
-// DeepHeapProfile::DumpOrderedProfile(). The function works like |
-// HeapProfileTable::FillOrderedProfile(), but dumps directory to files. |
-// |
-// DeepHeapProfile::DumpOrderedProfile() dumps more detailed information about |
-// heap usage, which includes OS-level information such as memory residency and |
-// type information if the type profiler is available. |
-// |
-// DeepHeapProfile::DumpOrderedProfile() uses data stored in HeapProfileTable. |
-// Any code in DeepHeapProfile runs only when DumpOrderedProfile() is called. |
-// It has overhead in dumping, but no overhead in logging. |
-// |
-// It currently works only on Linux including Android. It does nothing in |
-// non-Linux environments. |
- |
-// Note that uint64 is used to represent addresses instead of uintptr_t, and |
-// int is used to represent buffer sizes instead of size_t. |
-// It's for consistency with other TCMalloc functions. ProcMapsIterator uses |
-// uint64 for addresses, and HeapProfileTable::DumpOrderedProfile uses int |
-// for buffer sizes. |
- |
-#ifndef BASE_DEEP_HEAP_PROFILE_H_ |
-#define BASE_DEEP_HEAP_PROFILE_H_ |
- |
-#include "config.h" |
- |
-#if defined(TYPE_PROFILING) |
-#include <typeinfo> |
-#endif |
- |
-#if defined(__linux__) || defined(_WIN32) || defined(_WIN64) |
-#define USE_DEEP_HEAP_PROFILE 1 |
-#endif |
- |
-#include "addressmap-inl.h" |
-#include "heap-profile-table.h" |
-#include "memory_region_map.h" |
- |
-class DeepHeapProfile { |
- public: |
- enum PageFrameType { |
- DUMP_NO_PAGEFRAME = 0, // Dumps nothing about pageframes |
- DUMP_PFN = 1, // Dumps only pageframe numbers (PFNs) |
- DUMP_PAGECOUNT = 2, // Dumps PFNs and pagecounts |
- }; |
- |
- // Constructs a DeepHeapProfile instance. It works as a wrapper of |
- // HeapProfileTable. |
- // |
- // |heap_profile| is a pointer to HeapProfileTable. DeepHeapProfile reads |
- // data in |heap_profile| and forwards operations to |heap_profile| if |
- // DeepHeapProfile is not available (non-Linux). |
- // |prefix| is a prefix of dumped file names. |
- // |pageframe_type| means what information is dumped for pageframes. |
- DeepHeapProfile(HeapProfileTable* heap_profile, |
- const char* prefix, |
- enum PageFrameType pageframe_type); |
- ~DeepHeapProfile(); |
- |
- // Dumps a deep profile into |fd| with using |raw_buffer| of |buffer_size|. |
- // |
- // In addition, a list of buckets is dumped into a ".buckets" file in |
- // descending order of allocated bytes. |
- void DumpOrderedProfile(const char* reason, |
- char raw_buffer[], |
- int buffer_size, |
- RawFD fd); |
- |
- private: |
-#ifdef USE_DEEP_HEAP_PROFILE |
- typedef HeapProfileTable::Stats Stats; |
- typedef HeapProfileTable::Bucket Bucket; |
- typedef HeapProfileTable::AllocValue AllocValue; |
- typedef HeapProfileTable::AllocationMap AllocationMap; |
- |
- enum MapsRegionType { |
- // Bytes of memory which were not recognized with /proc/<pid>/maps. |
- // This size should be 0. |
- ABSENT, |
- |
- // Bytes of memory which is mapped anonymously. |
- // Regions which contain nothing in the last column of /proc/<pid>/maps. |
- ANONYMOUS, |
- |
- // Bytes of memory which is mapped to a executable/non-executable file. |
- // Regions which contain file paths in the last column of /proc/<pid>/maps. |
- FILE_EXEC, |
- FILE_NONEXEC, |
- |
- // Bytes of memory which is labeled [stack] in /proc/<pid>/maps. |
- STACK, |
- |
- // Bytes of memory which is labeled, but not mapped to any file. |
- // Regions which contain non-path strings in the last column of |
- // /proc/<pid>/maps. |
- OTHER, |
- |
- NUMBER_OF_MAPS_REGION_TYPES |
- }; |
- |
- static const char* kMapsRegionTypeDict[NUMBER_OF_MAPS_REGION_TYPES]; |
- |
- // Manages a buffer to keep a text to be dumped to a file. |
- class TextBuffer { |
- public: |
- TextBuffer(char *raw_buffer, int size, RawFD fd) |
- : buffer_(raw_buffer), |
- size_(size), |
- cursor_(0), |
- fd_(fd) { |
- } |
- |
- int Size(); |
- int FilledBytes(); |
- void Clear(); |
- void Flush(); |
- |
- bool AppendChar(char value); |
- bool AppendString(const char* value, int width); |
- bool AppendInt(int value, int width, bool leading_zero); |
- bool AppendLong(long value, int width); |
- bool AppendUnsignedLong(unsigned long value, int width); |
- bool AppendInt64(int64 value, int width); |
- bool AppendBase64(uint64 value, int width); |
- bool AppendPtr(uint64 value, int width); |
- |
- private: |
- bool ForwardCursor(int appended); |
- |
- char *buffer_; |
- int size_; |
- int cursor_; |
- RawFD fd_; |
- DISALLOW_COPY_AND_ASSIGN(TextBuffer); |
- }; |
- |
- // Defines an interface for getting info about memory residence. |
- class MemoryResidenceInfoGetterInterface { |
- public: |
- virtual ~MemoryResidenceInfoGetterInterface(); |
- |
- // Initializes the instance. |
- virtual void Initialize() = 0; |
- |
- // Returns the number of resident (including swapped) bytes of the given |
- // memory region from |first_address| to |last_address| inclusive. |
- virtual size_t CommittedSize(uint64 first_address, |
- uint64 last_address, |
- TextBuffer* buffer) const = 0; |
- |
- // Creates a new platform specific MemoryResidenceInfoGetterInterface. |
- static MemoryResidenceInfoGetterInterface* Create( |
- PageFrameType pageframe_type); |
- |
- virtual bool IsPageCountAvailable() const = 0; |
- |
- protected: |
- MemoryResidenceInfoGetterInterface(); |
- }; |
- |
-#if defined(_WIN32) || defined(_WIN64) |
- // TODO(peria): Implement this class. |
- class MemoryInfoGetterWindows : public MemoryResidenceInfoGetterInterface { |
- public: |
- MemoryInfoGetterWindows(PageFrameType) {} |
- virtual ~MemoryInfoGetterWindows() {} |
- |
- virtual void Initialize(); |
- |
- virtual size_t CommittedSize(uint64 first_address, |
- uint64 last_address, |
- TextBuffer* buffer) const; |
- |
- virtual bool IsPageCountAvailable() const; |
- }; |
-#endif // defined(_WIN32) || defined(_WIN64) |
- |
-#if defined(__linux__) |
- // Implements MemoryResidenceInfoGetterInterface for Linux. |
- class MemoryInfoGetterLinux : public MemoryResidenceInfoGetterInterface { |
- public: |
- MemoryInfoGetterLinux(PageFrameType pageframe_type) |
- : pageframe_type_(pageframe_type), |
- pagemap_fd_(kIllegalRawFD), |
- kpagecount_fd_(kIllegalRawFD) {} |
- virtual ~MemoryInfoGetterLinux() {} |
- |
- // Opens /proc/<pid>/pagemap and stores its file descriptor. |
- // It keeps open while the process is running. |
- // |
- // Note that file descriptors need to be refreshed after fork. |
- virtual void Initialize(); |
- |
- // Returns the number of resident (including swapped) bytes of the given |
- // memory region from |first_address| to |last_address| inclusive. |
- virtual size_t CommittedSize(uint64 first_address, |
- uint64 last_address, |
- TextBuffer* buffer) const; |
- |
- virtual bool IsPageCountAvailable() const; |
- |
- private: |
- struct State { |
- uint64 pfn; |
- bool is_committed; // Currently, we use only this |
- bool is_present; |
- bool is_swapped; |
- bool is_shared; |
- bool is_mmap; |
- }; |
- |
- uint64 ReadPageCount(uint64 pfn) const; |
- |
- // Seeks to the offset of the open pagemap file. |
- // It returns true if succeeded. |
- bool Seek(uint64 address) const; |
- |
- // Reads a pagemap state from the current offset. |
- // It returns true if succeeded. |
- bool Read(State* state, bool get_pfn) const; |
- |
- PageFrameType pageframe_type_; |
- RawFD pagemap_fd_; |
- RawFD kpagecount_fd_; |
- }; |
-#endif // defined(__linux__) |
- |
- // Contains extended information for HeapProfileTable::Bucket. These objects |
- // are managed in a hash table (DeepBucketTable) whose key is an address of |
- // a Bucket and other additional information. |
- struct DeepBucket { |
- public: |
- void UnparseForStats(TextBuffer* buffer); |
- void UnparseForBucketFile(TextBuffer* buffer); |
- |
- Bucket* bucket; |
-#if defined(TYPE_PROFILING) |
- const std::type_info* type; // A type of the object |
-#endif |
- size_t committed_size; // A resident size of this bucket |
- bool is_mmap; // True if the bucket represents a mmap region |
- int id; // A unique ID of the bucket |
- bool is_logged; // True if the stracktrace is logged to a file |
- DeepBucket* next; // A reference to the next entry in the hash table |
- }; |
- |
- // Manages a hash table for DeepBucket. |
- class DeepBucketTable { |
- public: |
- DeepBucketTable(int size, |
- HeapProfileTable::Allocator alloc, |
- HeapProfileTable::DeAllocator dealloc); |
- ~DeepBucketTable(); |
- |
- // Finds a DeepBucket instance corresponding to the given |bucket|, or |
- // creates a new DeepBucket object if it doesn't exist. |
- DeepBucket* Lookup(Bucket* bucket, |
-#if defined(TYPE_PROFILING) |
- const std::type_info* type, |
-#endif |
- bool is_mmap); |
- |
- // Writes stats of the hash table to |buffer| for DumpOrderedProfile. |
- void UnparseForStats(TextBuffer* buffer); |
- |
- // Writes all buckets for a bucket file with using |buffer|. |
- void WriteForBucketFile(const char* prefix, |
- int dump_count, |
- char raw_buffer[], |
- int buffer_size); |
- |
- // Resets 'committed_size' members in DeepBucket objects. |
- void ResetCommittedSize(); |
- |
- // Resets all 'is_loggeed' flags in DeepBucket objects. |
- void ResetIsLogged(); |
- |
- private: |
- // Adds |add| to a |hash_value| for Lookup. |
- inline static void AddToHashValue(uintptr_t add, uintptr_t* hash_value); |
- inline static void FinishHashValue(uintptr_t* hash_value); |
- |
- DeepBucket** table_; |
- size_t table_size_; |
- HeapProfileTable::Allocator alloc_; |
- HeapProfileTable::DeAllocator dealloc_; |
- int bucket_id_; |
- }; |
- |
- class RegionStats { |
- public: |
- RegionStats(): virtual_bytes_(0), committed_bytes_(0) {} |
- ~RegionStats() {} |
- |
- // Initializes 'virtual_bytes_' and 'committed_bytes_'. |
- void Initialize(); |
- |
- // Updates itself to contain the tallies of 'virtual_bytes' and |
- // 'committed_bytes' in the region from |first_adress| to |last_address| |
- // inclusive. |
- uint64 Record( |
- const MemoryResidenceInfoGetterInterface* memory_residence_info_getter, |
- uint64 first_address, |
- uint64 last_address, |
- TextBuffer* buffer); |
- |
- // Writes stats of the region into |buffer| with |name|. |
- void Unparse(const char* name, TextBuffer* buffer); |
- |
- size_t virtual_bytes() const { return virtual_bytes_; } |
- size_t committed_bytes() const { return committed_bytes_; } |
- void AddToVirtualBytes(size_t additional_virtual_bytes) { |
- virtual_bytes_ += additional_virtual_bytes; |
- } |
- void AddToCommittedBytes(size_t additional_committed_bytes) { |
- committed_bytes_ += additional_committed_bytes; |
- } |
- void AddAnotherRegionStat(const RegionStats& other) { |
- virtual_bytes_ += other.virtual_bytes_; |
- committed_bytes_ += other.committed_bytes_; |
- } |
- |
- private: |
- size_t virtual_bytes_; |
- size_t committed_bytes_; |
- DISALLOW_COPY_AND_ASSIGN(RegionStats); |
- }; |
- |
- class GlobalStats { |
- public: |
- // Snapshots and calculates global stats from /proc/<pid>/maps and pagemap. |
- void SnapshotMaps( |
- const MemoryResidenceInfoGetterInterface* memory_residence_info_getter, |
- DeepHeapProfile* deep_profile, |
- TextBuffer* mmap_dump_buffer); |
- |
- // Snapshots allocations by malloc and mmap. |
- void SnapshotAllocations(DeepHeapProfile* deep_profile); |
- |
- // Writes global stats into |buffer|. |
- void Unparse(TextBuffer* buffer); |
- |
- private: |
- // Records both virtual and committed byte counts of malloc and mmap regions |
- // as callback functions for AllocationMap::Iterate(). |
- static void RecordAlloc(const void* pointer, |
- AllocValue* alloc_value, |
- DeepHeapProfile* deep_profile); |
- |
- DeepBucket* GetInformationOfMemoryRegion( |
- const MemoryRegionMap::RegionIterator& mmap_iter, |
- const MemoryResidenceInfoGetterInterface* memory_residence_info_getter, |
- DeepHeapProfile* deep_profile); |
- |
- // All RegionStats members in this class contain the bytes of virtual |
- // memory and committed memory. |
- // TODO(dmikurube): These regions should be classified more precisely later |
- // for more detailed analysis. |
- RegionStats all_[NUMBER_OF_MAPS_REGION_TYPES]; |
- |
- RegionStats unhooked_[NUMBER_OF_MAPS_REGION_TYPES]; |
- |
- // Total bytes of malloc'ed regions. |
- RegionStats profiled_malloc_; |
- |
- // Total bytes of mmap'ed regions. |
- RegionStats profiled_mmap_; |
- }; |
- |
- // Writes reformatted /proc/<pid>/maps into a file "|prefix|.<pid>.maps" |
- // with using |raw_buffer| of |buffer_size|. |
- static void WriteProcMaps(const char* prefix, |
- char raw_buffer[], |
- int buffer_size); |
- |
- // Appends the command line (/proc/pid/cmdline on Linux) into |buffer|. |
- bool AppendCommandLine(TextBuffer* buffer); |
- |
- MemoryResidenceInfoGetterInterface* memory_residence_info_getter_; |
- |
- // Process ID of the last dump. This can change by fork. |
- pid_t most_recent_pid_; |
- |
- GlobalStats stats_; // Stats about total memory. |
- int dump_count_; // The number of dumps. |
- char* filename_prefix_; // Output file prefix. |
- char run_id_[128]; |
- |
- DeepBucketTable deep_table_; |
- |
- enum PageFrameType pageframe_type_; |
-#endif // USE_DEEP_HEAP_PROFILE |
- |
- HeapProfileTable* heap_profile_; |
- |
- DISALLOW_COPY_AND_ASSIGN(DeepHeapProfile); |
-}; |
- |
-#endif // BASE_DEEP_HEAP_PROFILE_H_ |