Skip to content

Commit

Permalink
Modified to receive multiple core affinity parameters according to th…
Browse files Browse the repository at this point in the history
…e update of REP-2017 below.

ros-infrastructure/rep#385

Signed-off-by: Shoji Morita <s-morita@esol.co.jp>
  • Loading branch information
smorita-esol committed Oct 26, 2023
1 parent 51e57d7 commit bfab6e3
Show file tree
Hide file tree
Showing 3 changed files with 601 additions and 19 deletions.
160 changes: 156 additions & 4 deletions include/rcutils/thread_attr.h
Expand Up @@ -15,6 +15,8 @@
#ifndef RCUTILS__THREAD_ATTR_H_
#define RCUTILS__THREAD_ATTR_H_

#include <stdbool.h>

#include "rcutils/visibility_control.h"

#include "rcutils/allocator.h"
Expand All @@ -38,10 +40,20 @@ typedef enum rcutils_thread_scheduling_policy_e
RCUTILS_THREAD_SCHEDULING_POLICY_DEADLINE = 7
} rcutils_thread_scheduling_policy_t;

typedef struct rcutils_thread_core_affinity_s
{
// Array for bit pattern of core affinity
uint8_t * set;
// Bit count in the set
size_t core_count;
// Allocator used to allocate the set
rcutils_allocator_t allocator;
} rcutils_thread_core_affinity_t;

typedef struct rcutils_thread_attr_s
{
/// Thread core affinity
int core_affinity;
rcutils_thread_core_affinity_t core_affinity;
/// Thread scheduling policy.
rcutils_thread_scheduling_policy_t scheduling_policy;
/// Thread priority.
Expand Down Expand Up @@ -92,7 +104,6 @@ rcutils_thread_attrs_init(
* \brief Initialize list of thread attributes with a capacity.
* \param[out] thread_attrs list of thread attributes to be initialized
* \param[in] allocator memory allocator to be used
* \param[in] capacity initial capacity of the list of thread attributes
* \return #RCUTILS_RET_OK if the structure was initialized succeessfully, or
* \return #RCUTILS_RET_INVALID_ARGUMENT if any function arguments are invalid, or
* \return #RCUTILS_RET_BAD_ALLOC if allocating memory failed, or
Expand Down Expand Up @@ -133,7 +144,7 @@ rcutils_thread_attrs_copy(

/**
* \brief Add thread attribute to the list of thread attributes.
* \param[inout] thread_attrs list of thread attributes to add a thread attribute to
* \param[in,out] thread_attrs list of thread attributes to add a thread attribute to
* \param[in] sched_policy thread scheduling policy of adding attribute
* \param[in] core_affinity thread core affinity of adding attribute
* \param[in] priority thread priority of adding attribute
Expand All @@ -149,10 +160,151 @@ rcutils_ret_t
rcutils_thread_attrs_add_attr(
rcutils_thread_attrs_t * thread_attrs,
rcutils_thread_scheduling_policy_t sched_policy,
int core_affinity,
rcutils_thread_core_affinity_t const * core_affinity,
int priority,
char const * name);

/**
* \brief Return a zero-initialized rcutils_thread_core_affinity_t object.
* \return zero-initialized rcutils_thread_core_affinity_t.
*/
RCUTILS_PUBLIC
RCUTILS_WARN_UNUSED
rcutils_thread_core_affinity_t
rcutils_get_zero_initialized_thread_core_affinity(void);

/**
* \brief Initialize thread core affinity.
* \param[out] affinity thread core affinity to be initialized.
* \param[in] allocator allocator for internal memory operations for the thread core affinity.
* \return #RCUTILS_RET_OK if affinity was successfully initialized, or
* \return #RCUTILS_RET_INVALID_ARGUMENT if any function arguments are invalid, or
* \return #RCUTILS_RET_ERROR an unspecified error occur.
*/
RCUTILS_PUBLIC
RCUTILS_WARN_UNUSED
rcutils_ret_t
rcutils_thread_core_affinity_init(
rcutils_thread_core_affinity_t * affinity,
rcutils_allocator_t allocator);

/**
* \brief Initialize thread core affinity with number of cores.
* \param[out] affinity thread core affinity to be initialized.
* \param[in] num_cores initial number of core in the thread core affinity
* \param[in] allocator allocator for internal memory operations for the thread core affinity.
* \return #RCUTILS_RET_OK if affinity was successfully initialized, or
* \return #RCUTILS_RET_INVALID_ARGUMENT if any function arguments are invalid, or
* \return #RCUTILS_RET_BAD_ALLOC if allocating memory failed, or
* \return #RCUTILS_RET_ERROR an unspecified error occur.
*/
RCUTILS_PUBLIC
RCUTILS_WARN_UNUSED
rcutils_ret_t
rcutils_thread_core_affinity_init_with_capacity(
rcutils_thread_core_affinity_t * affinity,
size_t num_cores,
rcutils_allocator_t allocator);

/**
* \brief Copy thread core affinity.
* \param[in] src core affinity to be copied.
* \param[out] dest the destination.
* \return #RCUTILS_RET_OK if affinity was successfully copied, or
* \return #RCUTILS_RET_INVALID_ARGUMENT if any function arguments are invalid, or
* \return #RCUTILS_RET_BAD_ALLOC if allocating memory failed, or
* \return #RCUTILS_RET_ERROR an unspecified error occur.
*/
RCUTILS_PUBLIC
RCUTILS_WARN_UNUSED
rcutils_ret_t
rcutils_thread_core_affinity_copy(
rcutils_thread_core_affinity_t const * src, rcutils_thread_core_affinity_t * dest);

/**
* \brief Free thread core affinity.
* \param[in,out] affinity thread core affinity to be freed
* \return #RCUTILS_RET_OK if affitiny was successfully freed, or
* \return #RCUTILS_RET_INVALID_ARGUMENT if any function arguments are invalid, or
* \return #RCUTILS_RET_ERROR an unspecified error occur.
*/
RCUTILS_PUBLIC
RCUTILS_WARN_UNUSED
rcutils_ret_t
rcutils_thread_core_affinity_fini(rcutils_thread_core_affinity_t * affinity);

/**
* \brief Add processor number to thread core affinity.
* \param[in,out] affinity thread core affinity
* \param[in] no processor number to be added to the affinity set
* \return #RCUTILS_RET_OK if the processor number is successfully added to the affinity.
* \return #RCUTILS_RET_INVALID_ARGUMENT if any function arguments are invalid, or
* \return #RCUTILS_RET_BAD_ALLOC if allocating memory failed, or
* \return #RCUTILS_RET_ERROR an unspecified error occur.
*/
RCUTILS_PUBLIC
RCUTILS_WARN_UNUSED
rcutils_ret_t
rcutils_thread_core_affinity_set(rcutils_thread_core_affinity_t * affinity, size_t no);

/**
* \brief Remove processor number from thread core affinity.
* \param[in,out] affinity thread core affinity
* \param[in] no processor number to be removed from the affinity set
* \return #RCUTILS_RET_OK if the processor number is successfully removed from the affinity.
* \return #RCUTILS_RET_INVALID_ARGUMENT if any function arguments are invalid, or
* \return #RCUTILS_RET_ERROR an unspecified error occur.
*/
RCUTILS_PUBLIC
RCUTILS_WARN_UNUSED
rcutils_ret_t
rcutils_thread_core_affinity_unset(rcutils_thread_core_affinity_t * affinity, size_t no);

/**
* \brief Add processor numbers which are included in a range to thread core affinity.
* \param[in,out] affinity thread core affinity
* \param[in] min_no lower bound of the processor number range to be added (inclusive)
* \param[in] max_no upper bound of the processor number range to be added (inclusive)
* \return #RCUTILS_RET_OK if the processor numbers are successfully added to the affinity.
* \return #RCUTILS_RET_INVALID_ARGUMENT if any function arguments are invalid, or
* \return #RCUTILS_RET_INVALID_ARGUMENT if max_no less than min_no, or
* \return #RCUTILS_RET_BAD_ALLOC if allocating memory failed, or
* \return #RCUTILS_RET_ERROR an unspecified error occur.
*/
RCUTILS_PUBLIC
RCUTILS_WARN_UNUSED
rcutils_ret_t
rcutils_thread_core_affinity_fill(
rcutils_thread_core_affinity_t * affinity, size_t min_no, size_t max_no);

/**
* \brief Remove processor numbers which are included in a range from thread core affinity.
* \param[in,out] affinity thread core affinity
* \param[in] min_no lower bound of the processor number range to be removed (inclusive)
* \param[in] max_no upper bound of the processor number range to be removed (inclusive)
* \return #RCUTILS_RET_OK if the processor numbers are successfully removed from the affinity.
* \return #RCUTILS_RET_INVALID_ARGUMENT if any function arguments are invalid, or
* \return #RCUTILS_RET_INVALID_ARGUMENT if max_no less than min_no, or
* \return #RCUTILS_RET_BAD_ALLOC if allocating memory failed, or
* \return #RCUTILS_RET_ERROR an unspecified error occur.
*/
RCUTILS_PUBLIC
RCUTILS_WARN_UNUSED
rcutils_ret_t
rcutils_thread_core_affinity_clear(
rcutils_thread_core_affinity_t * affinity, size_t min_no, size_t max_no);

/**
* \brief check if thread core affinity contains processor number.
* \param[in] affinity thread core affinity
* \param[in] no processor number to check
* \return true if the thread core affinity includes the number, false otherwise.
*/
RCUTILS_PUBLIC
RCUTILS_WARN_UNUSED
bool
rcutils_thread_core_affinity_is_set(rcutils_thread_core_affinity_t const * affinity, size_t no);

#ifdef __cplusplus
}
#endif
Expand Down

0 comments on commit bfab6e3

Please sign in to comment.