-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathrtems-chain.h
102 lines (91 loc) · 2.54 KB
/
rtems-chain.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/**
* @file
*
* @ingroup ScoreChain
*
* @brief Chain Handler API
*/
/*
* Copyright (c) 2010 embedded brains GmbH.
*
* COPYRIGHT (c) 1989-2006.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.org/license/LICENSE.
*/
#ifndef _RTEMS_SCORE_CHAIN_H
#define _RTEMS_SCORE_CHAIN_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* @defgroup ScoreChain Chain Handler
*
* @ingroup Score
*
* The Chain Handler is used to manage sets of entities. This handler
* provides two data structures. The Chain Node data structure is included
* as the first part of every data structure that will be placed on
* a chain. The second data structure is Chain Control which is used
* to manage a set of Chain Nodes.
*/
/**@{*/
/**
* @typedef Chain_Node
*
* This type definition promotes the name for the Chain Node used by
* all RTEMS code. It is a separate type definition because a forward
* reference is required to define it. See @ref Chain_Node_struct for
* detailed information.
*/
typedef struct Chain_Node_struct Chain_Node;
/**
* @struct Chain_Node_struct
*
* This is used to manage each element (node) which is placed
* on a chain.
*
* @note Typically, a more complicated structure will use the
* chain package. The more complicated structure will
* include a chain node as the first element in its
* control structure. It will then call the chain package
* with a pointer to that node element. The node pointer
* and the higher level structure start at the same address
* so the user can cast the pointers back and forth.
*
*/
struct Chain_Node_struct {
/** This points to the node after this one on this chain. */
Chain_Node *next;
/** This points to the node immediate prior to this one on this chain. */
Chain_Node *previous;
};
/**
* @struct Chain_Control
*
* This is used to manage a chain. A chain consists of a doubly
* linked list of zero or more nodes.
*
* @note This implementation does not require special checks for
* manipulating the first and last elements on the chain.
* To accomplish this the @a Chain_Control structure is
* treated as two overlapping @ref Chain_Node structures.
*/
typedef union {
struct {
Chain_Node Node;
Chain_Node *fill;
} Head;
struct {
Chain_Node *fill;
Chain_Node Node;
} Tail;
} Chain_Control;
/**@}*/
#ifdef __cplusplus
}
#endif
#endif
/* end of include file */