| Index: third_party/tcmalloc/chromium/src/leak_analyzer.h
|
| diff --git a/third_party/tcmalloc/chromium/src/leak_analyzer.h b/third_party/tcmalloc/chromium/src/leak_analyzer.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9f46e8fbb4f2ac3fb79aaa6eea7b8b4f22bd421e
|
| --- /dev/null
|
| +++ b/third_party/tcmalloc/chromium/src/leak_analyzer.h
|
| @@ -0,0 +1,117 @@
|
| +// Copyright (c) 2015 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.
|
| +
|
| +#ifndef _LEAK_ANALYZER_H_
|
| +#define _LEAK_ANALYZER_H_
|
| +
|
| +#include <map>
|
| +#include <vector>
|
| +
|
| +#include "base/custom_allocator.h"
|
| +#include "leak_detector_value_type.h"
|
| +#include "ranked_list.h"
|
| +
|
| +// This class looks for possible leak patterns in allocation data over time.
|
| +
|
| +namespace leak_detector {
|
| +
|
| +class LeakAnalyzer {
|
| + public:
|
| + using ValueType = LeakDetectorValueType;
|
| +
|
| + // Interface for printing strings for various value types.
|
| + class StringPrint {
|
| + public:
|
| + // Gets the string representation of a value. Returns the string stored in
|
| + // |buffer_|. The contents of |buffer_| will change if this is called again
|
| + // with different inputs.
|
| + virtual const char* ValueToString(const ValueType& value,
|
| + bool spacing_on) = 0;
|
| +
|
| + // Gets the word that describes the value type.
|
| + virtual const char* ValueTypeName(bool is_plural) = 0;
|
| +
|
| + protected:
|
| + // Buffer for returning the string representation of a value.
|
| + static const int kStringPrintBufferSize = 1024;
|
| + char buffer_[kStringPrintBufferSize];
|
| + };
|
| +
|
| + template <typename Type>
|
| + using Allocator = STL_Allocator<Type, CustomAllocator>;
|
| +
|
| + LeakAnalyzer(int ranking_size,
|
| + int num_suspicions_threshold,
|
| + StringPrint* string_print)
|
| + : ranking_size_(ranking_size),
|
| + score_increase_(1 << num_suspicions_threshold),
|
| + score_threshold_((1 << num_suspicions_threshold) * 2 - 1),
|
| + ranked_entries_(ranking_size),
|
| + prev_ranked_entries_(ranking_size),
|
| + string_print_(string_print) {
|
| + suspected_leaks_.reserve(ranking_size);
|
| + }
|
| +
|
| + ~LeakAnalyzer() {}
|
| +
|
| + // Take in a list of allocations, sorted by count.
|
| + void AddSample(const RankedList& ranked_list);
|
| +
|
| + // Used to report suspected leaks.
|
| + const std::vector<ValueType, Allocator<ValueType>>& suspected_leaks() const {
|
| + return suspected_leaks_;
|
| + }
|
| +
|
| + // Log the leak detector's top sizes and suspected sizes. |buffer| is a char
|
| + // buffer of size |buffer_size| that can eventually be logged.
|
| + int Dump(char* buffer, const int buffer_size) const;
|
| +
|
| + private:
|
| + using RankedEntry = RankedList::Entry;
|
| +
|
| + // Analyze a list of allocation count deltas from the previous iteration. If
|
| + // anything looks like a possible leak, update the suspicion scores.
|
| + void AnalyzeDeltas(const RankedList& ranked_deltas);
|
| +
|
| + // Returns the RankedEntry from the previous analysis that had the given
|
| + // value, or NULL if it didn't exist.
|
| + const RankedEntry* GetPreviousEntryWithValue(const ValueType& value) const;
|
| +
|
| + // Look for the top |ranking_size_| entries when analyzing leaks.
|
| + const int ranking_size_;
|
| +
|
| + // Each time an entry is suspected as a possible leak, increase its suspicion
|
| + // score by this much.
|
| + const int score_increase_;
|
| +
|
| + // Report suspected leaks when the suspicion score reaches this value.
|
| + const int score_threshold_;
|
| +
|
| + // A mapping of allocation values to suspicion score. All allocations in this
|
| + // container are suspected leaks. The score can increase or decrease over
|
| + // time. Once the score reaches |score_threshold_|, the entry is reported as
|
| + // a suspected leak in |suspected_leaks_|.
|
| + std::map<ValueType,
|
| + uint32,
|
| + std::less<ValueType>,
|
| + Allocator<std::pair<ValueType, uint32>>> suspected_histogram_;
|
| +
|
| + // Array of allocated values that passed the suspicion threshold and are being
|
| + // reported.
|
| + std::vector<ValueType, Allocator<ValueType>> suspected_leaks_;
|
| +
|
| + // The most recent allocation entries, since the last call to AddSample().
|
| + RankedList ranked_entries_;
|
| + // The previous allocation entries, from before the last call to AddSample().
|
| + RankedList prev_ranked_entries_;
|
| +
|
| + // For logging.
|
| + StringPrint* string_print_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(LeakAnalyzer);
|
| +};
|
| +
|
| +} // namespace leak_detector
|
| +
|
| +#endif // _LEAK_ANALYZER_H_
|
|
|