summaryrefslogtreecommitdiff
path: root/cpukit/score/include/rtems/score/resourceimpl.h
blob: 69e9a3c5f84abd1914df3dc99f5ea04d3867cd82 (plain)
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/*
 * Copyright (c) 2014 embedded brains GmbH.  All rights reserved.
 *
 *  embedded brains GmbH
 *  Dornierstr. 4
 *  82178 Puchheim
 *  Germany
 *  <rtems@embedded-brains.de>
 *
 * 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_RESOURCEIMPL_H
#define _RTEMS_SCORE_RESOURCEIMPL_H

#include <rtems/score/resource.h>
#include <rtems/score/chainimpl.h>

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @addtogroup ScoreResource
 *
 * @{
 */

/**
 * @brief Visitor function for resource node iteration.
 *
 * The visitor is allowed to extract the node.
 *
 * @param[in] node The current resource node.
 * @param[in] arg The argument passed to _Resource_Iterate().
 *
 * @retval true Stop the iteration.
 * @retval false Continue the iteration.
 */
typedef bool (*Resource_Node_visitor)( Resource_Node *node, void *arg );

/**
 * @brief Iterates over all nodes of a resource dependency tree.
 *
 * @param[in] top The top node to start the iteration.  The visitor function is
 * not invoked for the top node.
 * @param[in] visitor The visitor function.
 * @param[in] arg The argument for the visitor function.
 */
void _Resource_Iterate(
  Resource_Node         *top,
  Resource_Node_visitor  visitor,
  void                  *arg
);

RTEMS_INLINE_ROUTINE void _Resource_Node_initialize( Resource_Node *node )
{
  node->dependency = NULL;
  node->root = node;
  _Chain_Initialize_empty( &node->Resources );
}

RTEMS_INLINE_ROUTINE void _Resource_Node_set_dependency(
  Resource_Node    *node,
  Resource_Control *dependency
)
{
  node->dependency = dependency;
}

RTEMS_INLINE_ROUTINE Resource_Node *_Resource_Node_get_root(
  const Resource_Node *node
)
{
  return node->root;
}

RTEMS_INLINE_ROUTINE void _Resource_Node_set_root(
  Resource_Node *node,
  Resource_Node *root
)
{
  node->root = root;
}

RTEMS_INLINE_ROUTINE bool _Resource_Node_owns_resources( const Resource_Node *node )
{
  return !_Chain_Is_empty( &node->Resources );
}

RTEMS_INLINE_ROUTINE void _Resource_Node_add_resource(
  Resource_Node    *node,
  Resource_Control *resource
)
{
  _Chain_Prepend_unprotected( &node->Resources, &resource->Node );
}

RTEMS_INLINE_ROUTINE void _Resource_Node_extract( Resource_Node *node )
{
  _Chain_Extract_unprotected( &node->Node );
}

RTEMS_INLINE_ROUTINE void _Resource_Initialize( Resource_Control *resource )
{
  resource->owner = NULL;
  _Chain_Initialize_empty( &resource->Rivals );
}

RTEMS_INLINE_ROUTINE void _Resource_Add_rival(
  Resource_Control *resource,
  Resource_Node    *node
)
{
  _Chain_Append_unprotected( &resource->Rivals, &node->Node );
}

RTEMS_INLINE_ROUTINE void _Resource_Extract( Resource_Control *resource )
{
  _Chain_Extract_unprotected( &resource->Node );
}

RTEMS_INLINE_ROUTINE Resource_Node *_Resource_Get_owner(
  const Resource_Control *resource
)
{
  return resource->owner;
}

RTEMS_INLINE_ROUTINE void _Resource_Set_owner(
  Resource_Control *resource,
  Resource_Node    *owner
)
{
  resource->owner = owner;
}

/**
 * @brief Returns true if this is the most recently obtained resource of the
 * node, and false otherwise.
 *
 * Resources are organized in last in first out order (LIFO).
 *
 * @param[in] resource The resource in question.
 * @param[in] node The node that obtained the resource.
 */
RTEMS_INLINE_ROUTINE bool _Resource_Is_most_recently_obtained(
  const Resource_Control *resource,
  const Resource_Node    *node
)
{
  return &resource->Node == _Chain_Immutable_first( &node->Resources );
}

/** @} */

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* _RTEMS_SCORE_RESOURCEIMPL_H */