18 #ifndef _RTEMS_CHAIN_H 19 #define _RTEMS_CHAIN_H 44 #define RTEMS_CHAIN_INITIALIZER_EMPTY( name ) \ 45 CHAIN_INITIALIZER_EMPTY( name ) 52 #define RTEMS_CHAIN_INITIALIZER_ONE_NODE( node ) \ 53 CHAIN_INITIALIZER_ONE_NODE( node ) 60 #define RTEMS_CHAIN_NODE_INITIALIZER_ONE_NODE_CHAIN( chain ) \ 61 CHAIN_NODE_INITIALIZER_ONE_NODE_CHAIN( chain ) 66 #define RTEMS_CHAIN_DEFINE_EMPTY( name ) \ 67 rtems_chain_control name = RTEMS_CHAIN_INITIALIZER_EMPTY( name ) 79 rtems_chain_control *chain,
80 rtems_chain_node *node,
95 rtems_chain_control *chain,
96 rtems_chain_node *node,
111 rtems_chain_control *chain,
114 rtems_chain_node **node
127 rtems_chain_control *chain,
130 rtems_chain_node **node
147 rtems_chain_control *the_chain,
148 void *starting_address,
169 rtems_chain_control *the_chain
184 rtems_chain_node *node
202 const rtems_chain_node *node
219 const rtems_chain_node *the_node
235 rtems_chain_control *the_chain
251 const rtems_chain_control *the_chain
267 rtems_chain_control *the_chain
283 const rtems_chain_control *the_chain
300 rtems_chain_control *the_chain
317 const rtems_chain_control *the_chain
334 rtems_chain_control *the_chain
351 const rtems_chain_control *the_chain
367 rtems_chain_node *the_node
383 const rtems_chain_node *the_node
399 rtems_chain_node *the_node
415 const rtems_chain_node *the_node
434 const rtems_chain_node *left,
435 const rtems_chain_node *right
453 const rtems_chain_control *the_chain
472 const rtems_chain_node *the_node
490 const rtems_chain_node *the_node
508 const rtems_chain_control *the_chain
527 const rtems_chain_control *the_chain,
528 const rtems_chain_node *the_node
547 const rtems_chain_control *the_chain,
548 const rtems_chain_node *the_node
563 #if defined( RTEMS_SMP ) 565 rtems_chain_node *the_node
569 rtems_chain_node *the_node
585 rtems_chain_node *the_node
603 #if defined( RTEMS_SMP ) 605 rtems_chain_control *the_chain
609 rtems_chain_control *the_chain
620 rtems_chain_control *the_chain
635 #if defined( RTEMS_SMP ) 637 rtems_chain_node *after_node,
638 rtems_chain_node *the_node
642 rtems_chain_node *after_node,
643 rtems_chain_node *the_node
654 rtems_chain_node *after_node,
655 rtems_chain_node *the_node
669 #if defined( RTEMS_SMP ) 671 rtems_chain_control *the_chain,
672 rtems_chain_node *the_node
676 rtems_chain_control *the_chain,
677 rtems_chain_node *the_node
693 rtems_chain_control *the_chain,
694 rtems_chain_node *the_node
711 #if defined( RTEMS_SMP ) 713 rtems_chain_control *the_chain,
714 rtems_chain_node *the_node
718 rtems_chain_control *the_chain,
719 rtems_chain_node *the_node
738 rtems_chain_control *the_chain,
739 rtems_chain_node *the_node
753 #if defined( RTEMS_SMP ) 755 rtems_chain_control *chain,
756 rtems_chain_node *node
760 rtems_chain_control *chain,
761 rtems_chain_node *node
776 #if defined( RTEMS_SMP ) 778 rtems_chain_control *chain,
779 rtems_chain_node *node
783 rtems_chain_control *chain,
784 rtems_chain_node *node
803 #if defined( RTEMS_SMP ) 805 rtems_chain_control *chain,
806 rtems_chain_node **node
810 rtems_chain_control *chain,
811 rtems_chain_node **node
829 const rtems_chain_control *chain
RTEMS_INLINE_ROUTINE void _Chain_Prepend(Chain_Control *the_chain, Chain_Node *the_node)
Prepend a node (protected).
Definition: chainimpl.h:806
RTEMS_INLINE_ROUTINE rtems_chain_node * rtems_chain_tail(rtems_chain_control *the_chain)
Return pointer to Chain Tail.
Definition: chain.h:266
RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected(Chain_Control *the_chain, Chain_Node *the_node)
Append a node (unprotected).
Definition: chainimpl.h:743
This is used to manage each element (node) which is placed on a chain.
Definition: chain.h:65
RTEMS_INLINE_ROUTINE Chain_Node * _Chain_Head(Chain_Control *the_chain)
Return pointer to chain head.
Definition: chainimpl.h:301
RTEMS_INLINE_ROUTINE bool rtems_chain_has_only_one_node(const rtems_chain_control *the_chain)
Does this chain have only one node.
Definition: chain.h:507
rtems_status_code rtems_chain_get_with_notification(rtems_chain_control *chain, rtems_id task, rtems_event_set events, rtems_chain_node **node)
Gets the first node of the chain and sends the events to the task if the chain is empty after the get...
Definition: chaingetnotify.c:29
RTEMS_INLINE_ROUTINE void rtems_chain_initialize_empty(rtems_chain_control *the_chain)
Initialize this chain as empty.
Definition: chain.h:168
RTEMS_INLINE_ROUTINE void rtems_chain_extract_unprotected(rtems_chain_node *the_node)
Extract the specified node from a chain (unprotected).
Definition: chain.h:584
Chain_Node * _Chain_Get(Chain_Control *the_chain)
Obtain the first node on a chain.
Definition: chainget.c:26
RTEMS_INLINE_ROUTINE const rtems_chain_node * rtems_chain_immutable_tail(const rtems_chain_control *the_chain)
Return pointer to immutable Chain Tail.
Definition: chain.h:282
RTEMS_INLINE_ROUTINE Chain_Node * _Chain_Next(Chain_Node *the_node)
Return pointer the next node from this node.
Definition: chainimpl.h:433
rtems_status_code rtems_chain_prepend_with_notification(rtems_chain_control *chain, rtems_chain_node *node, rtems_id task, rtems_event_set events)
Prepends the node to the chain and sends the events to the task if the chain was empty before the pre...
Definition: chainprependnotify.c:29
RTEMS_INLINE_ROUTINE rtems_chain_node * rtems_chain_last(rtems_chain_control *the_chain)
Return pointer to Chain's Last node before the permanent tail.
Definition: chain.h:333
Objects_Id rtems_id
Used to manage and manipulate RTEMS object identifiers.
Definition: types.h:80
void _Chain_Initialize(Chain_Control *the_chain, void *starting_address, size_t number_nodes, size_t node_size)
Initialize a chain header.
Definition: chain.c:26
bool _Chain_Prepend_with_empty_check(Chain_Control *the_chain, Chain_Node *the_node)
Prepend a node and check if the chain was empty before.
Definition: chainprependempty.c:31
RTEMS_INLINE_ROUTINE Chain_Node * _Chain_Previous(Chain_Node *the_node)
Return pointer the previous node from this node.
Definition: chainimpl.h:465
RTEMS_INLINE_ROUTINE const rtems_chain_node * rtems_chain_immutable_first(const rtems_chain_control *the_chain)
Return pointer to immutable Chain's First node.
Definition: chain.h:316
#define RTEMS_INLINE_ROUTINE
The following (in conjunction with compiler arguments) are used to choose between the use of static i...
Definition: basedefs.h:135
void _Chain_Extract(Chain_Node *the_node)
Extract the specified node from a chain.
Definition: chainextract.c:27
RTEMS_INLINE_ROUTINE size_t rtems_chain_node_count_unprotected(const rtems_chain_control *chain)
Returns the node count of the chain.
Definition: chain.h:828
RTEMS_INLINE_ROUTINE bool rtems_chain_append_with_empty_check(rtems_chain_control *chain, rtems_chain_node *node)
Checks if the chain is empty and appends the node.
Definition: chain.h:759
This is used to manage a chain.
Definition: chain.h:83
RTEMS_INLINE_ROUTINE bool rtems_chain_is_last(const rtems_chain_node *the_node)
Is this the last node on the chain.
Definition: chain.h:489
RTEMS_INLINE_ROUTINE bool _Chain_Are_nodes_equal(const Chain_Node *left, const Chain_Node *right)
Are two nodes equal.
Definition: chainimpl.h:267
RTEMS_INLINE_ROUTINE const Chain_Node * _Chain_Immutable_head(const Chain_Control *the_chain)
Return pointer to immutable chain head.
Definition: chainimpl.h:317
RTEMS_INLINE_ROUTINE bool rtems_chain_prepend_with_empty_check(rtems_chain_control *chain, rtems_chain_node *node)
Checks if the chain is empty and prepends the node.
Definition: chain.h:782
RTEMS_INLINE_ROUTINE bool _Chain_Is_node_off_chain(const Chain_Node *node)
Is the node off chain.
Definition: chainimpl.h:248
RTEMS_INLINE_ROUTINE void _Chain_Extract_unprotected(Chain_Node *the_node)
Extract this node (unprotected).
Definition: chainimpl.h:639
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(Chain_Control *the_chain)
Initialize this chain as empty.
Definition: chainimpl.h:613
rtems_status_code rtems_chain_get_with_wait(rtems_chain_control *chain, rtems_event_set events, rtems_interval timeout, rtems_chain_node **node)
Gets the first node of the chain and sends the events to the task if the chain is empty afterwards...
Definition: chaingetwait.c:29
RTEMS_INLINE_ROUTINE void rtems_chain_append_unprotected(rtems_chain_control *the_chain, rtems_chain_node *the_node)
Append a node on the end of a chain (unprotected).
Definition: chain.h:692
Watchdog_Interval rtems_interval
Used to manage and manipulate intervals specified by clock ticks.
Definition: types.h:119
RTEMS_INLINE_ROUTINE const Chain_Node * _Chain_Immutable_previous(const Chain_Node *the_node)
Return pointer the immutable previous node from this node.
Definition: chainimpl.h:481
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(const Chain_Control *the_chain)
Is the chain empty.
Definition: chainimpl.h:499
RTEMS_INLINE_ROUTINE rtems_chain_node * rtems_chain_next(rtems_chain_node *the_node)
Return pointer the next node from this node.
Definition: chain.h:366
RTEMS_INLINE_ROUTINE rtems_chain_node * rtems_chain_get_unprotected(rtems_chain_control *the_chain)
See _Chain_Get_unprotected().
Definition: chain.h:619
RTEMS_INLINE_ROUTINE void rtems_chain_insert_unprotected(rtems_chain_node *after_node, rtems_chain_node *the_node)
See _Chain_Insert_unprotected().
Definition: chain.h:653
rtems_status_code rtems_chain_append_with_notification(rtems_chain_control *chain, rtems_chain_node *node, rtems_id task, rtems_event_set events)
Appends the node to the chain and sends the events to the task if the chain was empty before the appe...
Definition: chainappendnotify.c:29
RTEMS_INLINE_ROUTINE void rtems_chain_prepend_unprotected(rtems_chain_control *the_chain, rtems_chain_node *the_node)
Prepend a node (unprotected).
Definition: chain.h:737
rtems_status_code
Classic API Status.
Definition: status.h:46
RTEMS_INLINE_ROUTINE void rtems_chain_set_off_chain(rtems_chain_node *node)
Set off chain.
Definition: chain.h:183
RTEMS_INLINE_ROUTINE bool _Chain_Has_only_one_node(const Chain_Control *the_chain)
Does this chain have only one node.
Definition: chainimpl.h:558
RTEMS_INLINE_ROUTINE Chain_Node * _Chain_Get_unprotected(Chain_Control *the_chain)
Get the first node (unprotected).
Definition: chainimpl.h:695
RTEMS_INLINE_ROUTINE bool rtems_chain_is_node_off_chain(const rtems_chain_node *node)
Is the node off chain.
Definition: chain.h:201
RTEMS_INLINE_ROUTINE bool rtems_chain_get_with_empty_check(rtems_chain_control *chain, rtems_chain_node **node)
Tries to get the first node and check if the chain is empty afterwards.
Definition: chain.h:809
uint32_t rtems_event_set
Integer type to hold an event set of up to 32 events represented as a bit field.
Definition: event.h:51
RTEMS_INLINE_ROUTINE Chain_Node * _Chain_Last(Chain_Control *the_chain)
Return pointer to chain's last node.
Definition: chainimpl.h:400
size_t _Chain_Node_count_unprotected(const Chain_Control *chain)
Returns the node count of the chain.
Definition: chainnodecount.c:22
RTEMS_INLINE_ROUTINE bool _Chain_Is_last(const Chain_Node *the_node)
Is this the last node on the chain.
Definition: chainimpl.h:537
void _Chain_Insert(Chain_Node *after_node, Chain_Node *the_node)
Insert a node on a chain.
Definition: chaininsert.c:43
RTEMS_INLINE_ROUTINE bool rtems_chain_is_head(const rtems_chain_control *the_chain, const rtems_chain_node *the_node)
Is this node the chain head.
Definition: chain.h:526
RTEMS_INLINE_ROUTINE const Chain_Node * _Chain_Immutable_first(const Chain_Control *the_chain)
Return pointer to immutable chain's first node.
Definition: chainimpl.h:383
RTEMS_INLINE_ROUTINE Chain_Node * _Chain_Tail(Chain_Control *the_chain)
Return pointer to chain tail.
Definition: chainimpl.h:333
RTEMS_INLINE_ROUTINE const Chain_Node * _Chain_Immutable_next(const Chain_Node *the_node)
Return pointer the immutable next node from this node.
Definition: chainimpl.h:449
RTEMS_INLINE_ROUTINE const rtems_chain_node * rtems_chain_immutable_next(const rtems_chain_node *the_node)
Return pointer the immutable next node from this node.
Definition: chain.h:382
RTEMS_INLINE_ROUTINE void rtems_chain_extract(rtems_chain_node *the_node)
Extract the specified node from a chain.
Definition: chain.h:568
bool _Chain_Append_with_empty_check(Chain_Control *the_chain, Chain_Node *the_node)
Append a node and check if the chain was empty before.
Definition: chainappendempty.c:31
RTEMS_INLINE_ROUTINE Chain_Node * _Chain_First(Chain_Control *the_chain)
Return pointer to chain's first node.
Definition: chainimpl.h:366
RTEMS_INLINE_ROUTINE void _Chain_Insert_unprotected(Chain_Node *after_node, Chain_Node *the_node)
Insert a node (unprotected).
Definition: chainimpl.h:718
RTEMS_INLINE_ROUTINE bool rtems_chain_is_first(const rtems_chain_node *the_node)
Is this the first node on the chain.
Definition: chain.h:471
RTEMS_INLINE_ROUTINE bool rtems_chain_is_null_node(const rtems_chain_node *the_node)
Is the chain node pointer NULL.
Definition: chain.h:218
RTEMS_INLINE_ROUTINE void rtems_chain_insert(rtems_chain_node *after_node, rtems_chain_node *the_node)
Insert a node on a chain.
Definition: chain.h:641
bool _Chain_Get_with_empty_check(Chain_Control *the_chain, Chain_Node **the_node)
Get the first node and check if the chain is empty afterwards.
Definition: chaingetempty.c:31
RTEMS_INLINE_ROUTINE bool rtems_chain_are_nodes_equal(const rtems_chain_node *left, const rtems_chain_node *right)
Are Two nodes equal.
Definition: chain.h:433
RTEMS_INLINE_ROUTINE rtems_chain_node * rtems_chain_first(rtems_chain_control *the_chain)
Return pointer to Chain's First node after the permanent head.
Definition: chain.h:299
void _Chain_Append(Chain_Control *the_chain, Chain_Node *the_node)
Append a node on the end of a chain.
Definition: chainappend.c:41
RTEMS_INLINE_ROUTINE rtems_chain_node * rtems_chain_get(rtems_chain_control *the_chain)
Obtain the first node on a chain.
Definition: chain.h:608
RTEMS_INLINE_ROUTINE const rtems_chain_node * rtems_chain_immutable_last(const rtems_chain_control *the_chain)
Return pointer to immutable Chain's Last node.
Definition: chain.h:350
RTEMS_INLINE_ROUTINE bool rtems_chain_is_tail(const rtems_chain_control *the_chain, const rtems_chain_node *the_node)
Is this node the chain tail.
Definition: chain.h:546
RTEMS_INLINE_ROUTINE bool rtems_chain_is_empty(const rtems_chain_control *the_chain)
Is the chain empty.
Definition: chain.h:452
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(const Chain_Control *the_chain, const Chain_Node *the_node)
Is this node the chail tail.
Definition: chainimpl.h:598
RTEMS_INLINE_ROUTINE bool _Chain_Is_first(const Chain_Node *the_node)
Is this the first node on the chain.
Definition: chainimpl.h:519
RTEMS_INLINE_ROUTINE rtems_chain_node * rtems_chain_previous(rtems_chain_node *the_node)
Return pointer the previous node from this node.
Definition: chain.h:398
RTEMS_INLINE_ROUTINE void _Chain_Set_off_chain(Chain_Node *node)
Set off chain.
Definition: chainimpl.h:230
RTEMS_INLINE_ROUTINE bool _Chain_Is_null_node(const Chain_Node *the_node)
Is the chain node pointer NULL.
Definition: chainimpl.h:285
RTEMS_INLINE_ROUTINE void rtems_chain_append(rtems_chain_control *the_chain, rtems_chain_node *the_node)
Append a node on the end of a chain.
Definition: chain.h:675
RTEMS_INLINE_ROUTINE void rtems_chain_initialize(rtems_chain_control *the_chain, void *starting_address, size_t number_nodes, size_t node_size)
Initialize a chain Header.
Definition: chain.h:146
RTEMS_INLINE_ROUTINE const Chain_Node * _Chain_Immutable_tail(const Chain_Control *the_chain)
Return pointer to immutable chain tail.
Definition: chainimpl.h:349
RTEMS_INLINE_ROUTINE void rtems_chain_prepend(rtems_chain_control *the_chain, rtems_chain_node *the_node)
Prepend a node.
Definition: chain.h:717
RTEMS_INLINE_ROUTINE bool _Chain_Is_head(const Chain_Control *the_chain, const Chain_Node *the_node)
Is this node the chain head.
Definition: chainimpl.h:578
RTEMS_INLINE_ROUTINE const Chain_Node * _Chain_Immutable_last(const Chain_Control *the_chain)
Return pointer to immutable chain's last node.
Definition: chainimpl.h:417
RTEMS_INLINE_ROUTINE void _Chain_Prepend_unprotected(Chain_Control *the_chain, Chain_Node *the_node)
Prepend a node (unprotected).
Definition: chainimpl.h:787
RTEMS_INLINE_ROUTINE const rtems_chain_node * rtems_chain_immutable_previous(const rtems_chain_node *the_node)
Return pointer the immutable previous node from this node.
Definition: chain.h:414
RTEMS_INLINE_ROUTINE rtems_chain_node * rtems_chain_head(rtems_chain_control *the_chain)
Return pointer to Chain Head.
Definition: chain.h:234
RTEMS_INLINE_ROUTINE const rtems_chain_node * rtems_chain_immutable_head(const rtems_chain_control *the_chain)
Return pointer to immutable Chain Head.
Definition: chain.h:250