Skip to content

Commit fbb0d91

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.
1 parent a4f7ffe commit fbb0d91

File tree

1 file changed

+23
-0
lines changed

1 file changed

+23
-0
lines changed

tlsf_cpp/include/tlsf_cpp/tlsf.hpp

+23
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,16 @@
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>
2931
struct tlsf_heap_allocator
3032
{
3133
// Needed for std::allocator_traits
3234
using value_type = T;
35+
static const bool is_tlsf_heap_allocator = true;
3336

3437
explicit tlsf_heap_allocator(size_t size)
3538
: memory_pool(nullptr), pool_size(size)
@@ -137,4 +140,24 @@ constexpr bool operator!=(
137140
return a.memory_pool != b.memory_pool;
138141
}
139142

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

0 commit comments

Comments
 (0)