Skip to content

Commit

Permalink
canard: use malloc and placement new instead of new
Browse files Browse the repository at this point in the history
  • Loading branch information
bugobliterator authored and tridge committed Apr 28, 2023
1 parent 47bcecb commit d014d0b
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 20 deletions.
6 changes: 3 additions & 3 deletions canard/callbacks.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class StaticCallback : public Callback<msgtype> {
/// @return StaticCallback object
template <typename msgtype>
StaticCallback<msgtype> *allocate_static_callback(void (*cb)(const CanardRxTransfer& transfer, const msgtype& msg)) {
return (new StaticCallback<msgtype>(cb));
return allocate<StaticCallback<msgtype>>(cb);
}

/// @brief Object callback class.
Expand Down Expand Up @@ -87,7 +87,7 @@ class ObjCallback : public Callback<msgtype> {
/// @return ObjCallback object
template <typename T, typename msgtype>
ObjCallback<T, msgtype>* allocate_obj_callback(T* obj, void (T::*cb)(const CanardRxTransfer& transfer, const msgtype& msg)) {
return (new ObjCallback<T, msgtype>(obj, cb));
return allocate<ObjCallback<T, msgtype>>(obj, cb);
}

/// @brief Argument callback class.
Expand Down Expand Up @@ -117,7 +117,7 @@ class ArgCallback : public Callback<msgtype> {
/// @return ArgCallback object
template <typename T, typename msgtype>
ArgCallback<T, msgtype>* allocate_arg_callback(T* arg, void (*cb)(T* arg, const CanardRxTransfer& transfer, const msgtype& msg)) {
return (new ArgCallback<T, msgtype>(arg, cb));
return allocate<ArgCallback<T, msgtype>>(arg, cb);
}

} // namespace Canard
31 changes: 31 additions & 0 deletions canard/helpers.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,38 @@
#pragma once

#ifdef USE_USER_HELPERS
#include "canard_helpers_user.h"
#endif

#ifndef NOINLINE_FUNC
#define NOINLINE_FUNC __attribute__((noinline))
#endif

// define malloc and free
#ifndef CANARD_MALLOC
#include <stdlib.h>
#include <new>
#define CANARD_MALLOC malloc
#define CANARD_FREE free
#endif

namespace Canard {
template<typename T, typename ...Args>
T* allocate(Args...args) {
auto ret = CANARD_MALLOC(sizeof(T));
if (ret == nullptr) {
return nullptr;
}
return new(ret) T(args...);
}

template<typename T>
void deallocate(T* ptr) {
if (ptr == nullptr) {
return;
}
ptr->~T();
CANARD_FREE(ptr);
}

}
6 changes: 3 additions & 3 deletions canard/subscriber.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ class SubscriberArgCb {
/// @return SubscriberArgCb object
template <typename T, typename msgtype>
SubscriberArgCb<T, msgtype>* allocate_sub_arg_callback(T* _arg, void (*_cb)(T* arg, const CanardRxTransfer& transfer, const msgtype& msg), uint8_t index) {
return (new SubscriberArgCb<T, msgtype>(_arg, _cb, index));
return allocate<SubscriberArgCb<T, msgtype>>(_arg, _cb, index);
}

template <typename msgtype>
Expand All @@ -131,7 +131,7 @@ class SubscriberStaticCb {
/// @return SubscriberStaticCb object
template <typename msgtype>
SubscriberStaticCb<msgtype>* allocate_sub_static_callback(void (*cb)(const CanardRxTransfer&, const msgtype&), uint8_t index) {
return (new SubscriberStaticCb<msgtype>(cb, index));
return allocate<SubscriberStaticCb<msgtype>>(cb, index);
}

template <typename T, typename msgtype>
Expand All @@ -153,7 +153,7 @@ class SubscriberObjCb {
/// @return SubscriberObjCb object
template <typename T, typename msgtype>
SubscriberObjCb<T, msgtype>* allocate_sub_obj_callback(T* obj, void (T::*cb)(const CanardRxTransfer& transfer, const msgtype& msg), uint8_t index) {
return (new SubscriberObjCb<T, msgtype>(obj, cb, index));
return allocate<SubscriberObjCb<T, msgtype>>(obj, cb, index);
}

} // namespace Canard
4 changes: 2 additions & 2 deletions canard/tests/test_canard_interface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,8 @@ TEST(StaticCanardTest, test_publish_subscribe) {
// check if message was received
ASSERT_TRUE(called_handle_node_status);

delete static_cb0;
delete static_cb1;
deallocate(static_cb0);
deallocate(static_cb1);
CANARD_TEST_INTERFACE(0).free();
CANARD_TEST_INTERFACE(1).free();
}
Expand Down
15 changes: 7 additions & 8 deletions canard/tests/test_cxx_wrappers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,8 @@ TEST(StaticCoreTest, test_publish_subscribe) {
// check if message was received
ASSERT_TRUE(called_handle_node_status);

delete handle_node_status_cb_1;
delete handle_node_status_cb_2;
deallocate(handle_node_status_cb_1);
deallocate(handle_node_status_cb_2);
}

// test multiple subscribers
Expand All @@ -74,7 +74,7 @@ class TestSubscriber0 {
handle_node_status_cb = Canard::allocate_sub_obj_callback(this, &StaticCoreTest::TestSubscriber0::handle_node_status, 0);
}
~TestSubscriber0() {
delete handle_node_status_cb;
deallocate(handle_node_status_cb);
}
void handle_node_status(const CanardRxTransfer &transfer, const uavcan_protocol_NodeStatus &msg);
static int call_counts;
Expand All @@ -100,7 +100,7 @@ class TestSubscriber1 {
handle_node_status_cb = Canard::allocate_sub_obj_callback(this, &StaticCoreTest::TestSubscriber1::handle_node_status, 1);
}
~TestSubscriber1() {
delete handle_node_status_cb;
deallocate(handle_node_status_cb);
}
void handle_node_status(const CanardRxTransfer &transfer, const uavcan_protocol_NodeStatus &msg) {
called_handle_node_status = true;
Expand Down Expand Up @@ -177,7 +177,7 @@ class StaticCallbackWrapper {
cb = Canard::allocate_static_callback(_cb);
}
~StaticCallbackWrapper() {
delete cb;
deallocate(cb);
}
Canard::StaticCallback<msgtype> *cb;
};
Expand Down Expand Up @@ -250,9 +250,8 @@ TEST(StaticCoreTest, test_service) {
ASSERT_TRUE(get_node_info_client1.request(1, req));
// check if response was received
ASSERT_TRUE(handle_get_node_info_response_called);
// free memory
delete static_cb0;
delete static_cb1;
deallocate(static_cb0);
deallocate(static_cb1);
CXX_TEST_INTERFACE(0).free();
CXX_TEST_INTERFACE(1).free();
}
Expand Down
8 changes: 4 additions & 4 deletions canard/transfer_object.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ class TransferObject {
uint32_t _transfer_desc = MAKE_TRANSFER_DESCRIPTOR(data_type_id, transfer_type, src_node_id, dst_node_id);
// check head
if (tid_map_head[index] == nullptr) {
tid_map_head[index] = new TransferObject(_transfer_desc);
if (tid_map_head[index] == nullptr) {
tid_map_head[index] = allocate<TransferObject>(_transfer_desc);
if (tid_map_head[index] == nullptr) {
return nullptr;
}
return &tid_map_head[index]->tid;
Expand All @@ -66,7 +66,7 @@ class TransferObject {
}

// create a new entry, if not found
tid_map_ptr->next = new TransferObject(_transfer_desc);
tid_map_ptr->next = allocate<TransferObject>(_transfer_desc);
if (tid_map_ptr->next == nullptr) {
return nullptr;
}
Expand All @@ -83,7 +83,7 @@ class TransferObject {
TransferObject *tid_map_ptr = tid_map_head[index];
while(tid_map_ptr) {
TransferObject *next = tid_map_ptr->next;
delete tid_map_ptr;
deallocate(tid_map_ptr);
tid_map_ptr = next;
}
tid_map_head[index] = nullptr;
Expand Down

0 comments on commit d014d0b

Please sign in to comment.