1 | // mycpp/bump_leak_heap.h: Leaky Bump Allocator
|
2 |
|
3 | #ifndef MYCPP_BUMP_LEAK_HEAP_H
|
4 | #define MYCPP_BUMP_LEAK_HEAP_H
|
5 |
|
6 | #include <stdint.h> // int64_t
|
7 |
|
8 | #ifdef BUMP_ROOT
|
9 | #include <algorithm> // max()
|
10 | #include <vector>
|
11 | #endif
|
12 |
|
13 | #include "mycpp/common.h"
|
14 | #include "mycpp/gc_obj.h"
|
15 |
|
16 | class BumpLeakHeap {
|
17 | public:
|
18 | // reserve 32 frames to start
|
19 | BumpLeakHeap() {
|
20 | }
|
21 |
|
22 | void Init() {
|
23 | }
|
24 | void Init(int gc_threshold) {
|
25 | }
|
26 |
|
27 | // the BumpLeakHeap doesn't need rooting, but provide the option to
|
28 | // approximate its costs.
|
29 | void PushRoot(RawObject** p) {
|
30 | #ifdef BUMP_ROOT
|
31 | roots_.push_back(p);
|
32 | #endif
|
33 | }
|
34 | void PopRoot() {
|
35 | #ifdef BUMP_ROOT
|
36 | roots_.pop_back();
|
37 | #endif
|
38 | }
|
39 |
|
40 | void RootGlobalVar(void* root) {
|
41 | }
|
42 |
|
43 | void* Allocate(size_t num_bytes);
|
44 | void* Reallocate(void* p, size_t num_bytes);
|
45 | int MaybeCollect() {
|
46 | #ifdef BUMP_ROOT
|
47 | // Do some computation with the roots
|
48 | max_roots_ = std::max(max_roots_, static_cast<int>(roots_.size()));
|
49 | #endif
|
50 | return -1; // no collection attempted
|
51 | }
|
52 |
|
53 | void PrintStats(int fd);
|
54 |
|
55 | void CleanProcessExit();
|
56 | void ProcessExit();
|
57 |
|
58 | bool is_initialized_ = true; // mark/sweep doesn't need to be initialized
|
59 |
|
60 | // In number of live objects, since we aren't keeping track of total bytes
|
61 | int gc_threshold_;
|
62 | int mem_pos_ = 0;
|
63 |
|
64 | // Cumulative stats
|
65 | int num_allocated_ = 0;
|
66 | int64_t bytes_allocated_ = 0; // avoid overflow
|
67 |
|
68 | #ifdef BUMP_ROOT
|
69 | std::vector<RawObject**> roots_;
|
70 | int max_roots_ = 0;
|
71 | #endif
|
72 | };
|
73 |
|
74 | #ifdef BUMP_LEAK
|
75 | extern BumpLeakHeap gHeap;
|
76 | #endif
|
77 |
|
78 | #endif // MYCPP_BUMP_LEAK_HEAP_H
|