create a macro RCL_CHECK_ALLOCATOR to check the required methods are set on the allocator

Move to using RCUTILS macros under the hood.

Use new macro for instances of allocator check
This commit is contained in:
Tully Foote 2017-11-09 14:52:56 -08:00
parent 9aec08caba
commit 091d58858a
12 changed files with 22 additions and 71 deletions

View file

@ -28,6 +28,12 @@ typedef rcutils_allocator_t rcl_allocator_t;
#define rcl_reallocf rcutils_reallocf
#define RCL_CHECK_ALLOCATOR(allocator, fail_statement) \
RCUTILS_CHECK_ALLOCATOR(allocator, fail_statement)
#define RCL_CHECK_ALLOCATOR_WITH_MSG(allocator, msg, fail_statement) \
RCUTILS_CHECK_ALLOCATOR_WITH_MSG(allocator, msg, fail_statement)
#if __cplusplus
}
#endif

View file

@ -37,6 +37,12 @@ typedef rcutils_error_state_t rcl_error_state_t;
#define rcl_set_error_state rcutils_set_error_state
#define RCL_CHECK_ARGUMENT_FOR_NULL(argument, error_return_type, allocator) \
RCUTILS_CHECK_ARGUMENT_FOR_NULL(argument, error_return_type, allocator)
#define RCL_CHECK_FOR_NULL_WITH_MSG(value, msg, error_statement, allocator) \
RCUTILS_CHECK_FOR_NULL_WITH_MSG(value, msg, error_statement, allocator)
#define RCL_SET_ERROR_MSG(msg, allocator) RCUTILS_SET_ERROR_MSG(msg, allocator)
#define rcl_error_is_set rcutils_error_is_set

View file

@ -58,13 +58,7 @@ rcl_client_init(
// check the options and allocator first, so the allocator can be passed to errors
RCL_CHECK_ARGUMENT_FOR_NULL(options, RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
const rcl_allocator_t * allocator = &options->allocator;
RCL_CHECK_FOR_NULL_WITH_MSG(
allocator->allocate, "allocate not set",
return RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
RCL_CHECK_FOR_NULL_WITH_MSG(
allocator->deallocate, "deallocate not set",
return RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
RCL_CHECK_ALLOCATOR_WITH_MSG(allocator, "invalid allocator", return RCL_RET_INVALID_ARGUMENT);
RCL_CHECK_ARGUMENT_FOR_NULL(client, RCL_RET_INVALID_ARGUMENT, *allocator);
RCL_CHECK_ARGUMENT_FOR_NULL(node, RCL_RET_INVALID_ARGUMENT, *allocator);
if (!node->impl) {

View file

@ -23,16 +23,6 @@ extern "C"
#include "rcl/error_handling.h"
#include "rcl/types.h"
#define RCL_CHECK_ARGUMENT_FOR_NULL(argument, error_return_type, allocator) \
RCL_CHECK_FOR_NULL_WITH_MSG(argument, #argument " argument is null", \
return error_return_type, allocator)
#define RCL_CHECK_FOR_NULL_WITH_MSG(value, msg, error_statement, allocator) \
if (!(value)) { \
RCL_SET_ERROR_MSG(msg, allocator); \
error_statement; \
}
/// Retrieve the value of the given environment variable if it exists, or "".
/* The returned cstring is only valid until the next time this function is
* called, because it is a direct pointer to the static storage.

View file

@ -48,12 +48,7 @@ __rcl_guard_condition_init_from_rmw_impl(
// Perform argument validation.
const rcl_allocator_t * allocator = &options.allocator;
RCL_CHECK_FOR_NULL_WITH_MSG(
allocator->allocate, "allocate not set",
return RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
RCL_CHECK_FOR_NULL_WITH_MSG(
allocator->deallocate, "deallocate not set",
return RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
RCL_CHECK_ALLOCATOR_WITH_MSG(allocator, "invalid allocator", return RCL_RET_INVALID_ARGUMENT);
RCL_CHECK_ARGUMENT_FOR_NULL(guard_condition, RCL_RET_INVALID_ARGUMENT, *allocator);
// Ensure the guard_condition handle is zero initialized.
if (guard_condition->impl) {

View file

@ -102,12 +102,7 @@ rcl_node_init(
// Check options and allocator first, so allocator can be used for errors.
RCL_CHECK_ARGUMENT_FOR_NULL(options, RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
const rcl_allocator_t * allocator = &options->allocator;
RCL_CHECK_FOR_NULL_WITH_MSG(
allocator->allocate, "allocate not set",
return RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
RCL_CHECK_FOR_NULL_WITH_MSG(
allocator->deallocate, "deallocate not set",
return RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
RCL_CHECK_ALLOCATOR_WITH_MSG(allocator, "invalid allocator", return RCL_RET_INVALID_ARGUMENT);
RCL_CHECK_ARGUMENT_FOR_NULL(name, RCL_RET_INVALID_ARGUMENT, *allocator);
RCL_CHECK_ARGUMENT_FOR_NULL(namespace_, RCL_RET_INVALID_ARGUMENT, *allocator);

View file

@ -23,6 +23,7 @@ extern "C"
#include <string.h>
#include "./common.h"
#include "rcl/allocator.h"
#include "rcl/expand_topic_name.h"
#include "rcutils/logging_macros.h"
#include "rmw/error_handling.h"
@ -55,12 +56,7 @@ rcl_publisher_init(
// Check options and allocator first, so allocator can be used with errors.
RCL_CHECK_ARGUMENT_FOR_NULL(options, RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
const rcl_allocator_t * allocator = &options->allocator;
RCL_CHECK_FOR_NULL_WITH_MSG(
allocator->allocate, "allocate not set",
return RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
RCL_CHECK_FOR_NULL_WITH_MSG(
allocator->deallocate, "deallocate not set",
return RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
RCL_CHECK_ALLOCATOR_WITH_MSG(allocator, "invalid allocator", return RCL_RET_INVALID_ARGUMENT);
RCL_CHECK_ARGUMENT_FOR_NULL(publisher, RCL_RET_INVALID_ARGUMENT, *allocator);
if (publisher->impl) {

View file

@ -59,14 +59,7 @@ rcl_init(int argc, char ** argv, rcl_allocator_t allocator)
rcl_ret_t fail_ret = RCL_RET_ERROR;
// Check allocator first, so it can be used in other errors.
RCL_CHECK_FOR_NULL_WITH_MSG(
allocator.allocate,
"invalid allocator, allocate not set",
return RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
RCL_CHECK_FOR_NULL_WITH_MSG(
allocator.deallocate,
"invalid allocator, deallocate not set",
return RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
RCL_CHECK_ALLOCATOR_WITH_MSG(&allocator, "invalid allocator", return RCL_RET_INVALID_ARGUMENT);
if (argc > 0) {
RCL_CHECK_ARGUMENT_FOR_NULL(argv, RCL_RET_INVALID_ARGUMENT, allocator);

View file

@ -55,12 +55,7 @@ rcl_service_init(
// Check options and allocator first, so the allocator can be used in errors.
RCL_CHECK_ARGUMENT_FOR_NULL(options, RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
const rcl_allocator_t * allocator = &options->allocator;
RCL_CHECK_FOR_NULL_WITH_MSG(
allocator->allocate, "allocate not set",
return RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
RCL_CHECK_FOR_NULL_WITH_MSG(
allocator->deallocate, "deallocate not set",
return RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
RCL_CHECK_ALLOCATOR_WITH_MSG(allocator, "invalid allocator", return RCL_RET_INVALID_ARGUMENT);
RCL_CHECK_ARGUMENT_FOR_NULL(service, RCL_RET_INVALID_ARGUMENT, *allocator);
RCL_CHECK_ARGUMENT_FOR_NULL(node, RCL_RET_INVALID_ARGUMENT, *allocator);

View file

@ -54,12 +54,7 @@ rcl_subscription_init(
// Check options and allocator first, so the allocator can be used in errors.
RCL_CHECK_ARGUMENT_FOR_NULL(options, RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
const rcl_allocator_t * allocator = &options->allocator;
RCL_CHECK_FOR_NULL_WITH_MSG(
allocator->allocate, "allocate not set",
return RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
RCL_CHECK_FOR_NULL_WITH_MSG(
allocator->deallocate, "deallocate not set",
return RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
RCL_CHECK_ALLOCATOR_WITH_MSG(allocator, "invalid allocator", return RCL_RET_INVALID_ARGUMENT);
RCL_CHECK_ARGUMENT_FOR_NULL(subscription, RCL_RET_INVALID_ARGUMENT, *allocator);
RCL_CHECK_ARGUMENT_FOR_NULL(node, RCL_RET_INVALID_ARGUMENT, *allocator);

View file

@ -51,12 +51,7 @@ rcl_timer_init(
const rcl_timer_callback_t callback,
rcl_allocator_t allocator)
{
RCL_CHECK_FOR_NULL_WITH_MSG(
allocator.allocate, "allocate not set",
return RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
RCL_CHECK_FOR_NULL_WITH_MSG(
allocator.deallocate, "deallocate not set",
return RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
RCL_CHECK_ALLOCATOR_WITH_MSG(&allocator, "invalid allocator", return RCL_RET_INVALID_ARGUMENT);
RCL_CHECK_ARGUMENT_FOR_NULL(timer, RCL_RET_INVALID_ARGUMENT, allocator);
if (timer->impl) {
RCL_SET_ERROR_MSG("timer already initailized, or memory was uninitialized", allocator);

View file

@ -116,16 +116,7 @@ rcl_wait_set_init(
{
rcl_ret_t fail_ret = RCL_RET_ERROR;
RCL_CHECK_FOR_NULL_WITH_MSG(
allocator.allocate, "allocate not set",
return RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
RCL_CHECK_FOR_NULL_WITH_MSG(
allocator.deallocate, "deallocate not set",
return RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
RCL_CHECK_FOR_NULL_WITH_MSG(
allocator.reallocate, "reallocate not set",
return RCL_RET_INVALID_ARGUMENT, rcl_get_default_allocator());
RCL_CHECK_ALLOCATOR_WITH_MSG(&allocator, "invalid allocator", return RCL_RET_INVALID_ARGUMENT);
RCL_CHECK_ARGUMENT_FOR_NULL(wait_set, RCL_RET_INVALID_ARGUMENT, allocator);
if (__wait_set_is_valid(wait_set)) {
RCL_SET_ERROR_MSG("wait_set already initialized, or memory was uninitialized.", allocator);