mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-11-28 00:06:09 +03:00
154 lines
5.5 KiB
C
154 lines
5.5 KiB
C
|
// Copyright 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 BASE_TRACE_EVENT_MEMORY_ALLOCATOR_DUMP_H_
|
||
|
#define BASE_TRACE_EVENT_MEMORY_ALLOCATOR_DUMP_H_
|
||
|
|
||
|
#include <stdint.h>
|
||
|
|
||
|
#include <memory>
|
||
|
#include <ostream>
|
||
|
#include <string>
|
||
|
|
||
|
#include "base/base_export.h"
|
||
|
#include "base/gtest_prod_util.h"
|
||
|
#include "base/logging.h"
|
||
|
#include "base/macros.h"
|
||
|
#include "base/optional.h"
|
||
|
#include "base/trace_event/memory_allocator_dump_guid.h"
|
||
|
#include "base/trace_event/memory_dump_request_args.h"
|
||
|
#include "base/trace_event/trace_event_argument.h"
|
||
|
#include "base/unguessable_token.h"
|
||
|
#include "base/values.h"
|
||
|
|
||
|
namespace base {
|
||
|
namespace trace_event {
|
||
|
|
||
|
class ProcessMemoryDump;
|
||
|
class TracedValue;
|
||
|
|
||
|
// Data model for user-land memory allocator dumps.
|
||
|
class BASE_EXPORT MemoryAllocatorDump {
|
||
|
public:
|
||
|
enum Flags {
|
||
|
DEFAULT = 0,
|
||
|
|
||
|
// A dump marked weak will be discarded by TraceViewer.
|
||
|
WEAK = 1 << 0,
|
||
|
};
|
||
|
|
||
|
// In the TraceViewer UI table each MemoryAllocatorDump becomes
|
||
|
// a row and each Entry generates a column (if it doesn't already
|
||
|
// exist).
|
||
|
struct BASE_EXPORT Entry {
|
||
|
enum EntryType {
|
||
|
kUint64,
|
||
|
kString,
|
||
|
};
|
||
|
|
||
|
// By design name, units and value_string are always coming from
|
||
|
// indefinitely lived const char* strings, the only reason we copy
|
||
|
// them into a std::string is to handle Mojo (de)serialization.
|
||
|
// TODO(hjd): Investigate optimization (e.g. using StringPiece).
|
||
|
Entry(); // Only for deserialization.
|
||
|
Entry(std::string name, std::string units, uint64_t value);
|
||
|
Entry(std::string name, std::string units, std::string value);
|
||
|
Entry(Entry&& other) noexcept;
|
||
|
Entry& operator=(Entry&& other);
|
||
|
bool operator==(const Entry& rhs) const;
|
||
|
|
||
|
std::string name;
|
||
|
std::string units;
|
||
|
|
||
|
EntryType entry_type;
|
||
|
|
||
|
uint64_t value_uint64;
|
||
|
std::string value_string;
|
||
|
|
||
|
DISALLOW_COPY_AND_ASSIGN(Entry);
|
||
|
};
|
||
|
|
||
|
MemoryAllocatorDump(const std::string& absolute_name,
|
||
|
MemoryDumpLevelOfDetail,
|
||
|
const MemoryAllocatorDumpGuid&);
|
||
|
~MemoryAllocatorDump();
|
||
|
|
||
|
// Standard attribute |name|s for the AddScalar and AddString() methods.
|
||
|
static const char kNameSize[]; // To represent allocated space.
|
||
|
static const char kNameObjectCount[]; // To represent number of objects.
|
||
|
|
||
|
// Standard attribute |unit|s for the AddScalar and AddString() methods.
|
||
|
static const char kUnitsBytes[]; // Unit name to represent bytes.
|
||
|
static const char kUnitsObjects[]; // Unit name to represent #objects.
|
||
|
|
||
|
// Constants used only internally and by tests.
|
||
|
static const char kTypeScalar[]; // Type name for scalar attributes.
|
||
|
static const char kTypeString[]; // Type name for string attributes.
|
||
|
|
||
|
// Setters for scalar attributes. Some examples:
|
||
|
// - "size" column (all dumps are expected to have at least this one):
|
||
|
// AddScalar(kNameSize, kUnitsBytes, 1234);
|
||
|
// - Some extra-column reporting internal details of the subsystem:
|
||
|
// AddScalar("number_of_freelist_entries", kUnitsObjects, 42)
|
||
|
// - Other informational column:
|
||
|
// AddString("kitten", "name", "shadow");
|
||
|
void AddScalar(const char* name, const char* units, uint64_t value);
|
||
|
void AddString(const char* name, const char* units, const std::string& value);
|
||
|
|
||
|
// Absolute name, unique within the scope of an entire ProcessMemoryDump.
|
||
|
const std::string& absolute_name() const { return absolute_name_; }
|
||
|
|
||
|
// Called at trace generation time to populate the TracedValue.
|
||
|
void AsValueInto(TracedValue* value) const;
|
||
|
|
||
|
// Get the size for this dump.
|
||
|
// The size is the value set with AddScalar(kNameSize, kUnitsBytes, size);
|
||
|
// TODO(hjd): this should return an Optional<uint64_t>.
|
||
|
uint64_t GetSizeInternal() const;
|
||
|
|
||
|
MemoryDumpLevelOfDetail level_of_detail() const { return level_of_detail_; }
|
||
|
|
||
|
// Use enum Flags to set values.
|
||
|
void set_flags(int flags) { flags_ |= flags; }
|
||
|
void clear_flags(int flags) { flags_ &= ~flags; }
|
||
|
int flags() const { return flags_; }
|
||
|
|
||
|
// |guid| is an optional global dump identifier, unique across all processes
|
||
|
// within the scope of a global dump. It is only required when using the
|
||
|
// graph APIs (see TODO_method_name) to express retention / suballocation or
|
||
|
// cross process sharing. See crbug.com/492102 for design docs.
|
||
|
// Subsequent MemoryAllocatorDump(s) with the same |absolute_name| are
|
||
|
// expected to have the same guid.
|
||
|
const MemoryAllocatorDumpGuid& guid() const { return guid_; }
|
||
|
|
||
|
const std::vector<Entry>& entries() const { return entries_; }
|
||
|
|
||
|
// Only for mojo serialization, which can mutate the collection.
|
||
|
std::vector<Entry>* mutable_entries_for_serialization() const {
|
||
|
cached_size_.reset(); // The caller can mutate the collection.
|
||
|
|
||
|
// Mojo takes a const input argument even for move-only types that can be
|
||
|
// mutate while serializing (like this one). Hence the const_cast.
|
||
|
return const_cast<std::vector<Entry>*>(&entries_);
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
const std::string absolute_name_;
|
||
|
MemoryAllocatorDumpGuid guid_;
|
||
|
MemoryDumpLevelOfDetail level_of_detail_;
|
||
|
int flags_; // See enum Flags.
|
||
|
mutable Optional<uint64_t> cached_size_; // Lazy, for GetSizeInternal().
|
||
|
std::vector<Entry> entries_;
|
||
|
|
||
|
DISALLOW_COPY_AND_ASSIGN(MemoryAllocatorDump);
|
||
|
};
|
||
|
|
||
|
// This is required by gtest to print a readable output on test failures.
|
||
|
void BASE_EXPORT PrintTo(const MemoryAllocatorDump::Entry&, std::ostream*);
|
||
|
|
||
|
} // namespace trace_event
|
||
|
} // namespace base
|
||
|
|
||
|
#endif // BASE_TRACE_EVENT_MEMORY_ALLOCATOR_DUMP_H_
|