23
23
#include < new>
24
24
#include < stdexcept>
25
25
26
+ #include " rcl/allocator.h"
27
+ #include " rclcpp/allocator/allocator_common.hpp"
26
28
#include " tlsf/tlsf.h"
27
29
28
30
template <typename T, size_t DefaultPoolSize = 1024 * 1024 >
@@ -61,19 +63,21 @@ struct tlsf_heap_allocator
61
63
{
62
64
pool_size = size;
63
65
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
+ });
67
75
}
68
76
return pool_size;
69
77
}
70
78
71
79
~tlsf_heap_allocator ()
72
80
{
73
- if (memory_pool) {
74
- destroy_memory_pool (memory_pool);
75
- memory_pool = nullptr ;
76
- }
77
81
}
78
82
79
83
// Needed for std::allocator_traits
@@ -98,7 +102,7 @@ struct tlsf_heap_allocator
98
102
typedef tlsf_heap_allocator<U> other;
99
103
};
100
104
101
- char * memory_pool;
105
+ std::shared_ptr< char *> memory_pool;
102
106
size_t pool_size;
103
107
};
104
108
@@ -137,4 +141,23 @@ constexpr bool operator!=(
137
141
return a.memory_pool != b.memory_pool ;
138
142
}
139
143
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
+
140
163
#endif // TLSF_CPP__TLSF_HPP_
0 commit comments