• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef BASE_TRACE_EVENT_MALLOC_DUMP_PROVIDER_H_
6 #define BASE_TRACE_EVENT_MALLOC_DUMP_PROVIDER_H_
7 
8 #include <istream>
9 #include <memory>
10 
11 #include "base/macros.h"
12 #include "base/memory/singleton.h"
13 #include "base/synchronization/lock.h"
14 #include "base/threading/platform_thread.h"
15 #include "base/trace_event/memory_dump_provider.h"
16 #include "build/build_config.h"
17 
18 #if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_WIN) || \
19     (defined(OS_MACOSX) && !defined(OS_IOS))
20 #define MALLOC_MEMORY_TRACING_SUPPORTED
21 #endif
22 
23 namespace base {
24 namespace trace_event {
25 
26 class AllocationRegister;
27 
28 // Dump provider which collects process-wide memory stats.
29 class BASE_EXPORT MallocDumpProvider : public MemoryDumpProvider {
30  public:
31   // Name of the allocated_objects dump. Use this to declare suballocator dumps
32   // from other dump providers.
33   static const char kAllocatedObjects[];
34 
35   static MallocDumpProvider* GetInstance();
36 
37   // MemoryDumpProvider implementation.
38   bool OnMemoryDump(const MemoryDumpArgs& args,
39                     ProcessMemoryDump* pmd) override;
40 
41   void OnHeapProfilingEnabled(bool enabled) override;
42 
43   // For heap profiling.
44   void InsertAllocation(void* address, size_t size);
45   void RemoveAllocation(void* address);
46 
47  private:
48   friend struct DefaultSingletonTraits<MallocDumpProvider>;
49 
50   MallocDumpProvider();
51   ~MallocDumpProvider() override;
52 
53   // For heap profiling.
54   bool heap_profiler_enabled_;
55   std::unique_ptr<AllocationRegister> allocation_register_;
56   Lock allocation_register_lock_;
57 
58   // When in OnMemoryDump(), this contains the current thread ID.
59   // This is to prevent re-entrancy in the heap profiler when the heap dump
60   // generation is malloc/new-ing for its own bookeeping data structures.
61   PlatformThreadId tid_dumping_heap_;
62 
63   DISALLOW_COPY_AND_ASSIGN(MallocDumpProvider);
64 };
65 
66 }  // namespace trace_event
67 }  // namespace base
68 
69 #endif  // BASE_TRACE_EVENT_MALLOC_DUMP_PROVIDER_H_
70