RTEMS  5.1
chain.h
Go to the documentation of this file.
1 
7 /*
8  * Copyright (c) 2010-2014 embedded brains GmbH.
9  *
10  * COPYRIGHT (c) 1989-2008.
11  * On-Line Applications Research Corporation (OAR).
12  *
13  * The license and distribution terms for this file may be
14  * found in the file LICENSE in this distribution or at
15  * http://www.rtems.org/license/LICENSE.
16  */
17 
18 #ifndef _RTEMS_CHAIN_H
19 #define _RTEMS_CHAIN_H
20 
21 #include <rtems/score/chainimpl.h>
22 #include <rtems/rtems/event.h>
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
38 
40 
44 #define RTEMS_CHAIN_INITIALIZER_EMPTY( name ) \
45  CHAIN_INITIALIZER_EMPTY( name )
46 
52 #define RTEMS_CHAIN_INITIALIZER_ONE_NODE( node ) \
53  CHAIN_INITIALIZER_ONE_NODE( node )
54 
60 #define RTEMS_CHAIN_NODE_INITIALIZER_ONE_NODE_CHAIN( chain ) \
61  CHAIN_NODE_INITIALIZER_ONE_NODE_CHAIN( chain )
62 
66 #define RTEMS_CHAIN_DEFINE_EMPTY( name ) \
67  rtems_chain_control name = RTEMS_CHAIN_INITIALIZER_EMPTY( name )
68 
79  rtems_chain_control *chain,
80  rtems_chain_node *node,
81  rtems_id task,
82  rtems_event_set events
83 );
84 
95  rtems_chain_control *chain,
96  rtems_chain_node *node,
97  rtems_id task,
98  rtems_event_set events
99 );
100 
111  rtems_chain_control *chain,
112  rtems_id task,
113  rtems_event_set events,
114  rtems_chain_node **node
115 );
116 
127  rtems_chain_control *chain,
128  rtems_event_set events,
129  rtems_interval timeout,
130  rtems_chain_node **node
131 );
132 
147  rtems_chain_control *the_chain,
148  void *starting_address,
149  size_t number_nodes,
150  size_t node_size
151 )
152 {
154  the_chain,
155  starting_address,
156  number_nodes,
157  node_size
158  );
159 }
160 
169  rtems_chain_control *the_chain
170 )
171 {
172  _Chain_Initialize_empty( the_chain );
173 }
174 
184  rtems_chain_node *node
185 )
186 {
187  _Chain_Set_off_chain( node );
188 }
189 
199  rtems_chain_node *node
200 )
201 {
202  _Chain_Initialize_node( node );
203 }
204 
217  const rtems_chain_node *node
218 )
219 {
220  return _Chain_Is_node_off_chain( node );
221 }
222 
234  const rtems_chain_node *the_node
235 )
236 {
237  return _Chain_Is_null_node( the_node );
238 }
239 
250  rtems_chain_control *the_chain
251 )
252 {
253  return _Chain_Head( the_chain );
254 }
255 
266  const rtems_chain_control *the_chain
267 )
268 {
269  return _Chain_Immutable_head( the_chain );
270 }
271 
282  rtems_chain_control *the_chain
283 )
284 {
285  return _Chain_Tail( the_chain );
286 }
287 
298  const rtems_chain_control *the_chain
299 )
300 {
301  return _Chain_Immutable_tail( the_chain );
302 }
303 
315  const rtems_chain_control *the_chain
316 )
317 {
318  return _Chain_First( the_chain );
319 }
320 
332  const rtems_chain_control *the_chain
333 )
334 {
335  return _Chain_Immutable_first( the_chain );
336 }
337 
349  const rtems_chain_control *the_chain
350 )
351 {
352  return _Chain_Last( the_chain );
353 }
354 
366  const rtems_chain_control *the_chain
367 )
368 {
369  return _Chain_Immutable_last( the_chain );
370 }
371 
382  const rtems_chain_node *the_node
383 )
384 {
385  return _Chain_Next( the_node );
386 }
387 
398  const rtems_chain_node *the_node
399 )
400 {
401  return _Chain_Immutable_next( the_node );
402 }
403 
414  const rtems_chain_node *the_node
415 )
416 {
417  return _Chain_Previous( the_node );
418 }
419 
430  const rtems_chain_node *the_node
431 )
432 {
433  return _Chain_Immutable_previous( the_node );
434 }
435 
449  const rtems_chain_node *left,
450  const rtems_chain_node *right
451 )
452 {
453  return _Chain_Are_nodes_equal( left, right );
454 }
455 
468  const rtems_chain_control *the_chain
469 )
470 {
471  return _Chain_Is_empty( the_chain );
472 }
473 
487  const rtems_chain_node *the_node
488 )
489 {
490  return _Chain_Is_first( the_node );
491 }
492 
505  const rtems_chain_node *the_node
506 )
507 {
508  return _Chain_Is_last( the_node );
509 }
510 
523  const rtems_chain_control *the_chain
524 )
525 {
526  return _Chain_Has_only_one_node( the_chain );
527 }
528 
542  const rtems_chain_control *the_chain,
543  const rtems_chain_node *the_node
544 )
545 {
546  return _Chain_Is_head( the_chain, the_node );
547 }
548 
562  const rtems_chain_control *the_chain,
563  const rtems_chain_node *the_node
564 )
565 {
566  return _Chain_Is_tail( the_chain, the_node );
567 }
568 
579  rtems_chain_node *the_node
580 );
581 
591  rtems_chain_node *the_node
592 )
593 {
594  _Chain_Extract_unprotected( the_node );
595 }
596 
610  rtems_chain_control *the_chain
611 );
612 
617  rtems_chain_control *the_chain
618 )
619 {
620  return _Chain_Get_unprotected( the_chain );
621 }
622 
627  rtems_chain_control *the_chain
628 )
629 {
630  return _Chain_Get_first_unprotected( the_chain );
631 }
632 
642 void rtems_chain_insert(
643  rtems_chain_node *after_node,
644  rtems_chain_node *the_node
645 );
646 
651  rtems_chain_node *after_node,
652  rtems_chain_node *the_node
653 )
654 {
655  _Chain_Insert_unprotected( after_node, the_node );
656 }
657 
666 void rtems_chain_append(
667  rtems_chain_control *the_chain,
668  rtems_chain_node *the_node
669 );
670 
680  rtems_chain_control *the_chain,
681  rtems_chain_node *the_node
682 )
683 {
684  _Chain_Append_unprotected( the_chain, the_node );
685 }
686 
699  rtems_chain_control *the_chain,
700  rtems_chain_node *the_node
701 );
702 
715  rtems_chain_control *the_chain,
716  rtems_chain_node *the_node
717 )
718 {
719  _Chain_Prepend_unprotected( the_chain, the_node );
720 }
721 
731  rtems_chain_control *chain,
732  rtems_chain_node *node
733 );
734 
744  rtems_chain_control *chain,
745  rtems_chain_node *node
746 );
747 
761  rtems_chain_control *chain,
762  rtems_chain_node **node
763 );
764 
776  const rtems_chain_control *chain
777 )
778 {
779  return _Chain_Node_count_unprotected( chain );
780 }
781 
784 #ifdef __cplusplus
785 }
786 #endif
787 
788 #endif
789 /* end of include file */
RTEMS_INLINE_ROUTINE rtems_chain_node * rtems_chain_tail(rtems_chain_control *the_chain)
Return pointer to Chain Tail.
Definition: chain.h:281
RTEMS_INLINE_ROUTINE void rtems_chain_initialize_node(rtems_chain_node *node)
Initializes a chain node.
Definition: chain.h:198
Definition: chain.h:68
RTEMS_INLINE_ROUTINE bool _Chain_Is_head(const Chain_Control *the_chain, const Chain_Node *the_node)
Checks if this node is the chain head.
Definition: chainimpl.h:470
RTEMS_INLINE_ROUTINE void _Chain_Extract_unprotected(Chain_Node *the_node)
Extracts this node (unprotected).
Definition: chainimpl.h:558
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:522
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 _Chain_Initialize_node(Chain_Node *the_node)
Initializes a chain node.
Definition: chainimpl.h:122
RTEMS_INLINE_ROUTINE void rtems_chain_extract_unprotected(rtems_chain_node *the_node)
Extract the specified node from a chain (unprotected).
Definition: chain.h:590
RTEMS_INLINE_ROUTINE Chain_Node * _Chain_Tail(Chain_Control *the_chain)
Returns pointer to chain tail.
Definition: chainimpl.h:227
RTEMS_INLINE_ROUTINE Chain_Node * _Chain_Next(const Chain_Node *the_node)
Returns pointer to the next node from this node.
Definition: chainimpl.h:327
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:297
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
Watchdog_Interval rtems_interval
Used to manage and manipulate intervals specified by clock ticks.
Definition: types.h:127
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: chainprotected.c:88
RTEMS_INLINE_ROUTINE Chain_Node * _Chain_Head(Chain_Control *the_chain)
Returns pointer to chain head.
Definition: chainimpl.h:195
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:331
RTEMS_INLINE_ROUTINE const Chain_Node * _Chain_Immutable_next(const Chain_Node *the_node)
Returns pointer to the immutable next node from this node.
Definition: chainimpl.h:343
RTEMS_INLINE_ROUTINE const Chain_Node * _Chain_Immutable_head(const Chain_Control *the_chain)
Returns pointer to immutable chain head.
Definition: chainimpl.h:211
RTEMS_INLINE_ROUTINE void _Chain_Set_off_chain(Chain_Node *node)
Sets off chain.
Definition: chainimpl.h:104
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(const Chain_Control *the_chain, const Chain_Node *the_node)
Checks if this node is the chain tail.
Definition: chainimpl.h:490
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:775
Definition: chain.h:86
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:504
Classic Event Manager API.
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(Chain_Control *the_chain)
Initializes this chain as empty.
Definition: chainimpl.h:505
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: chainprotected.c:103
RTEMS_INLINE_ROUTINE const Chain_Node * _Chain_Immutable_first(const Chain_Control *the_chain)
Returns pointer to immutable chain's first node.
Definition: chainimpl.h:277
void _Chain_Initialize(Chain_Control *the_chain, void *starting_address, size_t number_nodes, size_t node_size)
Initializes a chain header.
Definition: chain.c:26
size_t _Chain_Node_count_unprotected(const Chain_Control *chain)
Returns the node count of the chain.
Definition: chainnodecount.c:21
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:679
RTEMS_INLINE_ROUTINE rtems_chain_node * rtems_chain_next(const rtems_chain_node *the_node)
Return pointer the next node from this node.
Definition: chain.h:381
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(const Chain_Control *the_chain)
Checks if the chain is empty.
Definition: chainimpl.h:393
RTEMS_INLINE_ROUTINE rtems_chain_node * rtems_chain_get_unprotected(rtems_chain_control *the_chain)
See _Chain_Get_unprotected().
Definition: chain.h:616
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:650
RTEMS_INLINE_ROUTINE rtems_chain_node * rtems_chain_last(const rtems_chain_control *the_chain)
Return pointer to Chain's Last node before the permanent tail.
Definition: chain.h:348
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:714
RTEMS_INLINE_ROUTINE Chain_Node * _Chain_First(const Chain_Control *the_chain)
Returns pointer to chain's first node.
Definition: chainimpl.h:260
rtems_status_code
Classic API Status.
Definition: status.h:43
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_Are_nodes_equal(const Chain_Node *left, const Chain_Node *right)
Checks if two nodes are equal.
Definition: chainimpl.h:161
RTEMS_INLINE_ROUTINE bool rtems_chain_is_node_off_chain(const rtems_chain_node *node)
Is the node off chain.
Definition: chain.h:216
RTEMS_INLINE_ROUTINE bool _Chain_Is_last(const Chain_Node *the_node)
Checks if this is the last node on the chain.
Definition: chainimpl.h:432
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:40
RTEMS_INLINE_ROUTINE Chain_Node * _Chain_Get_first_unprotected(Chain_Control *the_chain)
Gets the first node (unprotected).
Definition: chainimpl.h:592
void rtems_chain_extract(rtems_chain_node *the_node)
Extract the specified node from a chain.
Definition: chainprotected.c:34
RTEMS_INLINE_ROUTINE const Chain_Node * _Chain_Immutable_tail(const Chain_Control *the_chain)
Returns pointer to immutable chain tail.
Definition: chainimpl.h:243
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: chainprotected.c:118
RTEMS_INLINE_ROUTINE bool _Chain_Has_only_one_node(const Chain_Control *the_chain)
Checks if this chain has only one node.
Definition: chainimpl.h:450
void rtems_chain_prepend(rtems_chain_control *the_chain, rtems_chain_node *the_node)
Prepend a node.
Definition: chainprotected.c:76
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:541
RTEMS_INLINE_ROUTINE const Chain_Node * _Chain_Immutable_previous(const Chain_Node *the_node)
Returns pointer to the immutable previous node from this node.
Definition: chainimpl.h:375
RTEMS_INLINE_ROUTINE void _Chain_Insert_unprotected(Chain_Node *after_node, Chain_Node *the_node)
Inserts a node (unprotected).
Definition: chainimpl.h:653
RTEMS_INLINE_ROUTINE rtems_chain_node * rtems_chain_previous(const rtems_chain_node *the_node)
Return pointer the previous node from this node.
Definition: chain.h:413
Chain Handler API.
RTEMS_INLINE_ROUTINE Chain_Node * _Chain_Last(const Chain_Control *the_chain)
Returns pointer to chain's last node.
Definition: chainimpl.h:294
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:397
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:486
RTEMS_INLINE_ROUTINE Chain_Node * _Chain_Previous(const Chain_Node *the_node)
Returns pointer to the previous node from this node.
Definition: chainimpl.h:359
RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected(Chain_Control *the_chain, Chain_Node *the_node)
Appends a node (unprotected).
Definition: chainimpl.h:680
rtems_chain_node * rtems_chain_get(rtems_chain_control *the_chain)
Obtain the first node on a chain.
Definition: chainprotected.c:43
RTEMS_INLINE_ROUTINE bool rtems_chain_is_null_node(const rtems_chain_node *the_node)
Is the chain node pointer NULL.
Definition: chain.h:233
RTEMS_INLINE_ROUTINE bool _Chain_Is_first(const Chain_Node *the_node)
Checks if this is the first node on the chain.
Definition: chainimpl.h:413
RTEMS_INLINE_ROUTINE bool _Chain_Is_null_node(const Chain_Node *the_node)
Checks if the chain node pointer is NULL.
Definition: chainimpl.h:179
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:448
void rtems_chain_append(rtems_chain_control *the_chain, rtems_chain_node *the_node)
Append a node on the end of a chain.
Definition: chainprotected.c:64
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:365
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:561
RTEMS_INLINE_ROUTINE bool rtems_chain_is_empty(const rtems_chain_control *the_chain)
Is the chain empty.
Definition: chain.h:467
Objects_Id rtems_id
Used to manage and manipulate RTEMS object identifiers.
Definition: types.h:83
RTEMS_INLINE_ROUTINE const Chain_Node * _Chain_Immutable_last(const Chain_Control *the_chain)
Returns pointer to immutable chain's last node.
Definition: chainimpl.h:311
void rtems_chain_insert(rtems_chain_node *after_node, rtems_chain_node *the_node)
Insert a node on a chain.
Definition: chainprotected.c:55
RTEMS_INLINE_ROUTINE bool _Chain_Is_node_off_chain(const Chain_Node *node)
Checks if the node is off chain.
Definition: chainimpl.h:142
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 Chain_Node * _Chain_Get_unprotected(Chain_Control *the_chain)
Gets the first node (unprotected).
Definition: chainimpl.h:630
RTEMS_INLINE_ROUTINE void _Chain_Prepend_unprotected(Chain_Control *the_chain, Chain_Node *the_node)
Prepends a node (unprotected).
Definition: chainimpl.h:732
RTEMS_INLINE_ROUTINE rtems_chain_node * rtems_chain_get_first_unprotected(rtems_chain_control *the_chain)
See _Chain_Get_first_unprotected().
Definition: chain.h:626
#define RTEMS_INLINE_ROUTINE
Definition: basedefs.h:66
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:429
RTEMS_INLINE_ROUTINE rtems_chain_node * rtems_chain_head(rtems_chain_control *the_chain)
Return pointer to Chain Head.
Definition: chain.h:249
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:265
RTEMS_INLINE_ROUTINE rtems_chain_node * rtems_chain_first(const rtems_chain_control *the_chain)
Return pointer to Chain's First node after the permanent head.
Definition: chain.h:314