score: Create chain implementation header

Move implementation specific parts of chain.h and chain.inl into new
header file chainimpl.h.  The chain.h contains now only the application
visible API.
This commit is contained in:
Sebastian Huber
2013-07-22 10:49:19 +02:00
parent 47ac81f645
commit 6e93dc4a95
32 changed files with 232 additions and 219 deletions

View File

@@ -20,6 +20,8 @@
#ifndef _RTEMS_RTEMS_PART_INL
#define _RTEMS_RTEMS_PART_INL
#include <rtems/score/chainimpl.h>
/**
* @addtogroup ClassicPart
* @{

View File

@@ -18,8 +18,7 @@
#ifndef _RTEMS_CHAIN_H
#define _RTEMS_CHAIN_H
#include <rtems/system.h>
#include <rtems/score/chain.h>
#include <rtems/score/chainimpl.h>
#include <rtems/rtems/event.h>
#ifdef __cplusplus

View File

@@ -22,8 +22,6 @@
#ifndef _RTEMS_CHAIN_INL
#define _RTEMS_CHAIN_INL
#include <rtems/score/chain.inl>
/**
* @addtogroup ClassicChains
*/

View File

@@ -19,6 +19,7 @@ include_rtems_score_HEADERS += include/rtems/score/apiext.h
include_rtems_score_HEADERS += include/rtems/score/apimutex.h
include_rtems_score_HEADERS += include/rtems/score/bitfield.h
include_rtems_score_HEADERS += include/rtems/score/chain.h
include_rtems_score_HEADERS += include/rtems/score/chainimpl.h
include_rtems_score_HEADERS += include/rtems/score/context.h
include_rtems_score_HEADERS += include/rtems/score/copyrt.h
include_rtems_score_HEADERS += include/rtems/score/corebarrier.h
@@ -90,7 +91,6 @@ endif
## inline
include_rtems_score_HEADERS += inline/rtems/score/address.inl
include_rtems_score_HEADERS += inline/rtems/score/chain.inl
include_rtems_score_HEADERS += inline/rtems/score/heap.inl
include_rtems_score_HEADERS += inline/rtems/score/object.inl
include_rtems_score_HEADERS += inline/rtems/score/priority.inl

View File

@@ -18,6 +18,13 @@
#ifndef _RTEMS_SCORE_APIEXT_H
#define _RTEMS_SCORE_APIEXT_H
#include <rtems/score/chainimpl.h>
#include <rtems/score/thread.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @defgroup ScoreAPIExtension API Extension Handler
*
@@ -32,9 +39,6 @@
*/
/**@{*/
#include <rtems/score/chain.h>
#include <rtems/score/thread.h>
#if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API)
/**
* This type defines the prototype of the Predriver Hook.
@@ -179,5 +183,9 @@ static inline void _API_extensions_Run_post_switch( Thread_Control *executing )
/**@}*/
#ifdef __cplusplus
}
#endif
#endif
/* end of include file */

View File

@@ -20,6 +20,10 @@
#ifndef _RTEMS_SCORE_CHAIN_H
#define _RTEMS_SCORE_CHAIN_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* @defgroup ScoreChain Chain Handler
*
@@ -33,12 +37,6 @@
*/
/**@{*/
#ifdef __cplusplus
extern "C" {
#endif
#include <rtems/score/address.h>
/**
* @typedef Chain_Node
*
@@ -94,187 +92,11 @@ typedef union {
} Tail;
} Chain_Control;
/**
* @brief Chain initializer for an empty chain with designator @a name.
*/
#define CHAIN_INITIALIZER_EMPTY(name) \
{ { { &(name).Tail.Node, NULL }, &(name).Head.Node } }
/**
* @brief Chain definition for an empty chain with designator @a name.
*/
#define CHAIN_DEFINE_EMPTY(name) \
Chain_Control name = CHAIN_INITIALIZER_EMPTY(name)
/**
* @brief Initialize a chain header.
*
* This routine initializes @a the_chain structure to manage the
* contiguous array of @a number_nodes nodes which starts at
* @a starting_address. Each node is of @a node_size bytes.
*
* @param[in] the_chain specifies the chain to initialize
* @param[in] starting_address is the starting address of the array
* of elements
* @param[in] number_nodes is the numebr of nodes that will be in the chain
* @param[in] node_size is the size of each node
*/
void _Chain_Initialize(
Chain_Control *the_chain,
void *starting_address,
size_t number_nodes,
size_t node_size
);
/**
* @brief Extract the specified node from a chain.
*
* This routine extracts @a the_node from the chain on which it resides.
* It disables interrupts to ensure the atomicity of the extract operation.
*
* @param[in] the_node is the node to be extracted
*
* - INTERRUPT LATENCY:
* + single case
*/
void _Chain_Extract(
Chain_Node *the_node
);
/**
* @brief Obtain the first node on a chain.
*
* This function removes the first node from @a the_chain and returns
* a pointer to that node. If @a the_chain is empty, then NULL is returned.
*
* @retval This method returns a pointer a node. If a node was removed,
* then a pointer to that node is returned. If @a the_chain was
* empty, then NULL is returned.
*
* @note It disables interrupts to ensure the atomicity of the get operation.
*/
Chain_Node *_Chain_Get(
Chain_Control *the_chain
);
/**
* @brief Insert a node on a chain.
*
* This routine inserts @a the_node on a chain immediately following
* @a after_node.
*
* @param[in] after_node is the pointer to the node in chain to be
* inserted after
* @param[in] the_node is the pointer to the node to be inserted
*
* @note It disables interrupts to ensure the atomicity
* of the insert operation.
*
* - INTERRUPT LATENCY:
* + single case
*/
void _Chain_Insert(
Chain_Node *after_node,
Chain_Node *the_node
);
/**
* @brief Append a node on the end of a chain.
*
* This routine appends @a the_node onto the end of @a the_chain.
*
* @note It disables interrupts to ensure the atomicity of the
* append operation.
*/
void _Chain_Append(
Chain_Control *the_chain,
Chain_Node *the_node
);
/**
* @brief Append a node and check if the chain was empty before.
*
* This routine appends the_node onto the end of the_chain.
*
* @param[in] the_chain is the chain to be operated upon.
* @param[in] the_node is the node to be appended.
*
* @note It disables interrupts to ensure the atomicity of the append
* operation.
*
* @retval true The chain was empty before.
* @retval false The chain contained at least one node before.
*/
bool _Chain_Append_with_empty_check(
Chain_Control *the_chain,
Chain_Node *the_node
);
/**
* @brief Prepend a node and check if the chain was empty before.
*
* This routine prepends the_node onto the front of the_chain.
*
* @param[in] the_chain is the chain to be operated upon.
* @param[in] the_node is the node to be prepended.
*
* @note It disables interrupts to ensure the atomicity of the append
* operation.
*
* @retval true The chain was empty before.
* @retval false The chain contained at least one node before.
*/
bool _Chain_Prepend_with_empty_check(
Chain_Control *the_chain,
Chain_Node *the_node
);
/**
* @brief Get the first node and check if the chain is empty afterwards.
*
* This function removes the first node from the_chain and returns
* a pointer to that node in @a the_node. If the_chain is empty, then NULL is
* returned.
*
* @param[in] the_chain is the chain to attempt to get the first node from.
* @param[out] the_node is the first node on the chain or NULL if the chain is
* empty.
*
* @note It disables interrupts to ensure the atomicity of the append
* operation.
*
* @retval true The chain is empty now.
* @retval false The chain contains at least one node now.
*
* - INTERRUPT LATENCY:
* + single case
*/
bool _Chain_Get_with_empty_check(
Chain_Control *the_chain,
Chain_Node **the_node
);
/**
* @brief Returns the node count of the chain.
*
* @param[in] chain The chain.
*
* @note It does NOT disable interrupts to ensure the atomicity of the
* operation.
*
* @retval The node count of the chain.
*/
size_t _Chain_Node_count_unprotected( const Chain_Control *chain );
#ifndef __RTEMS_APPLICATION__
#include <rtems/score/chain.inl>
#endif
/**@}*/
#ifdef __cplusplus
}
#endif
/**@}*/
#endif
/* end of include file */

View File

@@ -15,18 +15,193 @@
* http://www.rtems.com/license/LICENSE.
*/
#ifndef _RTEMS_SCORE_CHAIN_H
# error "Never use <rtems/score/chain.inl> directly; include <rtems/score/chain.h> instead."
#endif
#ifndef _RTEMS_SCORE_CHAINIMPL_H
#define _RTEMS_SCORE_CHAINIMPL_H
#ifndef _RTEMS_SCORE_CHAIN_INL
#define _RTEMS_SCORE_CHAIN_INL
#include <rtems/score/chain.h>
#include <rtems/score/address.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @addtogroup ScoreChain
*/
/**@{**/
/**
* @brief Chain initializer for an empty chain with designator @a name.
*/
#define CHAIN_INITIALIZER_EMPTY(name) \
{ { { &(name).Tail.Node, NULL }, &(name).Head.Node } }
/**
* @brief Chain definition for an empty chain with designator @a name.
*/
#define CHAIN_DEFINE_EMPTY(name) \
Chain_Control name = CHAIN_INITIALIZER_EMPTY(name)
/**
* @brief Initialize a chain header.
*
* This routine initializes @a the_chain structure to manage the
* contiguous array of @a number_nodes nodes which starts at
* @a starting_address. Each node is of @a node_size bytes.
*
* @param[in] the_chain specifies the chain to initialize
* @param[in] starting_address is the starting address of the array
* of elements
* @param[in] number_nodes is the numebr of nodes that will be in the chain
* @param[in] node_size is the size of each node
*/
void _Chain_Initialize(
Chain_Control *the_chain,
void *starting_address,
size_t number_nodes,
size_t node_size
);
/**
* @brief Extract the specified node from a chain.
*
* This routine extracts @a the_node from the chain on which it resides.
* It disables interrupts to ensure the atomicity of the extract operation.
*
* @param[in] the_node is the node to be extracted
*
* - INTERRUPT LATENCY:
* + single case
*/
void _Chain_Extract(
Chain_Node *the_node
);
/**
* @brief Obtain the first node on a chain.
*
* This function removes the first node from @a the_chain and returns
* a pointer to that node. If @a the_chain is empty, then NULL is returned.
*
* @retval This method returns a pointer a node. If a node was removed,
* then a pointer to that node is returned. If @a the_chain was
* empty, then NULL is returned.
*
* @note It disables interrupts to ensure the atomicity of the get operation.
*/
Chain_Node *_Chain_Get(
Chain_Control *the_chain
);
/**
* @brief Insert a node on a chain.
*
* This routine inserts @a the_node on a chain immediately following
* @a after_node.
*
* @param[in] after_node is the pointer to the node in chain to be
* inserted after
* @param[in] the_node is the pointer to the node to be inserted
*
* @note It disables interrupts to ensure the atomicity
* of the insert operation.
*
* - INTERRUPT LATENCY:
* + single case
*/
void _Chain_Insert(
Chain_Node *after_node,
Chain_Node *the_node
);
/**
* @brief Append a node on the end of a chain.
*
* This routine appends @a the_node onto the end of @a the_chain.
*
* @note It disables interrupts to ensure the atomicity of the
* append operation.
*/
void _Chain_Append(
Chain_Control *the_chain,
Chain_Node *the_node
);
/**
* @brief Append a node and check if the chain was empty before.
*
* This routine appends the_node onto the end of the_chain.
*
* @param[in] the_chain is the chain to be operated upon.
* @param[in] the_node is the node to be appended.
*
* @note It disables interrupts to ensure the atomicity of the append
* operation.
*
* @retval true The chain was empty before.
* @retval false The chain contained at least one node before.
*/
bool _Chain_Append_with_empty_check(
Chain_Control *the_chain,
Chain_Node *the_node
);
/**
* @brief Prepend a node and check if the chain was empty before.
*
* This routine prepends the_node onto the front of the_chain.
*
* @param[in] the_chain is the chain to be operated upon.
* @param[in] the_node is the node to be prepended.
*
* @note It disables interrupts to ensure the atomicity of the append
* operation.
*
* @retval true The chain was empty before.
* @retval false The chain contained at least one node before.
*/
bool _Chain_Prepend_with_empty_check(
Chain_Control *the_chain,
Chain_Node *the_node
);
/**
* @brief Get the first node and check if the chain is empty afterwards.
*
* This function removes the first node from the_chain and returns
* a pointer to that node in @a the_node. If the_chain is empty, then NULL is
* returned.
*
* @param[in] the_chain is the chain to attempt to get the first node from.
* @param[out] the_node is the first node on the chain or NULL if the chain is
* empty.
*
* @note It disables interrupts to ensure the atomicity of the append
* operation.
*
* @retval true The chain is empty now.
* @retval false The chain contains at least one node now.
*
* - INTERRUPT LATENCY:
* + single case
*/
bool _Chain_Get_with_empty_check(
Chain_Control *the_chain,
Chain_Node **the_node
);
/**
* @brief Returns the node count of the chain.
*
* @param[in] chain The chain.
*
* @note It does NOT disable interrupts to ensure the atomicity of the
* operation.
*
* @retval The node count of the chain.
*/
size_t _Chain_Node_count_unprotected( const Chain_Control *chain );
/**
* @brief Set off chain.
*
@@ -769,5 +944,9 @@ RTEMS_INLINE_ROUTINE void _Chain_Insert_ordered_unprotected(
/** @} */
#ifdef __cplusplus
}
#endif
#endif
/* end of include file */

View File

@@ -20,6 +20,7 @@
#define _RTEMS_SCORE_COREMSGIMPL_H
#include <rtems/score/coremsg.h>
#include <rtems/score/chainimpl.h>
#include <limits.h>
#include <string.h>

View File

@@ -19,6 +19,7 @@
#define _RTEMS_SCORE_COREMUTEXIMPL_H
#include <rtems/score/coremutex.h>
#include <rtems/score/chainimpl.h>
#include <rtems/score/threaddispatch.h>
#ifdef __cplusplus

View File

@@ -19,6 +19,7 @@
#define _RTEMS_SCORE_USEREXTIMPL_H
#include <rtems/score/userext.h>
#include <rtems/score/chainimpl.h>
#ifdef __cplusplus
extern "C" {

View File

@@ -24,6 +24,7 @@
#ifndef _RTEMS_SCORE_SCHEDULERPRIORITY_INL
#define _RTEMS_SCORE_SCHEDULERPRIORITY_INL
#include <rtems/score/chainimpl.h>
#include <rtems/score/wkspace.h>
/**

View File

@@ -59,6 +59,10 @@ $(PROJECT_INCLUDE)/rtems/score/chain.h: include/rtems/score/chain.h $(PROJECT_IN
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/chain.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/chain.h
$(PROJECT_INCLUDE)/rtems/score/chainimpl.h: include/rtems/score/chainimpl.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/chainimpl.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/chainimpl.h
$(PROJECT_INCLUDE)/rtems/score/context.h: include/rtems/score/context.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/context.h
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/context.h
@@ -291,10 +295,6 @@ $(PROJECT_INCLUDE)/rtems/score/address.inl: inline/rtems/score/address.inl $(PRO
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/address.inl
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/address.inl
$(PROJECT_INCLUDE)/rtems/score/chain.inl: inline/rtems/score/chain.inl $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/chain.inl
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/chain.inl
$(PROJECT_INCLUDE)/rtems/score/heap.inl: inline/rtems/score/heap.inl $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/heap.inl
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/heap.inl

View File

@@ -21,7 +21,7 @@
#include <rtems/system.h>
#include <rtems/score/address.h>
#include <rtems/score/chain.h>
#include <rtems/score/chainimpl.h>
#include <rtems/score/isr.h>
void _Chain_Initialize(

View File

@@ -20,7 +20,7 @@
#include <rtems/system.h>
#include <rtems/score/address.h>
#include <rtems/score/chain.h>
#include <rtems/score/chainimpl.h>
#include <rtems/score/isr.h>
/*

View File

@@ -25,7 +25,7 @@
#endif
#include <rtems/system.h>
#include <rtems/score/chain.h>
#include <rtems/score/chainimpl.h>
#include <rtems/score/isr.h>
bool _Chain_Append_with_empty_check(

View File

@@ -21,7 +21,7 @@
#include <rtems/system.h>
#include <rtems/score/address.h>
#include <rtems/score/chain.h>
#include <rtems/score/chainimpl.h>
#include <rtems/score/isr.h>
void _Chain_Extract(

View File

@@ -20,7 +20,7 @@
#include <rtems/system.h>
#include <rtems/score/address.h>
#include <rtems/score/chain.h>
#include <rtems/score/chainimpl.h>
#include <rtems/score/isr.h>
Chain_Node *_Chain_Get(

View File

@@ -25,7 +25,7 @@
#endif
#include <rtems/system.h>
#include <rtems/score/chain.h>
#include <rtems/score/chainimpl.h>
#include <rtems/score/isr.h>
bool _Chain_Get_with_empty_check(

View File

@@ -21,7 +21,7 @@
#include <rtems/system.h>
#include <rtems/score/address.h>
#include <rtems/score/chain.h>
#include <rtems/score/chainimpl.h>
#include <rtems/score/isr.h>
/*

View File

@@ -16,7 +16,7 @@
#include "config.h"
#endif
#include <rtems/score/chain.h>
#include <rtems/score/chainimpl.h>
size_t _Chain_Node_count_unprotected( const Chain_Control *chain )
{

View File

@@ -25,7 +25,7 @@
#endif
#include <rtems/system.h>
#include <rtems/score/chain.h>
#include <rtems/score/chainimpl.h>
#include <rtems/score/isr.h>
bool _Chain_Prepend_with_empty_check(

View File

@@ -17,6 +17,7 @@
#endif
#include <rtems/score/object.h>
#include <rtems/score/chainimpl.h>
Objects_Maximum _Objects_Active_count(
const Objects_Information *information

View File

@@ -20,7 +20,7 @@
#include <rtems/system.h>
#include <rtems/score/address.h>
#include <rtems/score/chain.h>
#include <rtems/score/chainimpl.h>
#include <rtems/score/object.h>
#if defined(RTEMS_MULTIPROCESSING)
#include <rtems/score/objectmp.h>

View File

@@ -20,7 +20,7 @@
#include <rtems/system.h>
#include <rtems/score/address.h>
#include <rtems/score/chain.h>
#include <rtems/score/chainimpl.h>
#include <rtems/score/object.h>
#if defined(RTEMS_MULTIPROCESSING)
#include <rtems/score/objectmp.h>

View File

@@ -20,7 +20,7 @@
#include <rtems/system.h>
#include <rtems/score/address.h>
#include <rtems/score/chain.h>
#include <rtems/score/chainimpl.h>
#include <rtems/score/object.h>
#if defined(RTEMS_MULTIPROCESSING)
#include <rtems/score/objectmp.h>

View File

@@ -20,7 +20,7 @@
#include <rtems/system.h>
#include <rtems/score/address.h>
#include <rtems/score/chain.h>
#include <rtems/score/chainimpl.h>
#include <rtems/score/object.h>
#if defined(RTEMS_MULTIPROCESSING)
#include <rtems/score/objectmp.h>

View File

@@ -20,7 +20,7 @@
#include <rtems/system.h>
#include <rtems/score/address.h>
#include <rtems/score/chain.h>
#include <rtems/score/chainimpl.h>
#include <rtems/score/object.h>
#if defined(RTEMS_MULTIPROCESSING)
#include <rtems/score/objectmp.h>

View File

@@ -19,7 +19,7 @@
#endif
#include <rtems/system.h>
#include <rtems/score/chain.h>
#include <rtems/score/chainimpl.h>
#include <rtems/score/isr.h>
#include <rtems/score/object.h>
#include <rtems/score/states.h>

View File

@@ -19,7 +19,7 @@
#endif
#include <rtems/system.h>
#include <rtems/score/chain.h>
#include <rtems/score/chainimpl.h>
#include <rtems/score/isr.h>
#include <rtems/score/object.h>
#include <rtems/score/states.h>

View File

@@ -19,7 +19,7 @@
#endif
#include <rtems/system.h>
#include <rtems/score/chain.h>
#include <rtems/score/chainimpl.h>
#include <rtems/score/isr.h>
#include <rtems/score/object.h>
#include <rtems/score/states.h>

View File

@@ -19,7 +19,7 @@
#endif
#include <rtems/system.h>
#include <rtems/score/chain.h>
#include <rtems/score/chainimpl.h>
#include <rtems/score/isr.h>
#include <rtems/score/object.h>
#include <rtems/score/states.h>

View File

@@ -23,7 +23,7 @@
#endif
#include <rtems/system.h>
#include <rtems/score/chain.h>
#include <rtems/score/chainimpl.h>
#include <rtems/score/isr.h>
#include <rtems/score/object.h>
#include <rtems/score/states.h>