Skip to content

Commit 9346f42

Browse files
committed
Override get_rcl_allocator for TLSF allocators.
This removes one more user of the broken generic version of get_rcl_allocator, which is causing ros2/rclcpp#1254. Signed-off-by: Steve Wolter <[email protected]>
1 parent 805e18f commit 9346f42

File tree

1 file changed

+31
-8
lines changed

1 file changed

+31
-8
lines changed

tlsf_cpp/include/tlsf_cpp/tlsf.hpp

+31-8
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
#include <new>
2424
#include <stdexcept>
2525

26+
#include "rcl/allocator.h"
27+
#include "rclcpp/allocator/allocator_common.hpp"
2628
#include "tlsf/tlsf.h"
2729

2830
template<typename T, size_t DefaultPoolSize = 1024 * 1024>
@@ -61,19 +63,21 @@ struct tlsf_heap_allocator
6163
{
6264
pool_size = size;
6365
if (!memory_pool) {
64-
memory_pool = new char[pool_size];
65-
memset(memory_pool, 0, pool_size);
66-
init_memory_pool(pool_size, memory_pool);
66+
auto memory = new char[pool_size]);
67+
memset(memory, 0, pool_size);
68+
init_memory_pool(pool_size, memory);
69+
memory_pool = std::shared_ptr<char*>(
70+
memory,
71+
[](char* pool) {
72+
destroy_memory_pool(pool);
73+
delete pool;
74+
});
6775
}
6876
return pool_size;
6977
}
7078

7179
~tlsf_heap_allocator()
7280
{
73-
if (memory_pool) {
74-
destroy_memory_pool(memory_pool);
75-
memory_pool = nullptr;
76-
}
7781
}
7882

7983
// Needed for std::allocator_traits
@@ -98,7 +102,7 @@ struct tlsf_heap_allocator
98102
typedef tlsf_heap_allocator<U> other;
99103
};
100104

101-
char * memory_pool;
105+
std::shared_ptr<char *> memory_pool;
102106
size_t pool_size;
103107
};
104108

@@ -137,4 +141,23 @@ constexpr bool operator!=(
137141
return a.memory_pool != b.memory_pool;
138142
}
139143

144+
template<typename T, size_t PoolSize>
145+
rcl_allocator_t get_rcl_allocator(tlsf_heap_allocator<T, PoolSize> allocator)
146+
{
147+
rcl_allocator_t rcl_allocator;
148+
rcl_allocator.allocate = [](size_t size, void*) {
149+
return tlsf_malloc(size);
150+
};
151+
rcl_allocator.deallocate = [](void* pointer, void*) {
152+
return tlsf_free(pointer);
153+
};
154+
rcl_allocator.reallocate = [](void* pointer, size_t size, void*) {
155+
return tlsf_realloc(pointer, size);
156+
};
157+
rcl_allocator.zero_allocate = [](size_t nmemb, size_t size, void*) {
158+
return tlsf_calloc(nmemb, size);
159+
};
160+
return rcl_allocator;
161+
}
162+
140163
#endif // TLSF_CPP__TLSF_HPP_

0 commit comments

Comments
 (0)