MCPcopy Create free account
hub / github.com/ElementsProject/elements / free

Method free

src/support/lockedpool.cpp:95–131  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

93}
94
95void Arena::free(void *ptr)
96{
97 // Freeing the nullptr pointer is OK.
98 if (ptr == nullptr) {
99 return;
100 }
101
102 // Remove chunk from used map
103 auto i = chunks_used.find(static_cast<char*>(ptr));
104 if (i == chunks_used.end()) {
105 throw std::runtime_error("Arena: invalid or double free");
106 }
107 std::pair<char*, size_t> freed = *i;
108 chunks_used.erase(i);
109
110 // coalesce freed with previous chunk
111 auto prev = chunks_free_end.find(freed.first);
112 if (prev != chunks_free_end.end()) {
113 freed.first -= prev->second->first;
114 freed.second += prev->second->first;
115 size_to_free_chunk.erase(prev->second);
116 chunks_free_end.erase(prev);
117 }
118
119 // coalesce freed with chunk after freed
120 auto next = chunks_free.find(freed.first + freed.second);
121 if (next != chunks_free.end()) {
122 freed.second += next->second->first;
123 size_to_free_chunk.erase(next->second);
124 chunks_free.erase(next);
125 }
126
127 // Add/set space with coalesced free chunk
128 auto it = size_to_free_chunk.emplace(freed.second, freed.first);
129 chunks_free[freed.first] = it;
130 chunks_free_end[freed.first + freed.second] = it;
131}
132
133Arena::Stats Arena::stats() const
134{

Callers 3

BOOST_AUTO_TEST_CASEFunction · 0.80
BenchLockedPoolFunction · 0.80
deallocateMethod · 0.80

Calls 4

findMethod · 0.80
addressInArenaMethod · 0.80
endMethod · 0.45
eraseMethod · 0.45

Tested by 1

BOOST_AUTO_TEST_CASEFunction · 0.64