summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/include/rtems/posix/priorityimpl.h
blob: e3f23e748d1681f1ccee12d305a63a90c23967b8 (plain) (blame)
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
/**
 * @file
 * 
 * @brief POSIX Priority Support
 *
 * This include file defines the interface to the POSIX priority
 * implementation.
 */

/*
 *  COPYRIGHT (c) 1989-2011.
 *  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_POSIX_PRIORITYIMPL_H
#define _RTEMS_POSIX_PRIORITYIMPL_H

#include <rtems/score/scheduler.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @defgroup POSIX_PRIORITY POSIX Priority Support
 *
 * @ingroup POSIXAPI
 *
 * @brief Interface to the POSIX Priority Implementation
 * 
 */
/**@{**/

/**
 * 1003.1b-1993,2.2.2.80 definition of priority, p. 19
 *
 * "Numerically higher values represent higher priorities."
 *
 * Thus, RTEMS Core has priorities run in the opposite sense of the POSIX API.
 *
 * There are only 254 posix priority levels since a task at priority level
 * 255 would never run because of the RTEMS idle task.  This is necessary
 * because GNAT maps the lowest Ada task priority to the lowest thread
 * priority.  The lowest priority Ada task should get to run, so there is
 * a fundamental conflict with having 255 priorities.
 *
 * But since RTEMS can be configured with fewer than 256 priorities,
 * we use the internal constant.
 */
#define POSIX_SCHEDULER_MAXIMUM_PRIORITY (PRIORITY_MAXIMUM - 1)


/**
 *  This is the numerically least important POSIX priority.
 */
#define POSIX_SCHEDULER_MINIMUM_PRIORITY (1)

/**
 * @brief Gets the maximum POSIX API priority for this scheduler instance.
 *
 * Such a priority is valid.  A scheduler instance may support priority values
 * that are not representable as an integer.
 *
 * @return The maximum POSIX API priority for this scheduler instance.
 */
int _POSIX_Priority_Get_maximum( const Scheduler_Control *scheduler );

/**
 * @brief Check if POSIX priority is valid.
 * 
 * 1003.1b-1993,2.2.2.80 definition of priority, p. 19
 *
 * "Numerically higher values represent higher priorities."
 *
 * Thus, RTEMS Core has priorities run in the opposite sense of the POSIX API.
 *
 * @param[in] priority is the priority to test
 *
 * @retval TRUE The priority is valid.
 * @retval FALSE The priority is invalid.
 */
bool _POSIX_Priority_Is_valid(
  int priority
);

/**
 * @brief Convert POSIX priority to SuperCore priority.
 *
 * This method converts a POSIX API priority into onto the corresponding
 * SuperCore value.
 *
 * @param[in] priority is the POSIX API priority.
 *
 * @return This method returns the corresponding SuperCore priority.
 */
RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
  int priority
)
{
  return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
}

/**
 * @brief Convert SuperCore priority To POSIX priority.
 *
 * This method converts a SuperCore priority into onto the corresponding
 * POSIX API value.
 *
 * @param[in] priority is the POSIX API priority.
 *
 * @return This method returns the corresponding POSIX priority.
 */
RTEMS_INLINE_ROUTINE int _POSIX_Priority_From_core(
  Priority_Control priority
)
{
  return (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
}

/** @} */

#ifdef __cplusplus
}
#endif

#endif