[rcl_action] Store allocator used for message initialization in the message struct

This relieves the user from providing the correct allocator when finalizing messages.
This commit is contained in:
Jacob Perron 2018-10-31 17:45:51 -07:00
parent e64fcaf5a8
commit 88eaa3a926
3 changed files with 61 additions and 68 deletions

View file

@ -30,7 +30,7 @@ rcl_action_get_zero_initialized_goal_info(void)
rcl_action_goal_status_array_t
rcl_action_get_zero_initialized_goal_status_array(void)
{
static rcl_action_goal_status_array_t status_array = {{0, 0, 0}};
static rcl_action_goal_status_array_t status_array = {{{0, 0, 0}}, {0, 0, 0, 0, 0}};
return status_array;
}
@ -44,7 +44,7 @@ rcl_action_get_zero_initialized_cancel_request(void)
rcl_action_cancel_response_t
rcl_action_get_zero_initialized_cancel_response(void)
{
static rcl_action_cancel_response_t response = {{0, 0, 0}};
static rcl_action_cancel_response_t response = {{{0, 0, 0}}, {0, 0, 0, 0, 0}};
return response;
}
@ -62,31 +62,30 @@ rcl_action_goal_status_array_init(
return RCL_RET_INVALID_ARGUMENT;
}
// Ensure status array is zero initialized
if (status_array->status_list.size > 0) {
if (status_array->msg.status_list.size > 0) {
RCL_SET_ERROR_MSG("status_array already inititalized");
return RCL_RET_ALREADY_INIT;
}
// Allocate space for status array
status_array->status_list.data = (rcl_action_goal_status_t *) allocator.zero_allocate(
status_array->msg.status_list.data = (rcl_action_goal_status_t *) allocator.zero_allocate(
num_status, sizeof(rcl_action_goal_status_t), allocator.state);
if (!status_array->status_list.data) {
if (!status_array->msg.status_list.data) {
return RCL_RET_BAD_ALLOC;
}
status_array->status_list.size = num_status;
status_array->msg.status_list.size = num_status;
status_array->allocator = allocator;
return RCL_RET_OK;
}
rcl_ret_t
rcl_action_goal_status_array_fini(
rcl_action_goal_status_array_t * status_array,
const rcl_allocator_t allocator)
rcl_action_goal_status_array_fini(rcl_action_goal_status_array_t * status_array)
{
RCL_CHECK_ALLOCATOR_WITH_MSG(&allocator, "invalid allocator", return RCL_RET_INVALID_ARGUMENT);
RCL_CHECK_ARGUMENT_FOR_NULL(status_array, RCL_RET_INVALID_ARGUMENT);
if (!status_array->status_list.data) {
if (!status_array->msg.status_list.data) {
return RCL_RET_INVALID_ARGUMENT;
}
allocator.deallocate(status_array->status_list.data, allocator.state);
status_array->allocator.deallocate(
status_array->msg.status_list.data, status_array->allocator.state);
return RCL_RET_OK;
}
@ -104,31 +103,30 @@ rcl_action_cancel_response_init(
return RCL_RET_INVALID_ARGUMENT;
}
// Ensure cancel response is zero initialized
if (cancel_response->goals_canceling.size > 0) {
if (cancel_response->msg.goals_canceling.size > 0) {
RCL_SET_ERROR_MSG("cancel_response already inititalized");
return RCL_RET_ALREADY_INIT;
}
// Allocate space for cancel response
cancel_response->goals_canceling.data = (rcl_action_goal_info_t *) allocator.zero_allocate(
cancel_response->msg.goals_canceling.data = (rcl_action_goal_info_t *) allocator.zero_allocate(
num_goals_canceling, sizeof(rcl_action_goal_info_t), allocator.state);
if (!cancel_response->goals_canceling.data) {
if (!cancel_response->msg.goals_canceling.data) {
return RCL_RET_BAD_ALLOC;
}
cancel_response->goals_canceling.size = num_goals_canceling;
cancel_response->msg.goals_canceling.size = num_goals_canceling;
cancel_response->allocator = allocator;
return RCL_RET_OK;
}
rcl_ret_t
rcl_action_cancel_response_fini(
rcl_action_cancel_response_t * cancel_response,
const rcl_allocator_t allocator)
rcl_action_cancel_response_fini(rcl_action_cancel_response_t * cancel_response)
{
RCL_CHECK_ALLOCATOR_WITH_MSG(&allocator, "invalid allocator", return RCL_RET_INVALID_ARGUMENT);
RCL_CHECK_ARGUMENT_FOR_NULL(cancel_response, RCL_RET_INVALID_ARGUMENT);
if (!cancel_response->goals_canceling.data) {
if (!cancel_response->msg.goals_canceling.data) {
return RCL_RET_INVALID_ARGUMENT;
}
allocator.deallocate(cancel_response->goals_canceling.data, allocator.state);
cancel_response->allocator.deallocate(
cancel_response->msg.goals_canceling.data, cancel_response->allocator.state);
return RCL_RET_OK;
}