summaryrefslogtreecommitdiff
path: root/base/memory/shared_memory_tracker.h
diff options
context:
space:
mode:
Diffstat (limited to 'base/memory/shared_memory_tracker.h')
-rw-r--r--base/memory/shared_memory_tracker.h90
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_