Skip to content

Commit

Permalink
Override get_rcl_allocator for TLSF allocators.
Browse files Browse the repository at this point in the history
This removes one more user of the broken generic version of
get_rcl_allocator, which is causing
ros2/rclcpp#1254.
  • Loading branch information
stevewolter committed Sep 23, 2020
1 parent a4f7ffe commit 433f939
Showing 1 changed file with 31 additions and 0 deletions.
31 changes: 31 additions & 0 deletions tlsf_cpp/include/tlsf_cpp/tlsf.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,16 @@
#include <new>
#include <stdexcept>

#include "rcl/allocator.h"
#include "rclcpp/allocator/allocator_common.hpp"
#include "tlsf/tlsf.h"

template<typename T, size_t DefaultPoolSize = 1024 * 1024>
struct tlsf_heap_allocator
{
// Needed for std::allocator_traits
using value_type = T;
static const bool is_tlsf_heap_allocator = true;

explicit tlsf_heap_allocator(size_t size)
: memory_pool(nullptr), pool_size(size)
Expand Down Expand Up @@ -137,4 +140,32 @@ constexpr bool operator!=(
return a.memory_pool != b.memory_pool;
}

void* tlsf_rcl_allocate(size_t size, void*) {
return tlsf_malloc(size);
}

void tlsf_rcl_deallocate(void* pointer, void*) {
tlsf_free(pointer);
}

void* tlsf_reallocate(void* pointer, size_t size, void*) {
return tlsf_rcl_realloc(pointer, size);
}

void* tlsf_zero_allocate(size_t number_of_elements, size_t size_of_elements, void*) {
return tlsf_rcl_calloc(number_of_elements, size_of_elements);
}

template<typename T, size_t PoolSize>
rcl_allocator_t get_rcl_allocator(tlsf_heap_allocator<T, PoolSize>& allocator)
{
rcl_allocator_t rcl_allocator;
rcl_allocator.allocate = tlsf_allocate;
rcl_allocator.deallocate = tlsf_deallocate;
rcl_allocator.reallocate = tlsf_reallocate;
rcl_allocator.zero_allocate = tlsf_zero_allocate;
rcl_allocator.state = &allocator;
return rcl_allocator;
}

#endif // TLSF_CPP__TLSF_HPP_

0 comments on commit 433f939

Please sign in to comment.