Index: third_party/tcmalloc/chromium/src/heap-profile-table.h |
diff --git a/third_party/tcmalloc/chromium/src/heap-profile-table.h b/third_party/tcmalloc/chromium/src/heap-profile-table.h |
index 29f0d36d700e4cc2a997a61ad49fb56c4be1bc2b..c2ad39f9138f4049fc9de2e45a385a8e1819e687 100644 |
--- a/third_party/tcmalloc/chromium/src/heap-profile-table.h |
+++ b/third_party/tcmalloc/chromium/src/heap-profile-table.h |
@@ -38,6 +38,7 @@ |
#include "addressmap-inl.h" |
#include "base/basictypes.h" |
#include "base/logging.h" // for RawFD |
+#include "heap-profile-stats.h" |
#if defined(TYPE_PROFILING) |
#include <gperftools/type_profiler_map.h> |
@@ -62,18 +63,7 @@ class HeapProfileTable { |
// data types ---------------------------- |
// Profile stats. |
- struct Stats { |
- int32 allocs; // Number of allocation calls |
- int32 frees; // Number of free calls |
- int64 alloc_size; // Total size of all allocated objects so far |
- int64 free_size; // Total size of all freed objects so far |
- |
- // semantic equality |
- bool Equivalent(const Stats& x) const { |
- return allocs - frees == x.allocs - x.frees && |
- alloc_size - free_size == x.alloc_size - x.free_size; |
- } |
- }; |
+ typedef HeapProfileStats Stats; |
// Possible marks for MarkCurrentAllocations and MarkUnmarkedAllocations. New |
// allocations are marked with UNMARKED by default. |
@@ -107,7 +97,7 @@ class HeapProfileTable { |
// interface --------------------------- |
- HeapProfileTable(Allocator alloc, DeAllocator dealloc); |
+ HeapProfileTable(Allocator alloc, DeAllocator dealloc, bool profile_mmap); |
~HeapProfileTable(); |
// Collect the stack trace for the function that asked to do the |
@@ -169,7 +159,7 @@ class HeapProfileTable { |
// Iterate over the allocation profile data calling "callback" |
// for every allocation. |
void IterateAllocs(AllocIterator callback) const { |
- alloc_address_map_->Iterate(MapArgsAllocIterator, callback); |
+ address_map_->Iterate(MapArgsAllocIterator, callback); |
} |
// Callback for iterating through addresses of all allocated objects. Accepts |
@@ -214,22 +204,6 @@ class HeapProfileTable { |
// Caller must call ReleaseSnapshot() on result when no longer needed. |
Snapshot* NonLiveSnapshot(Snapshot* base); |
- // Refresh the internal mmap information from MemoryRegionMap. Results of |
- // FillOrderedProfile and IterateOrderedAllocContexts will contain mmap'ed |
- // memory regions as at calling RefreshMMapData. |
- // 'mmap_alloc' is an allocator for an address map. A function which calls |
- // LowLevelAlloc::AllocWithArena is expected like the constractor. |
- // 'mmap_dealloc' is a corresponding deallocator to 'mmap_alloc'. |
- // They are introduced to avoid expected memory fragmentation and bloat in |
- // an arena. A dedicated arena for this function allows disposing whole the |
- // arena after ClearMMapData. |
- void RefreshMMapData(Allocator mmap_alloc, DeAllocator mmap_dealloc); |
- |
- // Clear the internal mmap information. Results of FillOrderedProfile and |
- // IterateOrderedAllocContexts won't contain mmap'ed memory regions after |
- // calling ClearMMapData. |
- void ClearMMapData(); |
- |
// Dump a list of allocations marked as "live" along with their creation |
// stack traces and sizes to a file named |file_name|. Together with |
// MarkCurrentAllocatiosn and MarkUnmarkedAllocations this can be used |
@@ -260,12 +234,7 @@ class HeapProfileTable { |
// Hash table bucket to hold (de)allocation stats |
// for a given allocation call stack trace. |
- struct Bucket : public Stats { |
- uintptr_t hash; // Hash value of the stack trace |
- int depth; // Depth of stack trace |
- const void** stack; // Stack trace |
- Bucket* next; // Next entry in hash-table |
- }; |
+ typedef HeapProfileBucket Bucket; |
// Info stored in the address map |
struct AllocValue { |
@@ -310,52 +279,75 @@ class HeapProfileTable { |
typedef AddressMap<AllocValue> AllocationMap; |
+ // Arguments that need to be passed DumpBucketIterator callback below. |
+ struct BufferArgs { |
+ BufferArgs(char* buf_arg, int buflen_arg, int bufsize_arg) |
+ : buf(buf_arg), |
+ buflen(buflen_arg), |
+ bufsize(bufsize_arg) { |
+ } |
+ |
+ char* buf; |
+ int buflen; |
+ int bufsize; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(BufferArgs); |
+ }; |
+ |
// Arguments that need to be passed DumpNonLiveIterator callback below. |
struct DumpArgs { |
+ DumpArgs(RawFD fd_arg, Stats* profile_stats_arg) |
+ : fd(fd_arg), |
+ profile_stats(profile_stats_arg) { |
+ } |
+ |
RawFD fd; // file to write to |
Stats* profile_stats; // stats to update (may be NULL) |
- |
- DumpArgs(RawFD a, Stats* d) |
- : fd(a), profile_stats(d) { } |
}; |
// Arguments that need to be passed DumpMarkedIterator callback below. |
struct DumpMarkedArgs { |
+ DumpMarkedArgs(RawFD fd_arg, AllocationMark mark_arg) |
+ : fd(fd_arg), |
+ mark(mark_arg) { |
+ } |
+ |
RawFD fd; // file to write to. |
AllocationMark mark; // The mark of the allocations to process. |
- |
- DumpMarkedArgs(RawFD a, AllocationMark m) : fd(a), mark(m) { } |
}; |
// Arguments that need to be passed MarkIterator callback below. |
struct MarkArgs { |
+ MarkArgs(AllocationMark mark_arg, bool mark_all_arg) |
+ : mark(mark_arg), |
+ mark_all(mark_all_arg) { |
+ } |
+ |
AllocationMark mark; // The mark to put on allocations. |
bool mark_all; // True if all allocations should be marked. Otherwise just |
// mark unmarked allocations. |
- |
- MarkArgs(AllocationMark m, bool a) : mark(m), mark_all(a) { } |
}; |
#if defined(TYPE_PROFILING) |
struct TypeCount { |
- size_t bytes; |
- unsigned int objects; |
- |
TypeCount(size_t bytes_arg, unsigned int objects_arg) |
: bytes(bytes_arg), |
objects(objects_arg) { |
} |
+ |
+ size_t bytes; |
+ unsigned int objects; |
}; |
#endif // defined(TYPE_PROFILING) |
struct AllocationAddressIteratorArgs { |
+ AllocationAddressIteratorArgs(AddressIterator callback_arg, void* data_arg) |
+ : callback(callback_arg), |
+ data(data_arg) { |
+ } |
+ |
AddressIterator callback; |
void* data; |
- |
- AllocationAddressIteratorArgs(AddressIterator iterator, void* d) |
- : callback(iterator), |
- data(d) { |
- } |
}; |
// helpers ---------------------------- |
@@ -376,18 +368,9 @@ class HeapProfileTable { |
const char* extra, |
Stats* profile_stats); |
- // Deallocate a given allocation map. |
- void DeallocateAllocationMap(AllocationMap* allocation); |
- |
- // Deallocate a given bucket table. |
- void DeallocateBucketTable(Bucket** table); |
- |
- // Get the bucket for the caller stack trace 'key' of depth 'depth' from a |
- // bucket hash map 'table' creating the bucket if needed. '*bucket_count' |
- // is incremented both when 'bucket_count' is not NULL and when a new |
- // bucket object is created. |
- Bucket* GetBucket(int depth, const void* const key[], Bucket** table, |
- int* bucket_count); |
+ // Get the bucket for the caller stack trace 'key' of depth 'depth' |
+ // creating the bucket if needed. |
+ Bucket* GetBucket(int depth, const void* const key[]); |
// Helper for IterateAllocs to do callback signature conversion |
// from AllocationMap::Iterate to AllocIterator. |
@@ -402,6 +385,10 @@ class HeapProfileTable { |
callback(ptr, info); |
} |
+ // Helper to dump a bucket. |
+ inline static void DumpBucketIterator(const Bucket* bucket, |
+ BufferArgs* args); |
+ |
// Helper for IterateAllocationAddresses. |
inline static void AllocationAddressesIterator( |
const void* ptr, |
@@ -422,10 +409,6 @@ class HeapProfileTable { |
inline static void DumpMarkedIterator(const void* ptr, AllocValue* v, |
const DumpMarkedArgs& args); |
- // Helper for filling size variables in buckets by zero. |
- inline static void ZeroBucketCountsIterator( |
- const void* ptr, AllocValue* v, HeapProfileTable* heap_profile); |
- |
#if defined(TYPE_PROFILING) |
inline static void TallyTypesItererator(const void* ptr, |
AllocValue* value, |
@@ -437,8 +420,7 @@ class HeapProfileTable { |
#endif // defined(TYPE_PROFILING) |
// Helper for IterateOrderedAllocContexts and FillOrderedProfile. |
- // Creates a sorted list of Buckets whose length is num_alloc_buckets_ + |
- // num_avaliable_mmap_buckets_. |
+ // Creates a sorted list of Buckets whose length is num_buckets_. |
// The caller is responsible for deallocating the returned list. |
Bucket** MakeSortedBucketList() const; |
@@ -471,25 +453,19 @@ class HeapProfileTable { |
// Overall profile stats; we use only the Stats part, |
// but make it a Bucket to pass to UnparseBucket. |
- // It doesn't contain mmap'ed regions. |
Bucket total_; |
+ bool profile_mmap_; |
+ |
// Bucket hash table for malloc. |
// We hand-craft one instead of using one of the pre-written |
// ones because we do not want to use malloc when operating on the table. |
// It is only few lines of code, so no big deal. |
- Bucket** alloc_table_; |
- int num_alloc_buckets_; |
- |
- // Bucket hash table for mmap. |
- // This table is filled with the information from MemoryRegionMap by calling |
- // RefreshMMapData. |
- Bucket** mmap_table_; |
- int num_available_mmap_buckets_; |
+ Bucket** bucket_table_; |
+ int num_buckets_; |
// Map of all currently allocated objects and mapped regions we know about. |
- AllocationMap* alloc_address_map_; |
- AllocationMap* mmap_address_map_; |
+ AllocationMap* address_map_; |
DISALLOW_COPY_AND_ASSIGN(HeapProfileTable); |
}; |