diff options
Diffstat (limited to 'base/memory/shared_memory_tracker.h')
-rw-r--r-- | base/memory/shared_memory_tracker.h | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/base/memory/shared_memory_tracker.h b/base/memory/shared_memory_tracker.h new file mode 100644 index 0000000000..499b1728cb --- /dev/null +++ b/base/memory/shared_memory_tracker.h @@ -0,0 +1,90 @@ +// Copyright 2017 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_MEMORY_SHARED_MEMORY_TRACKER_H_ +#define BASE_MEMORY_SHARED_MEMORY_TRACKER_H_ + +#include <map> +#include <string> + +#include "base/memory/shared_memory.h" +#include "base/memory/shared_memory_mapping.h" +#include "base/synchronization/lock.h" +#include "base/trace_event/memory_dump_provider.h" + +namespace base { + +namespace trace_event { +class MemoryAllocatorDump; +class MemoryAllocatorDumpGuid; +class ProcessMemoryDump; +} + +// SharedMemoryTracker tracks shared memory usage. +class BASE_EXPORT SharedMemoryTracker : public trace_event::MemoryDumpProvider { + public: + // Returns a singleton instance. + static SharedMemoryTracker* GetInstance(); + + static std::string GetDumpNameForTracing(const UnguessableToken& id); + + static trace_event::MemoryAllocatorDumpGuid GetGlobalDumpIdForTracing( + const UnguessableToken& id); + + // Gets or creates if non-existant, a memory dump for the |shared_memory| + // inside the given |pmd|. Also adds the necessary edges for the dump when + // creating the dump. + static const trace_event::MemoryAllocatorDump* GetOrCreateSharedMemoryDump( + const SharedMemory* shared_memory, + trace_event::ProcessMemoryDump* pmd); + // We're in the middle of a refactor https://crbug.com/795291. Eventually, the + // first call will go away. + static const trace_event::MemoryAllocatorDump* GetOrCreateSharedMemoryDump( + const SharedMemoryMapping& shared_memory, + trace_event::ProcessMemoryDump* pmd); + + // Records shared memory usage on valid mapping. + void IncrementMemoryUsage(const SharedMemory& shared_memory); + void IncrementMemoryUsage(const SharedMemoryMapping& mapping); + + // Records shared memory usage on unmapping. + void DecrementMemoryUsage(const SharedMemory& shared_memory); + void DecrementMemoryUsage(const SharedMemoryMapping& mapping); + + // Root dump name for all shared memory dumps. + static const char kDumpRootName[]; + + private: + SharedMemoryTracker(); + ~SharedMemoryTracker() override; + + // trace_event::MemoryDumpProvider implementation. + bool OnMemoryDump(const trace_event::MemoryDumpArgs& args, + trace_event::ProcessMemoryDump* pmd) override; + + static const trace_event::MemoryAllocatorDump* + GetOrCreateSharedMemoryDumpInternal(void* mapped_memory, + size_t mapped_size, + const UnguessableToken& mapped_id, + trace_event::ProcessMemoryDump* pmd); + + // Information associated with each mapped address. + struct UsageInfo { + UsageInfo(size_t size, const UnguessableToken& id) + : mapped_size(size), mapped_id(id) {} + + size_t mapped_size; + UnguessableToken mapped_id; + }; + + // Used to lock when |usages_| is modified or read. + Lock usages_lock_; + std::map<void*, UsageInfo> usages_; + + DISALLOW_COPY_AND_ASSIGN(SharedMemoryTracker); +}; + +} // namespace base + +#endif // BASE_MEMORY_SHARED_MEMORY_TRACKER_H_ |