diff options
Diffstat (limited to 'libbacktrace/include/backtrace/BacktraceMap.h')
-rw-r--r-- | libbacktrace/include/backtrace/BacktraceMap.h | 54 |
1 files changed, 46 insertions, 8 deletions
diff --git a/libbacktrace/include/backtrace/BacktraceMap.h b/libbacktrace/include/backtrace/BacktraceMap.h index d0783929a..4ae68dde0 100644 --- a/libbacktrace/include/backtrace/BacktraceMap.h +++ b/libbacktrace/include/backtrace/BacktraceMap.h | |||
@@ -30,6 +30,7 @@ | |||
30 | #endif | 30 | #endif |
31 | 31 | ||
32 | #include <deque> | 32 | #include <deque> |
33 | #include <iterator> | ||
33 | #include <string> | 34 | #include <string> |
34 | #include <vector> | 35 | #include <vector> |
35 | 36 | ||
@@ -61,6 +62,49 @@ public: | |||
61 | 62 | ||
62 | virtual ~BacktraceMap(); | 63 | virtual ~BacktraceMap(); |
63 | 64 | ||
65 | class iterator : public std::iterator<std::bidirectional_iterator_tag, backtrace_map_t*> { | ||
66 | public: | ||
67 | iterator(BacktraceMap* map, size_t index) : map_(map), index_(index) {} | ||
68 | |||
69 | iterator& operator++() { | ||
70 | index_++; | ||
71 | return *this; | ||
72 | } | ||
73 | iterator& operator++(int increment) { | ||
74 | index_ += increment; | ||
75 | return *this; | ||
76 | } | ||
77 | iterator& operator--() { | ||
78 | index_--; | ||
79 | return *this; | ||
80 | } | ||
81 | iterator& operator--(int decrement) { | ||
82 | index_ -= decrement; | ||
83 | return *this; | ||
84 | } | ||
85 | |||
86 | bool operator==(const iterator& rhs) { return this->index_ == rhs.index_; } | ||
87 | bool operator!=(const iterator& rhs) { return this->index_ != rhs.index_; } | ||
88 | |||
89 | const backtrace_map_t* operator*() { | ||
90 | if (index_ >= map_->size()) { | ||
91 | return nullptr; | ||
92 | } | ||
93 | backtrace_map_t* map = &map_->maps_[index_]; | ||
94 | if (map->load_bias == static_cast<uintptr_t>(-1)) { | ||
95 | map->load_bias = map_->GetLoadBias(index_); | ||
96 | } | ||
97 | return map; | ||
98 | } | ||
99 | |||
100 | private: | ||
101 | BacktraceMap* map_ = nullptr; | ||
102 | size_t index_ = 0; | ||
103 | }; | ||
104 | |||
105 | iterator begin() { return iterator(this, 0); } | ||
106 | iterator end() { return iterator(this, maps_.size()); } | ||
107 | |||
64 | // Fill in the map data structure for the given address. | 108 | // Fill in the map data structure for the given address. |
65 | virtual void FillIn(uintptr_t addr, backtrace_map_t* map); | 109 | virtual void FillIn(uintptr_t addr, backtrace_map_t* map); |
66 | 110 | ||
@@ -89,14 +133,6 @@ public: | |||
89 | virtual void LockIterator() {} | 133 | virtual void LockIterator() {} |
90 | virtual void UnlockIterator() {} | 134 | virtual void UnlockIterator() {} |
91 | 135 | ||
92 | typedef std::deque<backtrace_map_t>::iterator iterator; | ||
93 | iterator begin() { return maps_.begin(); } | ||
94 | iterator end() { return maps_.end(); } | ||
95 | |||
96 | typedef std::deque<backtrace_map_t>::const_iterator const_iterator; | ||
97 | const_iterator begin() const { return maps_.begin(); } | ||
98 | const_iterator end() const { return maps_.end(); } | ||
99 | |||
100 | size_t size() const { return maps_.size(); } | 136 | size_t size() const { return maps_.size(); } |
101 | 137 | ||
102 | virtual bool Build(); | 138 | virtual bool Build(); |
@@ -114,6 +150,8 @@ public: | |||
114 | protected: | 150 | protected: |
115 | BacktraceMap(pid_t pid); | 151 | BacktraceMap(pid_t pid); |
116 | 152 | ||
153 | virtual uint64_t GetLoadBias(size_t /* index */) { return 0; } | ||
154 | |||
117 | virtual bool ParseLine(const char* line, backtrace_map_t* map); | 155 | virtual bool ParseLine(const char* line, backtrace_map_t* map); |
118 | 156 | ||
119 | pid_t pid_; | 157 | pid_t pid_; |