Cthulhu  0.2.10
Cthulhu compiler collection
arena.hpp
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-3.0-only
2 #pragma once
3 
4 #include "editor/arena.hpp"
5 #include "editor/memory.hpp"
6 
7 #include <unordered_set>
8 #include <vector>
9 #include <stacktrace>
10 
11 struct AllocInfo
12 {
13  size_t id;
15  std::chrono::steady_clock::time_point timestamp;
16  size_t trace;
17 
18  std::string name;
19  const void *parent;
20 };
21 
22 class TraceArena final : public IArena
23 {
24 public:
25  using AllocMap = std::map<const void*, AllocInfo>;
26  using AllocTree = std::map<const void*, std::vector<const void*>>;
27  using AllocMapIter = AllocMap::iterator;
28 
29  // IArena
30  void *malloc(size_t size) override;
31  void *realloc(void *ptr, size_t new_size, size_t size) override;
32  void free(void *ptr, size_t size) override;
33 
34  void rename(const void *ptr, const char *new_name) override;
35  void reparent(const void *ptr, const void *parent) override;
36 
37  // number of calls to each function
38  size_t malloc_calls = 0;
39  size_t realloc_calls = 0;
40  size_t free_calls = 0;
41 
42  // usage stats in bytes
45 
46  // all currently live allocations
47  std::unordered_set<void *> live_allocs;
48 
49  // TODO: this is a little silly, but its an easy way to avoid having to
50  // deal with iterator invalidation
51  std::unordered_map<size_t, std::stacktrace> stacktraces;
52 
53  size_t add_stacktrace(const std::stacktrace& trace);
54 
55  int collect;
56 
57  // all allocations
59 
60  // tree of allocations
62 
63  // allocation tracking
64  void create_alloc(void *ptr, size_t size);
65  void delete_alloc(void *ptr);
66 
67  void update_parent(const void *ptr, const void *parent);
68  void update_name(const void *ptr, const char *new_name);
69  void remove_parents(const void *ptr);
70 
71  // internal queries
72  bool has_children(const void *ptr) const;
73  bool has_parent(const void *ptr) const;
74  bool is_external(const void *ptr) const;
75 
76 public:
77  enum Collect
78  {
80 
83  };
84 
85  TraceArena(const char *id, Collect collect);
86 
87  // TraceArena
88  void reset();
89 };
90 
92 {
93  TraceArena& arena;
94  int mode;
95 
96  // tree drawing
97  void draw_backtrace(const std::stacktrace& trace) const;
98  void draw_name(const AllocInfo& info) const;
99  void draw_extern_name(const void *ptr) const;
100  void draw_tree_child(const void *ptr, const AllocInfo& info) const;
101  void draw_tree_group(const void *ptr, const AllocInfo& info) const;
102  void draw_tree_node_info(const void *ptr, const AllocInfo& info) const;
103  void draw_tree_node(const void *ptr) const;
104  void draw_tree() const;
105 
106  // flat output
107  void draw_flat() const;
108 
109 public:
111  enum draw_mode_t : int
112  {
115 
118  };
119 
120  TraceArenaWidget(TraceArena& arena, int mode)
121  : arena(arena)
122  , mode(mode)
123  { }
124 
125  bool visible = false;
126 
127  const char *get_title() const { return arena.get_name(); }
128 
129  void draw();
130  bool draw_window();
131 };
Definition: arena.hpp:11
const char * get_name() const
Definition: arena.hpp:27
TraceArenaWidget(TraceArena &arena, int mode)
Definition: arena.hpp:120
bool draw_window()
Definition: arena.cpp:555
draw_mode_t
the draw mode for the gui view of this allocator
Definition: arena.hpp:112
@ eDrawFlat
draw the allocations as a flat list
Definition: arena.hpp:117
@ eDrawTree
draw the allocations as a tree using parent data
Definition: arena.hpp:114
const char * get_title() const
Definition: arena.hpp:127
void update_parent(const void *ptr, const void *parent)
Definition: arena.cpp:151
bool has_parent(const void *ptr) const
Definition: arena.cpp:230
void * malloc(size_t size) override
Definition: arena.cpp:56
size_t malloc_calls
Definition: arena.hpp:38
int collect
Definition: arena.hpp:55
void create_alloc(void *ptr, size_t size)
Definition: arena.cpp:123
void remove_parents(const void *ptr)
Definition: arena.cpp:204
std::map< const void *, AllocInfo > AllocMap
Definition: arena.hpp:25
void reset()
Definition: arena.cpp:102
size_t add_stacktrace(const std::stacktrace &trace)
Definition: arena.cpp:115
std::unordered_map< size_t, std::stacktrace > stacktraces
Definition: arena.hpp:51
size_t free_calls
Definition: arena.hpp:40
void delete_alloc(void *ptr)
Definition: arena.cpp:139
AllocMap allocs
Definition: arena.hpp:58
std::unordered_set< void * > live_allocs
Definition: arena.hpp:47
AllocMap::iterator AllocMapIter
Definition: arena.hpp:27
void reparent(const void *ptr, const void *parent) override
Definition: arena.cpp:97
void * realloc(void *ptr, size_t new_size, size_t size) override
Definition: arena.cpp:67
std::map< const void *, std::vector< const void * > > AllocTree
Definition: arena.hpp:26
Memory live_memory_usage
Definition: arena.hpp:44
Memory peak_memory_usage
Definition: arena.hpp:43
void rename(const void *ptr, const char *new_name) override
Definition: arena.cpp:92
void update_name(const void *ptr, const char *new_name)
Definition: arena.cpp:199
TraceArena(const char *id, Collect collect)
Definition: arena.cpp:51
AllocTree tree
Definition: arena.hpp:61
void free(void *ptr, size_t size) override
Definition: arena.cpp:83
bool has_children(const void *ptr) const
Definition: arena.cpp:220
size_t realloc_calls
Definition: arena.hpp:39
bool is_external(const void *ptr) const
check if the given pointer was not allocated by this allocator
Definition: arena.cpp:245
@ eCollectNone
Definition: arena.hpp:79
@ eCollectStackTrace
Definition: arena.hpp:81
@ eCollectTimeStamps
Definition: arena.hpp:82
CT_NODISCARD size_t size
Definition: scan.h:128
size_t id
the id of the allocation
Definition: arena.hpp:13
std::string name
the name of the allocation
Definition: arena.hpp:18
size_t trace
hash of the stack trace
Definition: arena.hpp:16
std::chrono::steady_clock::time_point timestamp
the time of the allocation
Definition: arena.hpp:15
Memory size
the size of the allocation
Definition: arena.hpp:14
const void * parent
the parent of the allocation
Definition: arena.hpp:19
Definition: memory.hpp:5