Skip to content

Commit

Permalink
refactor init_options into its own files
Browse files Browse the repository at this point in the history
Signed-off-by: William Woodall <william@osrfoundation.org>
  • Loading branch information
wjwwood committed Nov 29, 2018
1 parent 3159283 commit ff6c946
Show file tree
Hide file tree
Showing 5 changed files with 209 additions and 42 deletions.
1 change: 1 addition & 0 deletions rmw/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ set(rmw_sources
"src/allocators.c"
"src/convert_rcutils_ret_to_rmw_ret.c"
"src/init.c"
"src/init_options.c"
"src/names_and_types.c"
"src/sanity_checks.c"
"src/node_security_options.c"
Expand Down
49 changes: 10 additions & 39 deletions rmw/include/rmw/init.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,69 +22,40 @@ extern "C"

#include <stdint.h>

#include "rmw/init_options.h"
#include "rmw/macros.h"
#include "rmw/ret_types.h"
#include "rmw/visibility_control.h"

/// Implementation defined options structure used during rmw_init().
/**
* This should be defined by the rmw implementation.
*/
typedef struct rmw_init_options_impl_t rmw_init_options_impl_t;

/// Options structure used during rmw_init().
typedef struct RMW_PUBLIC_TYPE rmw_init_options_t {
/// Locally (process local) unique ID that represents this init/shutdown cycle.
/**
* This should be set by the caller of `rmw_init()` to a number that is
* unique within this process.
* It is designed to be used with `rcl_init()` and `rcl_get_instance_id()`.
*/
uint64_t instance_id;
/// Implementation identifier, used to ensure two different implementations are not being mixed.
const char * implementation_identifier;
/// Implementation defined init options.
/** May be NULL if there are no implementation defined options. */
rmw_init_options_impl_t * impl;
} rmw_init_options_t;

/// Return the default init options.
/**
* This should be defined by the rmw implementation.
*/
RMW_PUBLIC
RMW_WARN_UNUSED
rmw_init_options_t
rmw_get_default_init_options(void);

/// Implementation defined context structure returned by rmw_init().
/**
* This should be defined by the rmw implementation.
*/
typedef struct rmw_context_impl_t rmw_context_impl_t;

/// Initialization context structure which is used to store init specific information.
typedef struct RMW_PUBLIC_TYPE rmw_context_t {
typedef struct RMW_PUBLIC_TYPE rmw_context_t
{
/// Locally (process local) unique ID that represents this init/shutdown cycle.
uint64_t instance_id;
/// Implementation identifier, used to ensure two different implementations are not being mixed.
const char * implementation_identifier;
/// Implementation defined init context information.
/// Implementation defined context information.
/** May be NULL if there is no implementation defined context information. */
rmw_context_impl_t * impl;
} rmw_context_t;

/// Return a zero initialized init context structure.
/// Return a zero initialized context structure.
RMW_PUBLIC
RMW_WARN_UNUSED
rmw_context_t
rmw_get_zero_initialized_context(void);

/// Initialize the middleware with the given options, and yielding an init context.
/// Initialize the middleware with the given options, and yielding an context.
/**
* The given init context must be zero initialized, and is filled with
* The given context must be zero initialized, and is filled with
* middleware specific data upon success of this function.
* The init context is used when initializing some entities like nodes and
* The context is used when initializing some entities like nodes and
* guard conditions, and is also required to properly call rmw_shutdown().
*
* <hr>
Expand All @@ -110,9 +81,9 @@ RMW_WARN_UNUSED
rmw_ret_t
rmw_init(const rmw_init_options_t * options, rmw_context_t * context);

/// Shutdown the middleware for a given init context.
/// Shutdown the middleware for a given context.
/**
* The given init context must be a valid context which has been initialized
* The given context must be a valid context which has been initialized
* with rmw_init().
*
* <hr>
Expand Down
159 changes: 159 additions & 0 deletions rmw/include/rmw/init_options.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
// Copyright 2014-2018 Open Source Robotics Foundation, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef RMW__INIT_OPTIONS_H_
#define RMW__INIT_OPTIONS_H_

#ifdef __cplusplus
extern "C"
{
#endif

#include <stdint.h>

#include "rcutils/allocator.h"
#include "rmw/macros.h"
#include "rmw/ret_types.h"
#include "rmw/visibility_control.h"

/// Implementation defined options structure used during rmw_init().
/**
* This should be defined by the rmw implementation.
*/
typedef struct rmw_init_options_impl_t rmw_init_options_impl_t;

/// Options structure used during rmw_init().
typedef struct RMW_PUBLIC_TYPE rmw_init_options_t
{
/// Locally (process local) unique ID that represents this init/shutdown cycle.
/**
* This should be set by the caller of `rmw_init()` to a number that is
* unique within this process.
* It is designed to be used with `rcl_init()` and `rcl_get_instance_id()`.
*/
uint64_t instance_id;
/// Implementation identifier, used to ensure two different implementations are not being mixed.
const char * implementation_identifier;
// TODO(wjwwood): replace with rmw_allocator_t when that refactor happens
/// Allocator used during internal allocation of init options, if needed.
rcutils_allocator_t allocator;
/// Implementation defined init options.
/** May be NULL if there are no implementation defined options. */
rmw_init_options_impl_t * impl;
} rmw_init_options_t;

/// Return a zero initialized init options structure.
RMW_PUBLIC
RMW_WARN_UNUSED
rmw_init_options_t
rmw_get_zero_initialized_init_options(void);

/// Initialize given init_options with the default values and implementation specific values.
/**
* The given allocator is used, if required, during setup of the init options,
* but is also used during initialization.
*
* In either case the given allocator is stored in the returned init options.
*
* The `impl` pointer should not be changed manually.
*
* <hr>
* Attribute | Adherence
* ------------------ | -------------
* Allocates Memory | Yes
* Thread-Safe | No
* Uses Atomics | Yes
* Lock-Free | Yes
*
* This should be defined by the rmw implementation.
*
* \param[inout] init_options object to be setup
* \param[in] allocator to be used during setup and during initialization
* \return `RMW_RET_OK` if setup is successful, or
* \return `RMW_RET_INVALID_ARGUMENT` if init_options has already be initialized, or
* \return `RMW_RET_INVALID_ARGUMENT` if any arguments are invalid, or
* \return `RMW_RET_BAD_ALLOC` if allocating memory failed, or
* \return `RMW_RET_ERROR` if an unspecified error occurs.
*/
RMW_PUBLIC
RMW_WARN_UNUSED
rmw_ret_t
rmw_init_options_init(rmw_init_options_t * init_options, rcutils_allocator_t allocator);

/// Copy the given source init options to the destination init options.
/**
* The allocator from the source is used for any allocations and stored in the
* destination.
*
* The destination should either be zero initialized with
* `rmw_get_zero_initialized_init_options()` or should have had
* `rmw_init_options_fini()` called on it.
* Giving an already initialized init options for the destination will result
* in a failure with return code `RMW_RET_INVALID_ARGUMENT`.
*
* <hr>
* Attribute | Adherence
* ------------------ | -------------
* Allocates Memory | Yes
* Thread-Safe | No
* Uses Atomics | Yes
* Lock-Free | Yes
*
* This should be defined by the rmw implementation.
*
* \param[in] src rcl_init_options_t object to be copied from
* \param[out] dst rcl_init_options_t object to be copied into
* \return `RMW_RET_OK` if the copy is successful, or
* \return `RMW_RET_INCORRECT_RMW_IMPLEMENTATION` if the implementation
* identifier for src does not match the implementation of this function, or
* \return `RMW_RET_INVALID_ARGUMENT` if the dst has already be initialized, or
* \return `RMW_RET_INVALID_ARGUMENT` if any arguments are invalid, or
* \return `RMW_RET_BAD_ALLOC` if allocating memory failed, or
* \return `RMW_RET_ERROR` if an unspecified error occurs.
*/
RMW_PUBLIC
RMW_WARN_UNUSED
rmw_ret_t
rmw_init_options_copy(const rmw_init_options_t * src, rmw_init_options_t * dst);

/// Finalize the given init_options.
/**
* The given init_options must be non-`NULL` and valid, i.e. had
* `rmw_init_options_init()` called on it but not this function yet.
*
* <hr>
* Attribute | Adherence
* ------------------ | -------------
* Allocates Memory | Yes
* Thread-Safe | No
* Uses Atomics | Yes
* Lock-Free | Yes
*
* This should be defined by the rmw implementation.
*
* \param[inout] init_options object to be setup
* \return `RMW_RET_OK` if setup is successful, or
* \return `RMW_RET_INVALID_ARGUMENT` if any arguments are invalid, or
* \return `RMW_RET_ERROR` if an unspecified error occurs.
*/
RMW_PUBLIC
RMW_WARN_UNUSED
rmw_ret_t
rmw_init_options_fini(rmw_init_options_t * init_options);

#ifdef __cplusplus
}
#endif

#endif // RMW__INIT_OPTIONS_H_
6 changes: 3 additions & 3 deletions rmw/src/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ rmw_context_t
rmw_get_zero_initialized_context(void)
{
return (const rmw_context_t) {
.instance_id = 0,
.impl = NULL
};
.instance_id = 0,
.impl = NULL
}; // NOLINT(readability/braces): false positive
}

#ifdef __cplusplus
Expand Down
36 changes: 36 additions & 0 deletions rmw/src/init_options.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// Copyright 2018 Open Source Robotics Foundation, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include <stddef.h>

#include "rmw/init_options.h"

#ifdef __cplusplus
extern "C"
{
#endif

rmw_init_options_t
rmw_get_zero_initialized_init_options(void)
{
return (const rmw_init_options_t) {
.instance_id = 0,
.implementation_identifier = NULL,
.impl = NULL,
}; // NOLINT(readability/braces): false positive
}

#ifdef __cplusplus
}
#endif

0 comments on commit ff6c946

Please sign in to comment.